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(&gtkthread, NULL, func, data);
+	void **tmp = malloc(sizeof(void *) * 2);
+
+	tmp[0] = func;
+	tmp[1] = data;
+
+	pthread_create(&gtkthread, 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");