Mercurial > dwindows
changeset 48:16eac0f8b45f
Latest fixes, mainly for GTK.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Mon, 05 Nov 2001 10:56:39 +0000 |
parents | 997e9ed670ef |
children | bf42d08d72d7 |
files | gtk/dw.c win/dw.c |
diffstat | 2 files changed, 171 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/gtk/dw.c Fri Nov 02 10:31:29 2001 +0000 +++ b/gtk/dw.c Mon Nov 05 10:56:39 2001 +0000 @@ -52,8 +52,11 @@ { 0, 0xffff, 0xffff, 0xffff }, /* 15 bright white */ }; -GdkColor _foreground = { 0, 0x0000, 0x0000, 0x0000 }; -GdkColor _background = { 0, 0xaaaa, 0xaaaa, 0xaaaa }; +#define DW_THREAD_LIMIT 50 + +DWTID _dw_thread_list[DW_THREAD_LIMIT]; +GdkColor _foreground[DW_THREAD_LIMIT]; +GdkColor _background[DW_THREAD_LIMIT]; GtkWidget *last_window = NULL; @@ -487,6 +490,51 @@ gdk_flush (); } +/* Find the index of a given thread */ +int _find_thread_index(DWTID tid) +{ + int z; + + for(z=0;z<DW_THREAD_LIMIT;z++) + { + if(_dw_thread_list[z] == tid) + return z; + } + return 0; +} + +/* Add a thread id to the thread list */ +void _dw_thread_add(DWTID tid) +{ + int z; + + for(z=0;z<DW_THREAD_LIMIT;z++) + { + if(_dw_thread_list[z] == (DWTID)-1) + { + _dw_thread_list[z] = tid; + _foreground[z].pixel = _foreground[z].red =_foreground[z].green = _foreground[z].blue = 0; + _background[z].pixel = 0; + _background[z].red = 0xaaaa; + _background[z].green = 0xaaaa; + _background[z].blue = 0xaaaa; + return; + } + } +} + +/* Remove a thread id to the thread list */ +void _dw_thread_remove(DWTID tid) +{ + int z; + + for(z=0;z<DW_THREAD_LIMIT;z++) + { + if(_dw_thread_list[z] == (DWTID)tid) + _dw_thread_list[z] = -1; + } +} + /* * Initializes the Dynamic Windows engine. * Parameters: @@ -523,6 +571,9 @@ if(tmp) _dw_border_height = atoi(tmp); + for(z=0;z<DW_THREAD_LIMIT;z++) + _dw_thread_list[z] = (DWTID)-1; + return TRUE; } @@ -536,6 +587,7 @@ void dw_main(HAB currenthab, void *func) { _dw_thread = pthread_self(); + _dw_thread_add(_dw_thread); gdk_threads_enter(); gtk_main(); gdk_threads_leave(); @@ -685,6 +737,7 @@ DWDialog *dwwait; va_list args; char outbuf[256]; + int x, y; va_start(args, format); vsprintf(outbuf, format, args); @@ -713,7 +766,10 @@ dw_signal_connect(okbutton, "clicked", DW_SIGNAL_FUNC(_dw_ok_func), (void *)dwwait); - dw_window_set_usize(entrywindow, 220, 110); + x = (dw_screen_width() - 220)/2; + y = (dw_screen_height() - 110)/2; + + dw_window_set_pos_size(entrywindow, x, y, 220, 110); dw_window_show(entrywindow); @@ -757,6 +813,7 @@ HWND entrywindow, mainbox, nobutton, yesbutton, buttonbox, stext; ULONG flStyle = DW_FCF_TITLEBAR | DW_FCF_SHELLPOSITION | DW_FCF_DLGBORDER; DWDialog *dwwait; + int x, y; entrywindow = dw_window_new(HWND_DESKTOP, title, flStyle); @@ -788,7 +845,10 @@ dw_signal_connect(yesbutton, "clicked", DW_SIGNAL_FUNC(_dw_yes_func), (void *)dwwait); dw_signal_connect(nobutton, "clicked", DW_SIGNAL_FUNC(_dw_no_func), (void *)dwwait); - dw_window_set_usize(entrywindow, 220, 110); + x = (dw_screen_width() - 220)/2; + y = (dw_screen_height() - 110)/2; + + dw_window_set_pos_size(entrywindow, x, y, 220, 110); dw_window_show(entrywindow); @@ -1100,6 +1160,12 @@ if(tmp) handle2 = tmp; } + else if(GTK_IS_TABLE(handle)) + { + GtkWidget *tmp = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "eventbox"); + if(tmp) + handle2 = tmp; + } _set_color(handle2, fore, back); @@ -1210,11 +1276,15 @@ */ HWND dw_box_new(int type, int pad) { - GtkWidget *tmp; + GtkWidget *tmp, *eventbox; int _locked_by_me = FALSE; DW_MUTEX_LOCK; tmp = gtk_table_new(1, 1, FALSE); + eventbox = gtk_event_box_new(); + + gtk_widget_show(eventbox); + gtk_object_set_data(GTK_OBJECT(tmp), "eventbox", (gpointer)eventbox); gtk_object_set_data(GTK_OBJECT(tmp), "boxtype", (gpointer)type); gtk_object_set_data(GTK_OBJECT(tmp), "boxpad", (gpointer)pad); gtk_widget_show(tmp); @@ -1239,6 +1309,7 @@ gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_ETCHED_IN); gtk_frame_set_label(GTK_FRAME(frame), title && *title ? title : NULL); tmp = gtk_table_new(1, 1, FALSE); + gtk_container_border_width(GTK_CONTAINER(tmp), pad); gtk_object_set_data(GTK_OBJECT(tmp), "boxtype", (gpointer)type); gtk_object_set_data(GTK_OBJECT(tmp), "boxpad", (gpointer)pad); gtk_object_set_data(GTK_OBJECT(frame), "boxhandle", (gpointer)tmp); @@ -3271,12 +3342,12 @@ */ void dw_color_foreground_set(unsigned long value) { - int _locked_by_me = FALSE; + int _locked_by_me = FALSE, index = _find_thread_index(dw_thread_id()); GdkColor color = { 0, DW_RED_VALUE(value) << 8, DW_GREEN_VALUE(value) << 8, DW_BLUE_VALUE(value) << 8 }; DW_MUTEX_LOCK; gdk_color_alloc(_dw_cmap, &color); - _foreground = color; + _foreground[index] = color; DW_MUTEX_UNLOCK; } @@ -3288,25 +3359,27 @@ */ void dw_color_background_set(unsigned long value) { - int _locked_by_me = FALSE; + int _locked_by_me = FALSE, index = _find_thread_index(dw_thread_id()); GdkColor color = { 0, DW_RED_VALUE(value) << 8, DW_GREEN_VALUE(value) << 8, DW_BLUE_VALUE(value) << 8 }; DW_MUTEX_LOCK; gdk_color_alloc(_dw_cmap, &color); - _background = color; + _background[index] = color; DW_MUTEX_UNLOCK; } GdkGC *_set_colors(GdkWindow *window) { GdkGC *gc; + int index = _find_thread_index(dw_thread_id()); + if(!window) return NULL; gc = gdk_gc_new(window); if(gc) { - gdk_gc_set_foreground(gc, &_foreground); - gdk_gc_set_background(gc, &_background); + gdk_gc_set_foreground(gc, &_foreground[index]); + gdk_gc_set_background(gc, &_background[index]); } return gc; } @@ -3755,6 +3828,21 @@ } /* + * Setup thread independent color sets. + */ +void _dwthreadstart(void *data) +{ + void (*threadfunc)(void *) = NULL; + void **tmp = (void **)data; + + threadfunc = (void (*)(void *))tmp[0]; + + _dw_thread_add(dw_thread_id()); + threadfunc(tmp[1]); + _dw_thread_remove(dw_thread_id()); + free(tmp); +} +/* * Creates a new thread with a starting point of func. * Parameters: * func: Function which will be run in the new thread. @@ -3764,8 +3852,12 @@ DWTID dw_thread_new(void *func, void *data, int stack) { DWTID gtkthread; - - pthread_create(>kthread, NULL, func, data); + void **tmp = malloc(sizeof(void *) * 2); + + tmp[0] = func; + tmp[1] = data; + + pthread_create(>kthread, NULL, (void *)_dwthreadstart, (void *)tmp); return gtkthread; } @@ -3778,6 +3870,14 @@ } /* + * Returns the current thread's ID. + */ +DWTID dw_thread_id(void) +{ + return (DWTID)pthread_self(); +} + +/* * Cleanly terminates a DW session, should be signal handler safe. * Parameters: * exitcode: Exit code reported to the operating system. @@ -3830,7 +3930,16 @@ * of the GtkTable class. */ if(GTK_IS_TABLE(item)) - pad = (int)gtk_object_get_data(GTK_OBJECT(item), "boxpad"); + { + GtkWidget *eventbox = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(item), "eventbox"); + + if(eventbox) + { + gtk_container_add(GTK_CONTAINER(eventbox), item); + pad = (int)gtk_object_get_data(GTK_OBJECT(item), "boxpad"); + item = eventbox; + } + } if(boxtype == BOXVERT) gtk_table_resize(GTK_TABLE(box), boxcount + 1, 1); @@ -3858,6 +3967,19 @@ { GtkWidget *vbox = gtk_vbox_new(FALSE, 0); + if(GTK_IS_TABLE(item)) + { + GtkWidget *eventbox = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(item), "eventbox"); + + if(eventbox) + { + gtk_container_add(GTK_CONTAINER(eventbox), item); + pad = (int)gtk_object_get_data(GTK_OBJECT(item), "boxpad"); + item = eventbox; + } + } + + gtk_container_border_width(GTK_CONTAINER(box), pad); gtk_container_add(GTK_CONTAINER(box), vbox); gtk_box_pack_end(GTK_BOX(vbox), item, TRUE, TRUE, 0); gtk_widget_show(vbox); @@ -4183,7 +4305,7 @@ { GtkWidget *label, *child, *oldlabel; gchar *text = NULL; - int _locked_by_me = FALSE; + int pad, _locked_by_me = FALSE; DW_MUTEX_LOCK; child = gtk_notebook_get_nth_page(GTK_NOTEBOOK(handle), pageid); @@ -4196,6 +4318,12 @@ label = gtk_label_new(text ? text : ""); + if(GTK_IS_TABLE(page)) + { + pad = (int)gtk_object_get_data(GTK_OBJECT(page), "boxpad"); + gtk_container_border_width(GTK_CONTAINER(page), pad); + } + gtk_notebook_insert_page(GTK_NOTEBOOK(handle), page, label, pageid); if(child) gtk_notebook_remove_page(GTK_NOTEBOOK(handle), pageid+1); @@ -4667,7 +4795,16 @@ * of the GtkTable class. */ if(GTK_IS_TABLE(item)) - pad = (int)gtk_object_get_data(GTK_OBJECT(item), "boxpad"); + { + GtkWidget *eventbox = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(item), "eventbox"); + + if(eventbox) + { + gtk_container_add(GTK_CONTAINER(eventbox), item); + pad = (int)gtk_object_get_data(GTK_OBJECT(item), "boxpad"); + item = eventbox; + } + } if(boxtype == BOXVERT) { @@ -4703,6 +4840,19 @@ { GtkWidget *vbox = gtk_vbox_new(FALSE, 0); + if(GTK_IS_TABLE(item)) + { + GtkWidget *eventbox = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(item), "eventbox"); + + if(eventbox) + { + gtk_container_add(GTK_CONTAINER(eventbox), item); + pad = (int)gtk_object_get_data(GTK_OBJECT(item), "boxpad"); + item = eventbox; + } + } + + gtk_container_border_width(GTK_CONTAINER(box), pad); gtk_container_add(GTK_CONTAINER(box), vbox); gtk_box_pack_end(GTK_BOX(vbox), item, TRUE, TRUE, 0); gtk_widget_show(vbox); @@ -5123,13 +5273,13 @@ /* * Let's demonstrate the functionality of this library. :) */ -int main(void) +int main(int argc, char *argv[]) { unsigned long flStyle = DW_FCF_SYSMENU | DW_FCF_TITLEBAR | DW_FCF_SHELLPOSITION | DW_FCF_TASKLIST | DW_FCF_DLGBORDER; int pageid; - dw_init(TRUE); + dw_init(TRUE, argc, argv); /* Try a little server dialog. :) */ mainwindow = dw_window_new(DW_DESKTOP, "Server", flStyle | DW_FCF_SIZEBORDER | DW_FCF_MINMAX);
--- a/win/dw.c Fri Nov 02 10:31:29 2001 +0000 +++ b/win/dw.c Mon Nov 05 10:56:39 2001 +0000 @@ -5864,7 +5864,9 @@ if (dwVersion < 0x80000000) { - if(env->MajorVersion == 5) + if(env->MajorVersion == 5 && env->MinorVersion == 1) + strcpy(env->osName, "Windows XP"); + else if(env->MajorVersion == 5 && env->MinorVersion == 0) strcpy(env->osName, "Windows 2000"); else strcpy(env->osName, "Windows NT");