diff gtk/dw.c @ 12:26e2130135b9

Many Win32 and GTK fixes.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 06 Jul 2001 13:32:57 +0000
parents 005fa766e8c2
children 176cee043f1b
line wrap: on
line diff
--- a/gtk/dw.c	Fri Jul 06 13:32:00 2001 +0000
+++ b/gtk/dw.c	Fri Jul 06 13:32:57 2001 +0000
@@ -612,6 +612,9 @@
 {
 	int _locked_by_me = FALSE;
 
+	if(!handle)
+		return 0;
+
 	DW_MUTEX_LOCK;
 	gtk_widget_show(handle);
 	DW_MUTEX_UNLOCK;
@@ -627,6 +630,9 @@
 {
 	int _locked_by_me = FALSE;
 
+	if(!handle)
+		return 0;
+
 	DW_MUTEX_LOCK;
 	gtk_widget_hide(handle);
 	DW_MUTEX_UNLOCK;
@@ -642,6 +648,9 @@
 {
 	int _locked_by_me = FALSE;
 
+	if(!handle)
+		return 0;
+
 	DW_MUTEX_LOCK;
 	gtk_widget_destroy(handle);
 	DW_MUTEX_UNLOCK;
@@ -723,15 +732,15 @@
 		gdk_color_alloc(_dw_cmap, &backcolor);
 
 		style = gtk_widget_get_style(handle);
-		style->fg[0] = forecolor;
-		style->bg[0] = backcolor;
+		style->fg[1] = style->fg[0] = forecolor;
+		style->base[0] = style->base[1] = style->bg[0] = style->bg[1] = backcolor;
 		gtk_widget_set_style(handle, style);
 	}
 	else
 	{
 		style = gtk_widget_get_style(handle);
-		style->fg[0] = _colors[fore];
-		style->bg[0] = _colors[back];
+		style->fg[1] = style->fg[0] = _colors[fore];
+		style->base[0] = style->base[1] = style->bg[0] = style->bg[1] = _colors[back];
 		gtk_widget_set_style(handle, style);
 	}
 
@@ -757,6 +766,13 @@
 		if(tmp)
 			handle2 = tmp;
 	}
+	else if(GTK_IS_BOX(handle))
+	{
+		GtkWidget *tmp = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(handle), "mle");
+		if(tmp)
+			handle2 = tmp;
+	}
+
 
 	gtk_object_set_data(GTK_OBJECT(handle2), "fore", (gpointer)fore);
 	gtk_object_set_data(GTK_OBJECT(handle2), "back", (gpointer)back);
@@ -1046,7 +1062,7 @@
 {
 	GtkWidget *tmphandle;
 	char accel, *tempbuf = malloc(strlen(title)+1);
-	int _locked_by_me = FALSE;
+	int _locked_by_me = FALSE, submenucount;
 	guint tmp_key;
 	GtkAccelGroup *accel_group;
 
@@ -1060,6 +1076,7 @@
 	accel = _removetilde(tempbuf, title);
 
 	accel_group = (GtkAccelGroup *)gtk_object_get_data(GTK_OBJECT(menu->menu), "accel");
+	submenucount = (int)gtk_object_get_data(GTK_OBJECT(menu->menu), "submenucount");
 
 	if(strlen(tempbuf) == 0)
 		tmphandle=gtk_menu_item_new();
@@ -1096,7 +1113,15 @@
 	gtk_widget_show(tmphandle);
 
 	if(submenu)
+	{
+		char tempbuf[100];
+
+		sprintf(tempbuf, "submenu%d", submenucount);
+		submenucount++;
 		gtk_menu_item_set_submenu(GTK_MENU_ITEM(tmphandle), submenu->menu);
+		gtk_object_set_data(GTK_OBJECT(menu->menu), tempbuf, (gpointer)submenu->menu);
+		gtk_object_set_data(GTK_OBJECT(menu->menu), "submenucount", (gpointer)submenucount);
+	}
 
 	if(GTK_IS_MENU_BAR(menu->menu))
 		gtk_menu_bar_append(GTK_MENU_BAR(menu->menu), tmphandle);
@@ -1109,6 +1134,30 @@
 	return tmphandle;
 }
 
+GtkWidget *_find_submenu_id(GtkWidget *start, char *name)
+{
+	GtkWidget *tmp;
+	int z, submenucount = (int)gtk_object_get_data(GTK_OBJECT(start), "submenucount");
+
+	if((tmp = gtk_object_get_data(GTK_OBJECT(start), name)))
+		return tmp;
+
+	for(z=0;z<submenucount;z++)
+	{
+		char tempbuf[100];
+		GtkWidget *submenu, *menuitem;
+
+		sprintf(tempbuf, "submenu%d", z);
+
+		if((submenu = gtk_object_get_data(GTK_OBJECT(start), tempbuf)))
+		{
+			if((menuitem = _find_submenu_id(submenu, name)))
+				return menuitem;
+		}
+	}
+	return NULL;
+}
+
 /*
  * Sets the state of a menu item check.
  * Parameters:
@@ -1116,7 +1165,7 @@
  *       id: Menuitem id.
  *       check: TRUE for checked FALSE for not checked.
  */
-void dw_menu_item_set_check(HMENUI menu, int id, int check)
+void dw_menu_item_set_check(HMENUI menu, unsigned long id, int check)
 {
 	char numbuf[10];
 	GtkWidget *tmphandle;
@@ -1126,8 +1175,8 @@
 		return;
 
 	DW_MUTEX_LOCK;
-	sprintf(numbuf, "%d", id);
-	tmphandle = gtk_object_get_data(GTK_OBJECT(menu->menu), numbuf);
+	sprintf(numbuf, "%lu", id);
+	tmphandle = _find_submenu_id(menu->menu, numbuf);
 
 	if(tmphandle)
 	{
@@ -3222,7 +3271,7 @@
 	int _locked_by_me = FALSE;
 	gint gx, gy, gwidth, gheight, gdepth;
 
-	if(handle->window)
+	if(handle && handle->window)
 	{
 		DW_MUTEX_LOCK;
 		gdk_window_get_geometry(handle->window, &gx, &gy, &gwidth, &gheight, &gdepth);