comparison gtk/dw.c @ 14:176cee043f1b

Lots of Windows and Unix bug fixes.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 11 Jul 2001 21:57:56 +0000
parents 26e2130135b9
children 81833f25b1aa
comparison
equal deleted inserted replaced
13:156281539fb3 14:176cee043f1b
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 char *_dw_browse_file = NULL;
54 int _dw_file_active = 0, _dw_file_ready = 0; 54 int _dw_file_active = 0, _dw_file_ready = 0, _dw_ignore_click = 0;
55 pthread_t _dw_thread = (pthread_t)-1; 55 pthread_t _dw_thread = (pthread_t)-1;
56 int _dw_mutex_locked = FALSE; 56 int _dw_mutex_locked = FALSE;
57 57
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; } } 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; } }
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; } } 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; } }
60 60
61 /* Currently the non Imlib method does not work */ 61 /* Currently the non Imlib method does not work */
62 #ifndef USE_IMLIB 62 #ifndef USE_IMLIB
63 #define USE_IMLIB 63 #define USE_IMLIB
64 #endif 64 #endif
65
66 #define DEFAULT_SIZE_WIDTH 12
67 #define DEFAULT_SIZE_HEIGHT 6
68 #define DEFAULT_TITLEBAR_HEIGHT 22
65 69
66 GdkColormap *_dw_cmap = NULL; 70 GdkColormap *_dw_cmap = NULL;
67 71
68 /* Signal forwarder prototypes */ 72 /* Signal forwarder prototypes */
69 gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data); 73 gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
76 void _activate_event(GtkWidget *widget, gpointer data); 80 void _activate_event(GtkWidget *widget, gpointer data);
77 void _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data); 81 void _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
78 void _container_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data); 82 void _container_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
79 void _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data); 83 void _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data);
80 void _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data); 84 void _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data);
85 void _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data);
81 86
82 typedef struct 87 typedef struct
83 { 88 {
84 void *func; 89 void *func;
85 char name[30]; 90 char name[30];
92 void *func; 97 void *func;
93 gpointer data; 98 gpointer data;
94 99
95 } SignalHandler; 100 } SignalHandler;
96 101
97 #define SIGNALMAX 12 102 #define SIGNALMAX 13
98 103
99 /* A list of signal forwarders, to account for paramater differences. */ 104 /* A list of signal forwarders, to account for paramater differences. */
100 SignalList SignalTranslate[SIGNALMAX] = { 105 SignalList SignalTranslate[SIGNALMAX] = {
101 { _configure_event, "configure_event" }, 106 { _configure_event, "configure_event" },
102 { _key_press_event, "key_press_event" }, 107 { _key_press_event, "key_press_event" },
107 { _expose_event, "expose_event" }, 112 { _expose_event, "expose_event" },
108 { _activate_event, "activate" }, 113 { _activate_event, "activate" },
109 { _generic_event, "clicked" }, 114 { _generic_event, "clicked" },
110 { _container_select_event, "container-select" }, 115 { _container_select_event, "container-select" },
111 { _container_context_event, "container-context" }, 116 { _container_context_event, "container-context" },
112 { _item_select_event, "item-select" } 117 { _item_select_event, "item-select" },
118 { _set_focus_event, "set-focus" }
113 }; 119 };
114 120
115 /* Finds the translation function for a given signal name */ 121 /* Finds the translation function for a given signal name */
116 void *_findsigfunc(char *signame) 122 void *_findsigfunc(char *signame)
117 { 123 {
121 { 127 {
122 if(strcasecmp(signame, SignalTranslate[z].name) == 0) 128 if(strcasecmp(signame, SignalTranslate[z].name) == 0)
123 return SignalTranslate[z].func; 129 return SignalTranslate[z].func;
124 } 130 }
125 return NULL; 131 return NULL;
132 }
133
134 void _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data)
135 {
136 SignalHandler *work = (SignalHandler *)data;
137
138 if(work)
139 {
140 int (*setfocusfunc)(HWND, void *) = work->func;
141
142 setfocusfunc((HWND)window, work->data);
143 }
126 } 144 }
127 145
128 gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) 146 gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
129 { 147 {
130 SignalHandler *work = (SignalHandler *)data; 148 SignalHandler *work = (SignalHandler *)data;
186 keys = DW_BUTTON1_MASK; 204 keys = DW_BUTTON1_MASK;
187 if (state & GDK_BUTTON3_MASK) 205 if (state & GDK_BUTTON3_MASK)
188 keys |= DW_BUTTON2_MASK; 206 keys |= DW_BUTTON2_MASK;
189 if (state & GDK_BUTTON2_MASK) 207 if (state & GDK_BUTTON2_MASK)
190 keys |= DW_BUTTON3_MASK; 208 keys |= DW_BUTTON3_MASK;
191 209
192 motionfunc(widget, x, y, keys, work->data); 210 motionfunc(widget, x, y, keys, work->data);
193 } 211 }
194 return TRUE; 212 return TRUE;
195 } 213 }
196 214
235 253
236 void _activate_event(GtkWidget *widget, gpointer data) 254 void _activate_event(GtkWidget *widget, gpointer data)
237 { 255 {
238 SignalHandler *work = (SignalHandler *)data; 256 SignalHandler *work = (SignalHandler *)data;
239 257
240 if(work) 258 if(work && !_dw_ignore_click)
241 { 259 {
242 void (*activatefunc)(HWND, void *) = work->func; 260 void (*activatefunc)(HWND, void *) = work->func;
243 261
244 activatefunc(work->window, work->data); 262 activatefunc(work->window, work->data);
245 } 263 }
427 * Initializes the Dynamic Windows engine. 445 * Initializes the Dynamic Windows engine.
428 * Parameters: 446 * Parameters:
429 * newthread: True if this is the only thread. 447 * newthread: True if this is the only thread.
430 * False if there is already a message loop running. 448 * False if there is already a message loop running.
431 */ 449 */
432 int dw_int_init(DWResources *res, int newthread) 450 int dw_int_init(DWResources *res, int newthread, int argc, char *argv[])
433 { 451 {
434 int z; 452 int z;
435 453
436 if(res) 454 if(res)
437 { 455 {
439 _resources.resource_id = res->resource_id; 457 _resources.resource_id = res->resource_id;
440 _resources.resource_data = res->resource_data; 458 _resources.resource_data = res->resource_data;
441 } 459 }
442 gtk_set_locale(); 460 gtk_set_locale();
443 g_thread_init(NULL); 461 g_thread_init(NULL);
444 gtk_init(0, NULL); 462
463 gtk_init(&argc, &argv);
445 #ifdef USE_IMLIB 464 #ifdef USE_IMLIB
446 gdk_imlib_init(); 465 gdk_imlib_init();
447 #endif 466 #endif
448 /* Add colors to the system colormap */ 467 /* Add colors to the system colormap */
449 _dw_cmap = gdk_colormap_get_system(); 468 _dw_cmap = gdk_colormap_get_system();
602 { 621 {
603 return FALSE; 622 return FALSE;
604 } 623 }
605 624
606 /* 625 /*
607 * Makes the window visible. 626 * Minimizes or Iconifies a top-level window.
608 * Parameters: 627 * Parameters:
609 * handle: The window handle to make visible. 628 * handle: The window handle to minimize.
610 */ 629 */
611 int dw_window_show(HWND handle) 630 int dw_window_minimize(HWND handle)
612 { 631 {
613 int _locked_by_me = FALSE; 632 int _locked_by_me = FALSE;
614 633
615 if(!handle) 634 if(!handle)
616 return 0; 635 return 0;
617 636
618 DW_MUTEX_LOCK; 637 DW_MUTEX_LOCK;
619 gtk_widget_show(handle); 638 XIconifyWindow(GDK_WINDOW_XDISPLAY(GTK_WIDGET(handle)->window),
639 GDK_WINDOW_XWINDOW(GTK_WIDGET(handle)->window),
640 DefaultScreen (GDK_DISPLAY ()));
620 DW_MUTEX_UNLOCK; 641 DW_MUTEX_UNLOCK;
621 return 0; 642 return 0;
622 } 643 }
623 644
624 /* 645 /*
625 * Makes the window invisible. 646 * Makes the window visible.
626 * Parameters: 647 * Parameters:
627 * handle: The window handle to make visible. 648 * handle: The window handle to make visible.
628 */ 649 */
629 int dw_window_hide(HWND handle) 650 int dw_window_show(HWND handle)
630 { 651 {
631 int _locked_by_me = FALSE; 652 int _locked_by_me = FALSE;
632 653
633 if(!handle) 654 if(!handle)
634 return 0; 655 return 0;
635 656
636 DW_MUTEX_LOCK; 657 DW_MUTEX_LOCK;
637 gtk_widget_hide(handle); 658 gtk_widget_show(handle);
659 gdk_window_raise(GTK_WIDGET(handle)->window);
660 gdk_flush();
661 gdk_window_show(GTK_WIDGET(handle)->window);
662 gdk_flush();
638 DW_MUTEX_UNLOCK; 663 DW_MUTEX_UNLOCK;
639 return 0; 664 return 0;
640 } 665 }
641 666
642 /* 667 /*
643 * Destroys a window and all of it's children. 668 * Makes the window invisible.
644 * Parameters: 669 * Parameters:
645 * handle: The window handle to destroy. 670 * handle: The window handle to make visible.
646 */ 671 */
647 int dw_window_destroy(HWND handle) 672 int dw_window_hide(HWND handle)
648 { 673 {
649 int _locked_by_me = FALSE; 674 int _locked_by_me = FALSE;
650 675
651 if(!handle) 676 if(!handle)
652 return 0; 677 return 0;
653 678
654 DW_MUTEX_LOCK; 679 DW_MUTEX_LOCK;
680 gtk_widget_hide(handle);
681 DW_MUTEX_UNLOCK;
682 return 0;
683 }
684
685 /*
686 * Destroys a window and all of it's children.
687 * Parameters:
688 * handle: The window handle to destroy.
689 */
690 int dw_window_destroy(HWND handle)
691 {
692 int _locked_by_me = FALSE;
693
694 if(!handle)
695 return 0;
696
697 DW_MUTEX_LOCK;
655 gtk_widget_destroy(handle); 698 gtk_widget_destroy(handle);
656 DW_MUTEX_UNLOCK; 699 DW_MUTEX_UNLOCK;
657 return 0; 700 return 0;
658 } 701 }
659 702
663 * handle: The window handle to destroy. 706 * handle: The window handle to destroy.
664 * newparent: The window's new parent window. 707 * newparent: The window's new parent window.
665 */ 708 */
666 void dw_window_reparent(HWND handle, HWND newparent) 709 void dw_window_reparent(HWND handle, HWND newparent)
667 { 710 {
668 gtk_widget_reparent(handle, newparent); 711 int _locked_by_me = FALSE;
712
713 DW_MUTEX_LOCK;
714 gdk_window_reparent(GTK_WIDGET(handle)->window, newparent ? GTK_WIDGET(newparent)->window : GDK_ROOT_PARENT(), 0, 0);
715 DW_MUTEX_UNLOCK;
669 } 716 }
670 717
671 int _set_font(HWND handle, char *fontname) 718 int _set_font(HWND handle, char *fontname)
672 { 719 {
673 GtkStyle *style; 720 GtkStyle *style;
717 764
718 DW_MUTEX_UNLOCK; 765 DW_MUTEX_UNLOCK;
719 return TRUE; 766 return TRUE;
720 } 767 }
721 768
769 void _free_gdk_colors(HWND handle)
770 {
771 GdkColor *old = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle), "foregdk");
772
773 if(old)
774 free(old);
775
776 old = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle), "backgdk");
777
778 if(old)
779 free(old);
780 }
781
782 /* Free old color pointers and allocate new ones */
783 void _save_gdk_colors(HWND handle, GdkColor fore, GdkColor back)
784 {
785 GdkColor *foregdk = malloc(sizeof(GdkColor));
786 GdkColor *backgdk = malloc(sizeof(GdkColor));
787
788 _free_gdk_colors(handle);
789
790 *foregdk = fore;
791 *backgdk = back;
792
793 gtk_object_set_data(GTK_OBJECT(handle), "foregdk", (gpointer)foregdk);
794 gtk_object_set_data(GTK_OBJECT(handle), "backgdk", (gpointer)backgdk);
795 }
796
722 int _set_color(HWND handle, unsigned long fore, unsigned long back) 797 int _set_color(HWND handle, unsigned long fore, unsigned long back)
723 { 798 {
724 GtkStyle *style; 799 GtkStyle *style;
725 800
726 if(fore & DW_RGB_COLOR || back & DW_RGB_COLOR) 801 if(fore & DW_RGB_COLOR || back & DW_RGB_COLOR)
727 { 802 {
803 /* Remember that each color component in X11 use 16 bit no matter
804 * what the destination display supports. (and thus GDK)
805 */
728 GdkColor forecolor = { 0, DW_RED_VALUE(fore) << 8, DW_GREEN_VALUE(fore) << 8, DW_BLUE_VALUE(fore) << 8 }; 806 GdkColor forecolor = { 0, DW_RED_VALUE(fore) << 8, DW_GREEN_VALUE(fore) << 8, DW_BLUE_VALUE(fore) << 8 };
729 GdkColor backcolor = { 0, DW_RED_VALUE(back) << 8, DW_GREEN_VALUE(back) << 8, DW_BLUE_VALUE(back) << 8 }; 807 GdkColor backcolor = { 0, DW_RED_VALUE(back) << 8, DW_GREEN_VALUE(back) << 8, DW_BLUE_VALUE(back) << 8 };
730 808
731 gdk_color_alloc(_dw_cmap, &forecolor); 809 gdk_color_alloc(_dw_cmap, &forecolor);
732 gdk_color_alloc(_dw_cmap, &backcolor); 810 gdk_color_alloc(_dw_cmap, &backcolor);
733 811
734 style = gtk_widget_get_style(handle); 812 style = gtk_style_copy(gtk_widget_get_style(handle));
735 style->fg[1] = style->fg[0] = forecolor; 813 style->text[0] = style->text[1] = style->fg[0] = style->fg[1] = forecolor;
736 style->base[0] = style->base[1] = style->bg[0] = style->bg[1] = backcolor; 814 style->base[0] = style->base[1] = style->bg[0] = style->bg[1] = backcolor;
737 gtk_widget_set_style(handle, style); 815 gtk_widget_set_style(handle, style);
816
817 _save_gdk_colors(handle, forecolor, backcolor);
818
819 if(GTK_IS_CLIST(handle))
820 {
821 int z, rowcount = (int)gtk_object_get_data(GTK_OBJECT(handle), "rowcount");
822
823 for(z=0;z<rowcount;z++)
824 {
825 gtk_clist_set_foreground(GTK_CLIST(handle), z, &forecolor);
826 gtk_clist_set_background(GTK_CLIST(handle), z, &backcolor);
827 }
828 }
738 } 829 }
739 else 830 else
740 { 831 {
741 style = gtk_widget_get_style(handle); 832 style = gtk_style_copy(gtk_widget_get_style(handle));
742 style->fg[1] = style->fg[0] = _colors[fore]; 833 style->text[0] = style->text[1] = style->fg[0] = style->fg[1] = _colors[fore];
743 style->base[0] = style->base[1] = style->bg[0] = style->bg[1] = _colors[back]; 834 style->base[0] = style->base[1] = style->bg[0] = style->bg[1] = _colors[back];
744 gtk_widget_set_style(handle, style); 835 gtk_widget_set_style(handle, style);
836
837 _save_gdk_colors(handle, _colors[fore], _colors[back]);
838
839 if(GTK_IS_CLIST(handle))
840 {
841 int z, rowcount = (int)gtk_object_get_data(GTK_OBJECT(handle), "rowcount");
842
843 for(z=0;z<rowcount;z++)
844 {
845 gtk_clist_set_foreground(GTK_CLIST(handle), z, &_colors[fore]);
846 gtk_clist_set_background(GTK_CLIST(handle), z, &_colors[back]);
847 }
848 }
745 } 849 }
746 850
747 return TRUE; 851 return TRUE;
748 } 852 }
749 /* 853 /*
771 GtkWidget *tmp = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "mle"); 875 GtkWidget *tmp = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "mle");
772 if(tmp) 876 if(tmp)
773 handle2 = tmp; 877 handle2 = tmp;
774 } 878 }
775 879
776
777 gtk_object_set_data(GTK_OBJECT(handle2), "fore", (gpointer)fore);
778 gtk_object_set_data(GTK_OBJECT(handle2), "back", (gpointer)back);
779
780 _set_color(handle2, fore, back); 880 _set_color(handle2, fore, back);
781 881
782 DW_MUTEX_UNLOCK; 882 DW_MUTEX_UNLOCK;
783 return TRUE; 883 return TRUE;
784 } 884 }
830 */ 930 */
831 HWND dw_window_new(HWND hwndOwner, char *title, unsigned long flStyle) 931 HWND dw_window_new(HWND hwndOwner, char *title, unsigned long flStyle)
832 { 932 {
833 GtkWidget *tmp; 933 GtkWidget *tmp;
834 int _locked_by_me = FALSE; 934 int _locked_by_me = FALSE;
835 int flags = 0; 935 int flags = 0, cx = 0, cy = 0;
836 936
837 DW_MUTEX_LOCK; 937 DW_MUTEX_LOCK;
838 tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL); 938 tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL);
839 939
840 gtk_window_set_title(GTK_WINDOW(tmp), title); 940 gtk_window_set_title(GTK_WINDOW(tmp), title);
842 gtk_window_set_policy(GTK_WINDOW(tmp), FALSE, FALSE, TRUE); 942 gtk_window_set_policy(GTK_WINDOW(tmp), FALSE, FALSE, TRUE);
843 943
844 gtk_widget_realize(tmp); 944 gtk_widget_realize(tmp);
845 945
846 if(flStyle & DW_FCF_TITLEBAR) 946 if(flStyle & DW_FCF_TITLEBAR)
947 {
948 cy += DEFAULT_TITLEBAR_HEIGHT;
847 flags |= GDK_DECOR_TITLE; 949 flags |= GDK_DECOR_TITLE;
950 }
848 951
849 if(flStyle & DW_FCF_MINMAX) 952 if(flStyle & DW_FCF_MINMAX)
850 flags |= GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE; 953 flags |= GDK_DECOR_MINIMIZE | GDK_DECOR_MAXIMIZE;
851 954
852 if(flStyle & DW_FCF_SIZEBORDER) 955 if(flStyle & DW_FCF_SIZEBORDER)
956 {
957 cy += DEFAULT_SIZE_HEIGHT;
958 cx += DEFAULT_SIZE_WIDTH;
853 flags |= GDK_DECOR_RESIZEH; 959 flags |= GDK_DECOR_RESIZEH;
960 }
854 961
855 if(flStyle & DW_FCF_BORDER) 962 if(flStyle & DW_FCF_BORDER)
856 flags |= GDK_DECOR_BORDER; 963 flags |= GDK_DECOR_BORDER;
857 964
858 gdk_window_set_decorations(tmp->window, flags); 965 gdk_window_set_decorations(tmp->window, flags);
966 gtk_object_set_data(GTK_OBJECT(tmp), "cx", (gpointer)cx);
967 gtk_object_set_data(GTK_OBJECT(tmp), "cy", (gpointer)cy);
968
969 if(hwndOwner)
970 gdk_window_reparent(GTK_WIDGET(tmp)->window, GTK_WIDGET(hwndOwner)->window, 0, 0);
859 971
860 DW_MUTEX_UNLOCK; 972 DW_MUTEX_UNLOCK;
861 return tmp; 973 return tmp;
862 } 974 }
863 975
890 * title: Text to be displayined in the group outline. 1002 * title: Text to be displayined in the group outline.
891 */ 1003 */
892 HWND dw_groupbox_new(int type, int pad, char *title) 1004 HWND dw_groupbox_new(int type, int pad, char *title)
893 { 1005 {
894 return dw_box_new(type, pad); 1006 return dw_box_new(type, pad);
1007 }
1008
1009 /*
1010 * Create a new MDI Frame to be packed.
1011 * Parameters:
1012 * id: An ID to be used with dw_window_from_id or 0L.
1013 */
1014 HWND dw_mdi_new(unsigned long id)
1015 {
1016 return gtk_vbox_new(FALSE, 0);
895 } 1017 }
896 1018
897 /* 1019 /*
898 * Create a bitmap object to be packed. 1020 * Create a bitmap object to be packed.
899 * Parameters: 1021 * Parameters:
1178 sprintf(numbuf, "%lu", id); 1300 sprintf(numbuf, "%lu", id);
1179 tmphandle = _find_submenu_id(menu->menu, numbuf); 1301 tmphandle = _find_submenu_id(menu->menu, numbuf);
1180 1302
1181 if(tmphandle) 1303 if(tmphandle)
1182 { 1304 {
1305 _dw_ignore_click = 1;
1183 if(GTK_CHECK_MENU_ITEM(tmphandle)->active != check) 1306 if(GTK_CHECK_MENU_ITEM(tmphandle)->active != check)
1184 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tmphandle), check); 1307 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(tmphandle), check);
1308 _dw_ignore_click = 0;
1185 } 1309 }
1186 DW_MUTEX_UNLOCK; 1310 DW_MUTEX_UNLOCK;
1187 } 1311 }
1188 1312
1189 /* 1313 /*
1285 * text: The text to be display by the static text widget. 1409 * text: The text to be display by the static text widget.
1286 * id: An ID to be used with WinWindowFromID() or 0L. 1410 * id: An ID to be used with WinWindowFromID() or 0L.
1287 */ 1411 */
1288 HWND dw_status_text_new(char *text, ULONG id) 1412 HWND dw_status_text_new(char *text, ULONG id)
1289 { 1413 {
1290 GtkWidget *tmp; 1414 GtkWidget *tmp, *frame;
1291 int _locked_by_me = FALSE; 1415 int _locked_by_me = FALSE;
1292 1416
1293 DW_MUTEX_LOCK; 1417 DW_MUTEX_LOCK;
1418 frame = gtk_frame_new(NULL);
1419 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN);
1294 tmp = gtk_label_new(text); 1420 tmp = gtk_label_new(text);
1421 gtk_container_add(GTK_CONTAINER(frame), tmp);
1422 gtk_widget_show(tmp);
1423 gtk_widget_show(frame);
1295 gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT); 1424 gtk_label_set_justify(GTK_LABEL(tmp), GTK_JUSTIFY_LEFT);
1296 gtk_widget_show(tmp); 1425 gtk_object_set_data(GTK_OBJECT(frame), "id", (gpointer)id);
1297 gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id); 1426 gtk_object_set_data(GTK_OBJECT(frame), "label", (gpointer)tmp);
1298 DW_MUTEX_UNLOCK; 1427 DW_MUTEX_UNLOCK;
1299 return tmp; 1428 return frame;
1300 } 1429 }
1301 1430
1302 /* 1431 /*
1303 * Create a new Multiline Editbox window (widget) to be packed. 1432 * Create a new Multiline Editbox window (widget) to be packed.
1304 * Parameters: 1433 * Parameters:
1535 * Create a new listbox window (widget) to be packed. 1664 * Create a new listbox window (widget) to be packed.
1536 * Parameters: 1665 * Parameters:
1537 * id: An ID to be used with WinWindowFromID() or 0L. 1666 * id: An ID to be used with WinWindowFromID() or 0L.
1538 * multi: Multiple select TRUE or FALSE. 1667 * multi: Multiple select TRUE or FALSE.
1539 */ 1668 */
1540 HWND dw_listbox_new(unsigned long id, int multi) 1669 HWND dw_listbox_new(unsigned long id, int multi)
1541 { 1670 {
1542 GtkWidget *tmp, *list; 1671 GtkWidget *tmp, *list;
1543 int _locked_by_me = FALSE; 1672 int _locked_by_me = FALSE;
1544 1673
1545 DW_MUTEX_LOCK; 1674 DW_MUTEX_LOCK;
1616 gtk_entry_set_text(GTK_ENTRY(handle), text); 1745 gtk_entry_set_text(GTK_ENTRY(handle), text);
1617 else if(GTK_IS_COMBO(handle)) 1746 else if(GTK_IS_COMBO(handle))
1618 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(handle)->entry), text); 1747 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(handle)->entry), text);
1619 else if(GTK_IS_LABEL(handle)) 1748 else if(GTK_IS_LABEL(handle))
1620 gtk_label_set_text(GTK_LABEL(handle), text); 1749 gtk_label_set_text(GTK_LABEL(handle), text);
1750 else if(GTK_IS_FRAME(handle))
1751 {
1752 GtkWidget *tmp = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "label");
1753 if(tmp && GTK_IS_LABEL(tmp))
1754 gtk_label_set_text(GTK_LABEL(tmp), text);
1755 }
1621 DW_MUTEX_UNLOCK; 1756 DW_MUTEX_UNLOCK;
1622 } 1757 }
1623 1758
1624 /* 1759 /*
1625 * Gets the text used for a given window. 1760 * Gets the text used for a given window.
2269 */ 2404 */
2270 void *dw_container_alloc(HWND handle, int rowcount) 2405 void *dw_container_alloc(HWND handle, int rowcount)
2271 { 2406 {
2272 int z, count = 0; 2407 int z, count = 0;
2273 GtkWidget *clist; 2408 GtkWidget *clist;
2409 GdkColor *fore, *back;
2274 char **blah; 2410 char **blah;
2275 int _locked_by_me = FALSE; 2411 int _locked_by_me = FALSE;
2276 2412
2277 DW_MUTEX_LOCK; 2413 DW_MUTEX_LOCK;
2278 clist = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle)); 2414 clist = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
2291 } 2427 }
2292 2428
2293 blah = malloc(sizeof(char *) * count); 2429 blah = malloc(sizeof(char *) * count);
2294 memset(blah, 0, sizeof(char *) * count); 2430 memset(blah, 0, sizeof(char *) * count);
2295 2431
2432 fore = (GdkColor *)gtk_object_get_data(GTK_OBJECT(clist), "foregdk");
2433 back = (GdkColor *)gtk_object_get_data(GTK_OBJECT(clist), "backgdk");
2296 gtk_clist_freeze(GTK_CLIST(clist)); 2434 gtk_clist_freeze(GTK_CLIST(clist));
2297 for(z=0;z<rowcount;z++) 2435 for(z=0;z<rowcount;z++)
2298 { 2436 {
2299 gtk_clist_append(GTK_CLIST(clist), blah); 2437 gtk_clist_append(GTK_CLIST(clist), blah);
2300 } 2438 if(fore)
2439 gtk_clist_set_foreground(GTK_CLIST(clist), z, fore);
2440 if(back)
2441 gtk_clist_set_background(GTK_CLIST(clist), z, back);
2442 }
2443 gtk_object_set_data(GTK_OBJECT(clist), "rowcount", (gpointer)rowcount);
2301 free(blah); 2444 free(blah);
2302 DW_MUTEX_UNLOCK; 2445 DW_MUTEX_UNLOCK;
2303 return (void *)handle; 2446 return (void *)handle;
2304 } 2447 }
2305 2448
2458 { 2601 {
2459 list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "selectlist"); 2602 list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "selectlist");
2460 g_list_free(list); 2603 g_list_free(list);
2461 gtk_object_set_data(GTK_OBJECT(clist), "selectlist", NULL); 2604 gtk_object_set_data(GTK_OBJECT(clist), "selectlist", NULL);
2462 gtk_clist_clear(GTK_CLIST(clist)); 2605 gtk_clist_clear(GTK_CLIST(clist));
2606 gtk_object_set_data(GTK_OBJECT(clist), "rowcount", (gpointer)0);
2463 } 2607 }
2464 DW_MUTEX_UNLOCK; 2608 DW_MUTEX_UNLOCK;
2465 } 2609 }
2466 2610
2467 /* 2611 /*
3222 void dw_window_set_pos(HWND handle, unsigned long x, unsigned long y) 3366 void dw_window_set_pos(HWND handle, unsigned long x, unsigned long y)
3223 { 3367 {
3224 int _locked_by_me = FALSE; 3368 int _locked_by_me = FALSE;
3225 3369
3226 DW_MUTEX_LOCK; 3370 DW_MUTEX_LOCK;
3227 if(handle->window) 3371 if(handle && handle->window)
3228 gdk_window_move(handle->window, x, y); 3372 gdk_window_move(handle->window, x, y);
3229 DW_MUTEX_UNLOCK; 3373 DW_MUTEX_UNLOCK;
3230 } 3374 }
3231 3375
3232 /* 3376 /*
3241 void dw_window_set_pos_size(HWND handle, unsigned long x, unsigned long y, unsigned long width, unsigned long height) 3385 void dw_window_set_pos_size(HWND handle, unsigned long x, unsigned long y, unsigned long width, unsigned long height)
3242 { 3386 {
3243 int _locked_by_me = FALSE; 3387 int _locked_by_me = FALSE;
3244 3388
3245 DW_MUTEX_LOCK; 3389 DW_MUTEX_LOCK;
3246 if(GTK_IS_WINDOW(handle)) 3390 if(handle && GTK_IS_WINDOW(handle))
3247 { 3391 {
3392 GdkWindow *parent = gdk_window_get_parent(handle->window);
3393 int cx = (int)gtk_object_get_data(GTK_OBJECT(handle), "cx");
3394 int cy = (int)gtk_object_get_data(GTK_OBJECT(handle), "cy");
3395
3248 _size_allocate(GTK_WINDOW(handle)); 3396 _size_allocate(GTK_WINDOW(handle));
3249 gtk_widget_set_uposition(handle, x, y); 3397 #if 0
3250 gtk_window_set_default_size(GTK_WINDOW(handle), width, height); 3398 if(parent)
3251 } 3399 {
3252 else if(handle->window) 3400 gdk_window_resize(parent, width, height);
3401 gdk_window_move(parent, x, y);
3402 }
3403 else
3404 #endif
3405 {
3406 gtk_widget_set_uposition(handle, x, y);
3407 gtk_window_set_default_size(GTK_WINDOW(handle), width - cx, height - cy);
3408 }
3409 }
3410 else if(handle && handle->window)
3253 { 3411 {
3254 gdk_window_resize(handle->window, width, height); 3412 gdk_window_resize(handle->window, width, height);
3255 gdk_window_move(handle->window, x, y); 3413 gdk_window_move(handle->window, x, y);
3256 } 3414 }
3257 DW_MUTEX_UNLOCK; 3415 DW_MUTEX_UNLOCK;
3271 int _locked_by_me = FALSE; 3429 int _locked_by_me = FALSE;
3272 gint gx, gy, gwidth, gheight, gdepth; 3430 gint gx, gy, gwidth, gheight, gdepth;
3273 3431
3274 if(handle && handle->window) 3432 if(handle && handle->window)
3275 { 3433 {
3434 int cx, cy;
3435
3276 DW_MUTEX_LOCK; 3436 DW_MUTEX_LOCK;
3437
3438 cx = (int)gtk_object_get_data(GTK_OBJECT(handle), "cx");
3439 cy = (int)gtk_object_get_data(GTK_OBJECT(handle), "cy");
3440
3277 gdk_window_get_geometry(handle->window, &gx, &gy, &gwidth, &gheight, &gdepth); 3441 gdk_window_get_geometry(handle->window, &gx, &gy, &gwidth, &gheight, &gdepth);
3278 gdk_window_get_root_origin(handle->window, &gx, &gy); 3442 gdk_window_get_root_origin(handle->window, &gx, &gy);
3279 if(x) 3443 if(x)
3280 *x = gx; 3444 *x = gx;
3281 if(y) 3445 if(y)
3282 *y = gy; 3446 *y = gy;
3283 if(width) 3447 if(width)
3284 *width = gwidth; 3448 *width = gwidth - cx;
3285 if(height) 3449 if(height)
3286 *height = gheight; 3450 *height = gheight - cy;
3287 DW_MUTEX_UNLOCK; 3451 DW_MUTEX_UNLOCK;
3288 } 3452 }
3289 } 3453 }
3290 3454
3291 /* 3455 /*
3461 if(GTK_IS_LIST(handle2)) 3625 if(GTK_IS_LIST(handle2))
3462 { 3626 {
3463 GtkWidget *list_item; 3627 GtkWidget *list_item;
3464 GList *tmp; 3628 GList *tmp;
3465 char *font = (char *)gtk_object_get_data(GTK_OBJECT(handle), "font"); 3629 char *font = (char *)gtk_object_get_data(GTK_OBJECT(handle), "font");
3466 unsigned long fore = (unsigned long)gtk_object_get_data(GTK_OBJECT(handle), "fore"); 3630 GdkColor *fore = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle2), "foregdk");
3467 unsigned long back = (unsigned long)gtk_object_get_data(GTK_OBJECT(handle), "back"); 3631 GdkColor *back = (GdkColor *)gtk_object_get_data(GTK_OBJECT(handle2), "backgdk");
3468 3632
3469 list_item=gtk_list_item_new_with_label(text); 3633 list_item=gtk_list_item_new_with_label(text);
3470 3634
3471 if(font) 3635 if(font)
3472 _set_font(GTK_LIST_ITEM(list_item)->item.bin.child, font); 3636 _set_font(GTK_LIST_ITEM(list_item)->item.bin.child, font);
3473 if(fore && back) 3637 if(fore && back)
3474 _set_color(GTK_LIST_ITEM(list_item)->item.bin.child, fore, back); 3638 _set_color(GTK_LIST_ITEM(list_item)->item.bin.child,
3639 DW_RGB(fore->red, fore->green, fore->blue),
3640 DW_RGB(back->red, back->green, back->blue));
3475 3641
3476 tmp = g_list_append(NULL, list_item); 3642 tmp = g_list_append(NULL, list_item);
3477 gtk_widget_show(list_item); 3643 gtk_widget_show(list_item);
3478 gtk_list_append_items(GTK_LIST(handle2),tmp); 3644 gtk_list_append_items(GTK_LIST(handle2),tmp);
3479 } 3645 }
4194 } 4360 }
4195 else if(GTK_IS_LIST(thiswindow) && strcmp(signame, "item-select") == 0) 4361 else if(GTK_IS_LIST(thiswindow) && strcmp(signame, "item-select") == 0)
4196 { 4362 {
4197 thisname = "select_child"; 4363 thisname = "select_child";
4198 } 4364 }
4365 else if(GTK_IS_WINDOW(thiswindow) && strcmp(signame, "set-focus") == 0)
4366 {
4367 thisname = "focus-in-event";
4368 }
4199 4369
4200 if(!thisfunc || !thiswindow) 4370 if(!thisfunc || !thiswindow)
4201 { 4371 {
4202 free(work); 4372 free(work);
4203 DW_MUTEX_UNLOCK; 4373 DW_MUTEX_UNLOCK;