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.