# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1323839517 0 # Node ID 95ca625b8ffc3dbafa5dc6dc3a2c97224a2dfac4 # Parent 145edf67013ef42521209f0b1a2f3726184456e7 Removed GtkVbox and associated code from top-level windows on GTK. Replaced it with a with a GtkTable based vertical box. More than one item can be packed into the top-level window on GTK. diff -r 145edf67013e -r 95ca625b8ffc gtk/dw.c --- a/gtk/dw.c Wed Dec 14 01:19:50 2011 +0000 +++ b/gtk/dw.c Wed Dec 14 05:11:57 2011 +0000 @@ -3404,6 +3404,8 @@ else #endif { + GtkWidget *box = dw_box_new(DW_VERT, 0); + last_window = tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(tmp), title); @@ -3451,6 +3453,9 @@ if(flStyle & DW_FCF_SIZEBORDER) gtk_object_set_data(GTK_OBJECT(tmp), "_dw_size", GINT_TO_POINTER(1)); + + gtk_container_add(GTK_CONTAINER(tmp), box); + gtk_object_set_data(GTK_OBJECT(tmp), "_dw_boxhandle", (gpointer)box); } gtk_object_set_data(GTK_OBJECT(tmp), "_dw_style", GINT_TO_POINTER(flStyle)); DW_MUTEX_UNLOCK; @@ -3699,23 +3704,28 @@ */ HMENUI dw_menubar_new(HWND location) { - GtkWidget *box; int _locked_by_me = FALSE; GtkAccelGroup *accel_group; - HMENUI tmp; - - DW_MUTEX_LOCK; - tmp = gtk_menu_bar_new(); - box = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(location)); - gtk_widget_show(tmp); - accel_group = gtk_accel_group_new(); - gtk_object_set_data(GTK_OBJECT(tmp), "_dw_accel", (gpointer)accel_group); - - if (box) - gtk_box_pack_end(GTK_BOX(box), tmp, FALSE, FALSE, 0); - else - fprintf(stderr,"dw_menubar_new(): Coding error: You MUST pack a box into the window in which this menubar is to be added BEFORE calling this function.\n"); - + GtkWidget *box; + HMENUI tmp = 0; + + DW_MUTEX_LOCK; + if(GTK_IS_WINDOW(location) && + (box = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_boxhandle"))) + { + /* If there is an existing menu bar, remove it */ + GtkWidget *oldmenu = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_menubar"); + if(oldmenu) + gtk_widget_destroy(oldmenu); + /* Create a new menu bar */ + tmp = gtk_menu_bar_new(); + gtk_widget_show(tmp); + accel_group = gtk_accel_group_new(); + gtk_object_set_data(GTK_OBJECT(tmp), "_dw_accel", (gpointer)accel_group); + gtk_object_set_data(GTK_OBJECT(location), "_dw_menubar", (gpointer)tmp); + dw_box_pack_end(box, (HWND)tmp, -1, -1, TRUE, FALSE, 0); + + } DW_MUTEX_UNLOCK; return tmp; } @@ -9922,17 +9932,23 @@ DW_MUTEX_LOCK; + /* If this is a special box, like: Window, Groupbox, Scrollbox... + * get the internal box handle. + */ if((tmp = gtk_object_get_data(GTK_OBJECT(box), "_dw_boxhandle"))) box = tmp; + /* Can't pack nothing with GTK, so create an empty label */ if(!item) { item = gtk_label_new(""); gtk_widget_show_all(item); } + /* Check if the item to be packed is a special box */ tmpitem = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(item), "_dw_boxhandle"); + /* Make sure our target box is valid */ if(GTK_IS_TABLE(box)) { int boxcount = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(box), "_dw_boxcount")); @@ -10006,48 +10022,6 @@ gtk_object_set_data(GTK_OBJECT(box), "_dw_group", (gpointer)item); } } - else - { - GtkWidget *vbox = gtk_object_get_data(GTK_OBJECT(box), "_dw_vbox"); - - if(!vbox) - { - vbox = gtk_vbox_new(FALSE, 0); - gtk_object_set_data(GTK_OBJECT(box), "_dw_vbox", vbox); - gtk_container_add(GTK_CONTAINER(box), vbox); - gtk_widget_show(vbox); - } - - gtk_container_set_border_width(GTK_CONTAINER(box), pad); - - if(GTK_IS_TABLE(item) || (tmpitem && GTK_IS_TABLE(tmpitem))) - { - GtkWidget *eventbox = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(item), "_dw_eventbox"); - - /* NOTE: I left in the ability to pack boxes with a size, - * this eliminates that by forcing the size to 0. - */ - height = width = 0; - - if(eventbox) - { - int boxpad = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(item), "_dw_boxpad")); - gtk_container_add(GTK_CONTAINER(eventbox), item); - gtk_container_set_border_width(GTK_CONTAINER(eventbox), boxpad); - item = eventbox; - } - } - else - { - /* Only show warning if item is not a box */ - warn = TRUE; - } - - gtk_box_pack_end(GTK_BOX(vbox), item, TRUE, TRUE, 0); - - gtk_widget_set_usize(item, width, height); - gtk_object_set_user_data(GTK_OBJECT(box), vbox); - } DW_MUTEX_UNLOCK; if(warn) diff -r 145edf67013e -r 95ca625b8ffc gtk3/dw.c --- a/gtk3/dw.c Wed Dec 14 01:19:50 2011 +0000 +++ b/gtk3/dw.c Wed Dec 14 05:11:57 2011 +0000 @@ -2891,6 +2891,8 @@ } else { + GtkWidget *box = dw_box_new(DW_VERT, 0); + last_window = tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(tmp), title); @@ -2932,6 +2934,9 @@ if(flStyle & DW_FCF_SIZEBORDER) g_object_set_data(G_OBJECT(tmp), "_dw_size", GINT_TO_POINTER(1)); + + gtk_container_add(GTK_CONTAINER(tmp), box); + g_object_set_data(G_OBJECT(tmp), "_dw_boxhandle", (gpointer)box); } g_object_set_data(G_OBJECT(tmp), "_dw_style", GINT_TO_POINTER(flStyle)); DW_MUTEX_UNLOCK; @@ -3169,23 +3174,27 @@ */ HMENUI dw_menubar_new(HWND location) { - GtkWidget *box; int _locked_by_me = FALSE; GtkAccelGroup *accel_group; - HMENUI tmp; - - DW_MUTEX_LOCK; - tmp = gtk_menu_bar_new(); - box = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_user"); - gtk_widget_show(tmp); - accel_group = gtk_accel_group_new(); - g_object_set_data(G_OBJECT(tmp), "_dw_accel", (gpointer)accel_group); - - if (box) - gtk_box_pack_end(GTK_BOX(box), tmp, FALSE, FALSE, 0); - else - fprintf(stderr,"dw_menubar_new(): Coding error: You MUST pack a box into the window in which this menubar is to be added BEFORE calling this function.\n"); - + GtkWidget *box; + HMENUI tmp = 0; + + DW_MUTEX_LOCK; + if(GTK_IS_WINDOW(location) && + (box = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_boxhandle"))) + { + /* If there is an existing menu bar, remove it */ + GtkWidget *oldmenu = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_menubar"); + if(oldmenu) + gtk_widget_destroy(oldmenu); + /* Create a new menu bar */ + tmp = gtk_menu_bar_new(); + gtk_widget_show(tmp); + accel_group = gtk_accel_group_new(); + g_object_set_data(G_OBJECT(tmp), "_dw_accel", (gpointer)accel_group); + g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); + dw_box_pack_end(box, (HWND)tmp, -1, -1, TRUE, FALSE, 0); + } DW_MUTEX_UNLOCK; return tmp; } @@ -8277,14 +8286,21 @@ DW_MUTEX_LOCK; + /* If this is a special box, like: Window, Groupbox, Scrollbox... + * get the internal box handle. + */ if((tmp = g_object_get_data(G_OBJECT(box), "_dw_boxhandle"))) box = tmp; + /* Can't pack nothing with GTK, so create an empty label */ if(!item) { item = gtk_label_new(""); gtk_widget_show_all(item); } + /* Due to GTK3 minimum size limitations, if we are packing a widget + * with an image, we need to scale the image down to fit the packed size. + */ else if((image = g_object_get_data(G_OBJECT(item), "_dw_bitmap"))) { GdkPixbuf *pixbuf = gtk_image_get_pixbuf(GTK_IMAGE(image)); @@ -8305,8 +8321,10 @@ } } + /* Check if the item to be packed is a special box */ tmpitem = (GtkWidget *)g_object_get_data(G_OBJECT(item), "_dw_boxhandle"); + /* Make sure our target box is valid */ if(GTK_IS_GRID(box)) { int boxcount = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(box), "_dw_boxcount")); @@ -8405,48 +8423,6 @@ g_object_set_data(G_OBJECT(box), "_dw_group", (gpointer)item); } } - else - { - GtkWidget *vbox = g_object_get_data(G_OBJECT(box), "_dw_vbox"); - - if(!vbox) - { - vbox = gtk_vbox_new(FALSE, 0); - g_object_set_data(G_OBJECT(box), "_dw_vbox", vbox); - gtk_container_add(GTK_CONTAINER(box), vbox); - gtk_widget_show(vbox); - } - - gtk_container_set_border_width(GTK_CONTAINER(box), pad); - - if(GTK_IS_GRID(item) || (tmpitem && GTK_IS_GRID(tmpitem))) - { - GtkWidget *eventbox = (GtkWidget *)g_object_get_data(G_OBJECT(item), "_dw_eventbox"); - - /* NOTE: I left in the ability to pack boxes with a size, - * this eliminates that by forcing the size to 0. - */ - height = width = 0; - - if(eventbox) - { - int boxpad = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(item), "_dw_boxpad")); - gtk_container_add(GTK_CONTAINER(eventbox), item); - gtk_container_set_border_width(GTK_CONTAINER(eventbox), boxpad); - item = eventbox; - } - } - else - { - /* Only show warning if item is not a box */ - warn = TRUE; - } - - gtk_box_pack_end(GTK_BOX(vbox), item, TRUE, TRUE, 0); - - gtk_widget_set_size_request(item, width, height); - g_object_set_data(G_OBJECT(box), "_dw_user", vbox); - } DW_MUTEX_UNLOCK; if(warn)