Mercurial > dwindows
comparison gtk/dw.c @ 22:6a246b3bb14f
Added tree widgets, fixed some delete event processing, fixed a layout bug
on OS/2 and Win32. Added another function to compat to deal with MSVC
runtime library conflicts.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 02 Aug 2001 09:57:21 +0000 |
parents | 3e5bff3e55ff |
children | b1d7e8a28dfa |
comparison
equal
deleted
inserted
replaced
21:c6e76b796b28 | 22:6a246b3bb14f |
---|---|
48 }; | 48 }; |
49 | 49 |
50 GdkColor _foreground = { 0, 0x0000, 0x0000, 0x0000 }; | 50 GdkColor _foreground = { 0, 0x0000, 0x0000, 0x0000 }; |
51 GdkColor _background = { 0, 0xaaaa, 0xaaaa, 0xaaaa }; | 51 GdkColor _background = { 0, 0xaaaa, 0xaaaa, 0xaaaa }; |
52 | 52 |
53 char *_dw_browse_file = NULL; | 53 int _dw_file_active = 0, _dw_ignore_click = 0; |
54 int _dw_file_active = 0, _dw_file_ready = 0, _dw_ignore_click = 0; | |
55 pthread_t _dw_thread = (pthread_t)-1; | 54 pthread_t _dw_thread = (pthread_t)-1; |
56 int _dw_mutex_locked = FALSE; | 55 int _dw_mutex_locked = FALSE; |
57 | 56 |
58 #define DW_MUTEX_LOCK { if(pthread_self() != _dw_thread && _dw_mutex_locked == FALSE) { gdk_threads_enter(); _dw_mutex_locked = TRUE; _locked_by_me = TRUE; } } | 57 #define DW_MUTEX_LOCK { if(pthread_self() != _dw_thread && _dw_mutex_locked == FALSE) { gdk_threads_enter(); _dw_mutex_locked = TRUE; _locked_by_me = TRUE; } } |
59 #define DW_MUTEX_UNLOCK { if(pthread_self() != _dw_thread && _locked_by_me == TRUE) { gdk_threads_leave(); _dw_mutex_locked = FALSE; _locked_by_me = FALSE; } } | 58 #define DW_MUTEX_UNLOCK { if(pthread_self() != _dw_thread && _locked_by_me == TRUE) { gdk_threads_leave(); _dw_mutex_locked = FALSE; _locked_by_me = FALSE; } } |
607 DW_MUTEX_UNLOCK; | 606 DW_MUTEX_UNLOCK; |
608 | 607 |
609 return strlen(outbuf); | 608 return strlen(outbuf); |
610 } | 609 } |
611 | 610 |
611 void _dw_yes_func(HWND window, void *data) | |
612 { | |
613 DWDialog *dwwait = (DWDialog *)data; | |
614 | |
615 if(!dwwait) | |
616 return; | |
617 | |
618 dw_window_destroy((HWND)dwwait->data); | |
619 dw_dialog_dismiss((DWDialog *)data, (void *)1); | |
620 } | |
621 | |
622 void _dw_no_func(HWND window, void *data) | |
623 { | |
624 DWDialog *dwwait = (DWDialog *)data; | |
625 | |
626 if(!dwwait) | |
627 return; | |
628 | |
629 dw_window_destroy((HWND)dwwait->data); | |
630 dw_dialog_dismiss((DWDialog *)data, (void *)0); | |
631 } | |
632 | |
612 /* | 633 /* |
613 * Displays a Message Box with given text and title.. | 634 * Displays a Message Box with given text and title.. |
614 * Parameters: | 635 * Parameters: |
615 * title: The title of the message box. | 636 * title: The title of the message box. |
616 * text: The text to display in the box. | 637 * text: The text to display in the box. |
617 * Returns: | 638 * Returns: |
618 * True if YES False of NO. | 639 * True if YES False of NO. |
619 */ | 640 */ |
620 int dw_yesno(char *title, char *text) | 641 int dw_yesno(char *title, char *text) |
621 { | 642 { |
622 return FALSE; | 643 HWND entrywindow, mainbox, nobutton, yesbutton, buttonbox, stext; |
644 ULONG flStyle = DW_FCF_TITLEBAR | DW_FCF_SHELLPOSITION | DW_FCF_DLGBORDER; | |
645 DWDialog *dwwait; | |
646 | |
647 entrywindow = dw_window_new(HWND_DESKTOP, title, flStyle); | |
648 | |
649 mainbox = dw_box_new(BOXVERT, 10); | |
650 | |
651 dw_box_pack_start(entrywindow, mainbox, 0, 0, TRUE, TRUE, 0); | |
652 | |
653 /* Archive Name */ | |
654 stext = dw_text_new(text, 0); | |
655 | |
656 dw_box_pack_start(mainbox, stext, 130, 20, TRUE, TRUE, 2); | |
657 | |
658 /* Buttons */ | |
659 buttonbox = dw_box_new(BOXHORZ, 10); | |
660 | |
661 dw_box_pack_start(mainbox, buttonbox, 0, 0, TRUE, TRUE, 0); | |
662 | |
663 yesbutton = dw_button_new("Yes", 1001L); | |
664 | |
665 dw_box_pack_start(buttonbox, yesbutton, 130, 30, TRUE, TRUE, 2); | |
666 | |
667 nobutton = dw_button_new("No", 1002L); | |
668 | |
669 dw_box_pack_start(buttonbox, nobutton, 130, 30, TRUE, TRUE, 2); | |
670 | |
671 dwwait = dw_dialog_new((void *)entrywindow); | |
672 | |
673 dw_signal_connect(yesbutton, "clicked", DW_SIGNAL_FUNC(_dw_yes_func), (void *)dwwait); | |
674 dw_signal_connect(nobutton, "clicked", DW_SIGNAL_FUNC(_dw_no_func), (void *)dwwait); | |
675 | |
676 dw_window_set_usize(entrywindow, 340, 150); | |
677 | |
678 dw_window_show(entrywindow); | |
679 | |
680 return (int)dw_dialog_wait(dwwait);; | |
623 } | 681 } |
624 | 682 |
625 /* | 683 /* |
626 * Minimizes or Iconifies a top-level window. | 684 * Minimizes or Iconifies a top-level window. |
627 * Parameters: | 685 * Parameters: |
906 int _locked_by_me = FALSE; | 964 int _locked_by_me = FALSE; |
907 | 965 |
908 DW_MUTEX_LOCK; | 966 DW_MUTEX_LOCK; |
909 gdk_pointer_grab(handle->window, TRUE, GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME); | 967 gdk_pointer_grab(handle->window, TRUE, GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME); |
910 DW_MUTEX_UNLOCK; | 968 DW_MUTEX_UNLOCK; |
969 } | |
970 | |
971 /* | |
972 * Changes the appearance of the mouse pointer. | |
973 * Parameters: | |
974 * handle: Handle to widget for which to change. | |
975 * cursortype: ID of the pointer you want. | |
976 */ | |
977 void dw_window_pointer(HWND handle, int pointertype) | |
978 { | |
979 GdkCursor *cursor = gdk_cursor_new(pointertype); | |
980 gdk_window_set_cursor(handle->window, cursor); | |
981 gdk_cursor_destroy(cursor); | |
911 } | 982 } |
912 | 983 |
913 /* | 984 /* |
914 * Releases previous mouse capture. | 985 * Releases previous mouse capture. |
915 */ | 986 */ |
1383 DW_MUTEX_UNLOCK; | 1454 DW_MUTEX_UNLOCK; |
1384 return tmp; | 1455 return tmp; |
1385 } | 1456 } |
1386 | 1457 |
1387 /* | 1458 /* |
1459 * Create a tree object to be packed. | |
1460 * Parameters: | |
1461 * id: An ID to be used for getting the resource from the | |
1462 * resource file. | |
1463 */ | |
1464 HWND dw_tree_new(ULONG id) | |
1465 { | |
1466 GtkWidget *tmp, *tree; | |
1467 int _locked_by_me = FALSE; | |
1468 | |
1469 DW_MUTEX_LOCK; | |
1470 tmp = gtk_scrolled_window_new(NULL, NULL); | |
1471 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (tmp), | |
1472 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); | |
1473 | |
1474 gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id); | |
1475 gtk_widget_show(tmp); | |
1476 tree = gtk_tree_new(); | |
1477 if(!tree) | |
1478 { | |
1479 gtk_widget_destroy(tmp); | |
1480 DW_MUTEX_UNLOCK; | |
1481 return FALSE; | |
1482 } | |
1483 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tmp), tree); | |
1484 /* Set the selection mode */ | |
1485 gtk_tree_set_selection_mode (GTK_TREE(tree), GTK_SELECTION_SINGLE); | |
1486 | |
1487 gtk_object_set_user_data(GTK_OBJECT(tmp), (gpointer)tree); | |
1488 gtk_widget_show(tree); | |
1489 | |
1490 DW_MUTEX_UNLOCK; | |
1491 return tmp; | |
1492 } | |
1493 | |
1494 | |
1495 /* | |
1388 * Create a new static text window (widget) to be packed. | 1496 * Create a new static text window (widget) to be packed. |
1389 * Parameters: | 1497 * Parameters: |
1390 * text: The text to be display by the static text widget. | 1498 * text: The text to be display by the static text widget. |
1391 * id: An ID to be used with WinWindowFromID() or 0L. | 1499 * id: An ID to be used with WinWindowFromID() or 0L. |
1392 */ | 1500 */ |
2290 DW_MUTEX_LOCK; | 2398 DW_MUTEX_LOCK; |
2291 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(handle), value); | 2399 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(handle), value); |
2292 DW_MUTEX_UNLOCK; | 2400 DW_MUTEX_UNLOCK; |
2293 } | 2401 } |
2294 | 2402 |
2403 /* | |
2404 * Inserts an item into a tree window (widget). | |
2405 * Parameters: | |
2406 * handle: Handle to the tree to be inserted. | |
2407 * title: The text title of the entry. | |
2408 * icon: Handle to coresponding icon. | |
2409 * parent: Parent handle or 0 if root. | |
2410 */ | |
2411 HWND dw_tree_insert(HWND handle, char *title, unsigned long icon, HWND parent) | |
2412 { | |
2413 GtkWidget *item, *tree, *subtree, *label, *hbox, *pixmap; | |
2414 GdkPixmap *gdkpix; | |
2415 GdkBitmap *gdkbmp; | |
2416 int _locked_by_me = FALSE; | |
2417 | |
2418 DW_MUTEX_LOCK; | |
2419 tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle)); | |
2420 if(!tree || !GTK_IS_TREE(tree)) | |
2421 { | |
2422 DW_MUTEX_UNLOCK; | |
2423 return NULL; | |
2424 } | |
2425 item = gtk_tree_item_new(); | |
2426 label = gtk_label_new(title); | |
2427 hbox = gtk_hbox_new(FALSE, 2); | |
2428 gdkpix = _find_pixmap(&gdkbmp, icon, hbox); | |
2429 pixmap = gtk_pixmap_new(gdkpix, gdkbmp); | |
2430 gtk_container_add(GTK_CONTAINER(item), hbox); | |
2431 gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, TRUE, 0); | |
2432 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); | |
2433 gtk_widget_show(label); | |
2434 gtk_widget_show(pixmap); | |
2435 gtk_widget_show(hbox); | |
2436 | |
2437 if(parent) | |
2438 { | |
2439 subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent)); | |
2440 if(!subtree) | |
2441 { | |
2442 subtree = gtk_tree_new(); | |
2443 gtk_object_set_user_data(GTK_OBJECT(parent), subtree); | |
2444 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); | |
2445 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); | |
2446 gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree); | |
2447 gtk_widget_show(subtree); | |
2448 } | |
2449 gtk_tree_append(GTK_TREE(subtree), item); | |
2450 } | |
2451 else | |
2452 gtk_tree_append(GTK_TREE(tree), item); | |
2453 gtk_widget_show(item); | |
2454 DW_MUTEX_UNLOCK; | |
2455 return item; | |
2456 } | |
2457 | |
2295 int _dw_container_setup(HWND handle, unsigned long *flags, char **titles, int count, int separator, int extra) | 2458 int _dw_container_setup(HWND handle, unsigned long *flags, char **titles, int count, int separator, int extra) |
2296 { | 2459 { |
2297 GtkWidget *clist; | 2460 GtkWidget *clist; |
2298 char numbuf[10]; | 2461 char numbuf[10]; |
2299 int z; | 2462 int z; |
2544 { | 2707 { |
2545 dw_container_set_item(handle, pointer, column + 2, row, data); | 2708 dw_container_set_item(handle, pointer, column + 2, row, data); |
2546 } | 2709 } |
2547 | 2710 |
2548 /* | 2711 /* |
2712 * Sets the width of a column in the container. | |
2713 * Parameters: | |
2714 * handle: Handle to window (widget) of container. | |
2715 * column: Zero based column of width being set. | |
2716 * width: Width of column in pixels. | |
2717 */ | |
2718 void dw_container_set_column_width(HWND handle, int column, int width) | |
2719 { | |
2720 GtkWidget *clist; | |
2721 int _locked_by_me = FALSE; | |
2722 | |
2723 DW_MUTEX_LOCK; | |
2724 clist = gtk_object_get_user_data(GTK_OBJECT(handle)); | |
2725 | |
2726 if(clist && GTK_IS_CLIST(clist)) | |
2727 gtk_clist_set_column_width(GTK_CLIST(clist), column, width); | |
2728 DW_MUTEX_UNLOCK; | |
2729 } | |
2730 | |
2731 /* | |
2549 * Sets the title of a row in the container. | 2732 * Sets the title of a row in the container. |
2550 * Parameters: | 2733 * Parameters: |
2551 * pointer: Pointer to the allocated memory in dw_container_alloc(). | 2734 * pointer: Pointer to the allocated memory in dw_container_alloc(). |
2552 * row: Zero based row of data being set. | 2735 * row: Zero based row of data being set. |
2553 * title: String title of the item. | 2736 * title: String title of the item. |
2580 DW_MUTEX_LOCK; | 2763 DW_MUTEX_LOCK; |
2581 clist = gtk_object_get_user_data(GTK_OBJECT(handle)); | 2764 clist = gtk_object_get_user_data(GTK_OBJECT(handle)); |
2582 | 2765 |
2583 if(clist && GTK_IS_CLIST(clist)) | 2766 if(clist && GTK_IS_CLIST(clist)) |
2584 gtk_clist_thaw(GTK_CLIST(clist)); | 2767 gtk_clist_thaw(GTK_CLIST(clist)); |
2768 DW_MUTEX_UNLOCK; | |
2769 } | |
2770 | |
2771 /* | |
2772 * Removes the first x rows from a container. | |
2773 * Parameters: | |
2774 * handle: Handle to the window (widget) to be deleted from. | |
2775 * rowcount: The number of rows to be deleted. | |
2776 */ | |
2777 void dw_container_delete(HWND handle, int rowcount) | |
2778 { | |
2779 GtkWidget *clist; | |
2780 GList *list; | |
2781 int _locked_by_me = FALSE; | |
2782 | |
2783 DW_MUTEX_LOCK; | |
2784 clist = (GtkWidget*)gtk_object_get_user_data(GTK_OBJECT(handle)); | |
2785 if(clist && GTK_IS_CLIST(clist)) | |
2786 { | |
2787 int rows, z; | |
2788 | |
2789 list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "selectlist"); | |
2790 rows = (int)gtk_object_get_data(GTK_OBJECT(clist), "rowcount"); | |
2791 g_list_free(list); | |
2792 | |
2793 for(z=0;z<rowcount;z++) | |
2794 gtk_clist_remove(GTK_CLIST(clist), 0); | |
2795 | |
2796 if(rows - rowcount < 0) | |
2797 rows = 0; | |
2798 else | |
2799 rows -= rowcount; | |
2800 | |
2801 gtk_object_set_data(GTK_OBJECT(clist), "selectlist", NULL); | |
2802 gtk_object_set_data(GTK_OBJECT(clist), "rowcount", (gpointer)rows); | |
2803 } | |
2585 DW_MUTEX_UNLOCK; | 2804 DW_MUTEX_UNLOCK; |
2586 } | 2805 } |
2587 | 2806 |
2588 /* | 2807 /* |
2589 * Removes all rows from a container. | 2808 * Removes all rows from a container. |
2614 * Parameters: | 2833 * Parameters: |
2615 * handle: Handle to the window (widget) to be cleared. | 2834 * handle: Handle to the window (widget) to be cleared. |
2616 */ | 2835 */ |
2617 void dw_container_set_view(HWND handle, unsigned long flags, int iconwidth, int iconheight) | 2836 void dw_container_set_view(HWND handle, unsigned long flags, int iconwidth, int iconheight) |
2618 { | 2837 { |
2838 } | |
2839 | |
2840 /* | |
2841 * Scrolls container up or down. | |
2842 * Parameters: | |
2843 * handle: Handle to the window (widget) to be scrolled. | |
2844 * direction: DW_SCROLL_UP, DW_SCROLL_DOWN, DW_SCROLL_TOP or | |
2845 * DW_SCROLL_BOTTOM. (rows is ignored for last two) | |
2846 * rows: The number of rows to be scrolled. | |
2847 */ | |
2848 void dw_container_scroll(HWND handle, int direction, long rows) | |
2849 { | |
2850 GtkAdjustment *adj; | |
2851 GtkWidget *clist; | |
2852 int _locked_by_me = FALSE; | |
2853 | |
2854 DW_MUTEX_LOCK; | |
2855 clist = (GtkWidget*)gtk_object_get_user_data(GTK_OBJECT(handle)); | |
2856 if(clist && GTK_IS_CLIST(clist)) | |
2857 { | |
2858 adj = gtk_clist_get_vadjustment(GTK_CLIST(clist)); | |
2859 if(adj) | |
2860 { | |
2861 switch(direction) | |
2862 { | |
2863 case DW_SCROLL_TOP: | |
2864 adj->value = adj->lower; | |
2865 break; | |
2866 case DW_SCROLL_BOTTOM: | |
2867 adj->value = adj->upper; | |
2868 break; | |
2869 } | |
2870 gtk_clist_set_vadjustment(GTK_CLIST(clist), adj); | |
2871 } | |
2872 } | |
2873 DW_MUTEX_UNLOCK; | |
2619 } | 2874 } |
2620 | 2875 |
2621 /* | 2876 /* |
2622 * Starts a new query of a container. | 2877 * Starts a new query of a container. |
2623 * Parameters: | 2878 * Parameters: |
4128 env->MajorVersion = atoi(tempbuf); | 4383 env->MajorVersion = atoi(tempbuf); |
4129 env->MinorVersion = 0; | 4384 env->MinorVersion = 0; |
4130 } | 4385 } |
4131 | 4386 |
4132 /* Internal function to handle the file OK press */ | 4387 /* Internal function to handle the file OK press */ |
4133 void _gtk_file_ok(GtkWidget *widget, GtkWidget *window) | 4388 void _gtk_file_ok(GtkWidget *widget, DWDialog *dwwait) |
4134 { | 4389 { |
4135 char *tmp; | 4390 char *tmp; |
4136 | 4391 |
4137 tmp = gtk_file_selection_get_filename(GTK_FILE_SELECTION(window)); | 4392 if(!dwwait) |
4138 if(tmp) | 4393 return; |
4139 _dw_browse_file = strdup(tmp); | 4394 |
4140 gtk_widget_destroy(GTK_WIDGET(window)); | 4395 tmp = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dwwait->data)); |
4141 if(pthread_self() == _dw_thread) | 4396 gtk_widget_destroy(GTK_WIDGET(dwwait->data)); |
4142 gtk_main_quit(); | 4397 _dw_file_active = 0; |
4143 _dw_file_ready = 1; | 4398 dw_dialog_dismiss(dwwait, (void *)(tmp ? strdup(tmp) : NULL)); |
4144 } | 4399 } |
4145 | 4400 |
4146 /* Internal function to handle the file Cancel press */ | 4401 /* Internal function to handle the file Cancel press */ |
4147 void _gtk_file_cancel(GtkWidget *widget, GtkWidget *window) | 4402 void _gtk_file_cancel(GtkWidget *widget, DWDialog *dwwait) |
4148 { | 4403 { |
4149 gtk_widget_destroy(GTK_WIDGET(window)); | 4404 if(!dwwait) |
4150 if(pthread_self() == _dw_thread) | 4405 return; |
4151 gtk_main_quit(); | 4406 |
4152 _dw_file_ready = 1; | 4407 gtk_widget_destroy(GTK_WIDGET(dwwait->data)); |
4153 | 4408 _dw_file_active = 0; |
4409 dw_dialog_dismiss(dwwait, NULL); | |
4154 } | 4410 } |
4155 | 4411 |
4156 /* | 4412 /* |
4157 * Opens a file dialog and queries user selection. | 4413 * Opens a file dialog and queries user selection. |
4158 * Parameters: | 4414 * Parameters: |
4166 * | 4422 * |
4167 */ | 4423 */ |
4168 char *dw_file_browse(char *title, char *defpath, char *ext, int flags) | 4424 char *dw_file_browse(char *title, char *defpath, char *ext, int flags) |
4169 { | 4425 { |
4170 GtkWidget *filew; | 4426 GtkWidget *filew; |
4171 char *tmpvar; | 4427 int _locked_by_me = FALSE; |
4172 int _locked_by_me = FALSE; | 4428 DWDialog *dwwait; |
4173 | 4429 |
4174 DW_MUTEX_LOCK; | 4430 DW_MUTEX_LOCK; |
4175 | 4431 |
4176 /* The DW mutex should be sufficient for | 4432 /* The DW mutex should be sufficient for |
4177 * insuring no thread changes this unknowingly. | 4433 * insuring no thread changes this unknowingly. |
4181 DW_MUTEX_UNLOCK; | 4437 DW_MUTEX_UNLOCK; |
4182 return NULL; | 4438 return NULL; |
4183 } | 4439 } |
4184 | 4440 |
4185 _dw_file_active = 1; | 4441 _dw_file_active = 1; |
4186 _dw_file_ready = 0; | |
4187 | 4442 |
4188 filew = gtk_file_selection_new(title); | 4443 filew = gtk_file_selection_new(title); |
4189 | 4444 |
4190 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", (GtkSignalFunc) _gtk_file_ok, filew); | 4445 dwwait = dw_dialog_new((void *)filew); |
4191 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), "clicked", (GtkSignalFunc) _gtk_file_cancel, filew); | 4446 |
4447 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", (GtkSignalFunc) _gtk_file_ok, dwwait); | |
4448 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), "clicked", (GtkSignalFunc) _gtk_file_cancel, dwwait); | |
4192 | 4449 |
4193 if(defpath) | 4450 if(defpath) |
4194 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), defpath); | 4451 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), defpath); |
4195 | 4452 |
4196 gtk_widget_show(filew); | 4453 gtk_widget_show(filew); |
4197 | 4454 |
4198 DW_MUTEX_UNLOCK; | 4455 DW_MUTEX_UNLOCK; |
4199 | 4456 |
4200 if(pthread_self() == _dw_thread) | 4457 return (char *)dw_dialog_wait(dwwait); |
4201 gtk_main(); | |
4202 else | |
4203 { | |
4204 /* This should be an event semaphore */ | |
4205 while(!_dw_file_ready) | |
4206 usleep(100); | |
4207 } | |
4208 | |
4209 tmpvar = _dw_browse_file; | |
4210 _dw_browse_file = NULL; | |
4211 _dw_file_ready = _dw_file_active = 0; | |
4212 | |
4213 return tmpvar; | |
4214 } | 4458 } |
4215 | 4459 |
4216 | 4460 |
4217 /* | 4461 /* |
4218 * Execute and external program in a seperate session. | 4462 * Execute and external program in a seperate session. |