Mercurial > dwindows
changeset 1452:dbe16031ffb4
Changes for GTK to make top-level windows act more like on other platforms.
Menubar should be separate from the rest of the layout... added a
Grid for GTK3 and Table for GTK2 to hold the menubar in a static position.
Also potential stability fixes when destroying a menubar from a window.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Wed, 14 Dec 2011 08:22:54 +0000 |
parents | 95ca625b8ffc |
children | 4b516ef23b62 |
files | gtk/dw.c gtk3/dw.c |
diffstat | 2 files changed, 34 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/gtk/dw.c Wed Dec 14 05:11:57 2011 +0000 +++ b/gtk/dw.c Wed Dec 14 08:22:54 2011 +0000 @@ -3405,7 +3405,10 @@ #endif { GtkWidget *box = dw_box_new(DW_VERT, 0); - + GtkWidget *table = gtk_table_new(2, 1, FALSE); + + gtk_widget_show_all(table); + last_window = tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(tmp), title); @@ -3454,8 +3457,10 @@ 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_table_attach(GTK_TABLE(table), box, 0, 1, 1, 2, GTK_EXPAND | GTK_FILL | GTK_SHRINK, GTK_EXPAND | GTK_FILL | GTK_SHRINK, 0, 0); + gtk_container_add(GTK_CONTAINER(tmp), table); gtk_object_set_data(GTK_OBJECT(tmp), "_dw_boxhandle", (gpointer)box); + gtk_object_set_data(GTK_OBJECT(tmp), "_dw_table", (gpointer)table); } gtk_object_set_data(GTK_OBJECT(tmp), "_dw_style", GINT_TO_POINTER(flStyle)); DW_MUTEX_UNLOCK; @@ -3711,7 +3716,7 @@ DW_MUTEX_LOCK; if(GTK_IS_WINDOW(location) && - (box = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_boxhandle"))) + (box = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_table"))) { /* If there is an existing menu bar, remove it */ GtkWidget *oldmenu = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(location), "_dw_menubar"); @@ -3722,9 +3727,10 @@ gtk_widget_show(tmp); accel_group = gtk_accel_group_new(); gtk_object_set_data(GTK_OBJECT(tmp), "_dw_accel", (gpointer)accel_group); + /* Save pointers to each other */ gtk_object_set_data(GTK_OBJECT(location), "_dw_menubar", (gpointer)tmp); - dw_box_pack_end(box, (HWND)tmp, -1, -1, TRUE, FALSE, 0); - + gtk_object_set_data(GTK_OBJECT(tmp), "_dw_window", (gpointer)location); + gtk_table_attach(GTK_TABLE(box), tmp, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); } DW_MUTEX_UNLOCK; return tmp; @@ -3740,8 +3746,14 @@ if(menu && *menu) { int _locked_by_me = FALSE; + GtkWidget *window; DW_MUTEX_LOCK; + /* If it is a menu bar, try to delete the reference to it */ + if(GTK_IS_MENU_BAR(*menu) && + (window = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(*menu), "_dw_window"))) + gtk_object_set_data(GTK_OBJECT(window), "_dw_menubar", NULL); + /* Actually destroy the menu */ gtk_widget_destroy(*menu); *menu = NULL; DW_MUTEX_UNLOCK;
--- a/gtk3/dw.c Wed Dec 14 05:11:57 2011 +0000 +++ b/gtk3/dw.c Wed Dec 14 08:22:54 2011 +0000 @@ -2892,7 +2892,10 @@ else { GtkWidget *box = dw_box_new(DW_VERT, 0); - + GtkWidget *grid = gtk_grid_new(); + + gtk_widget_show_all(grid); + last_window = tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(tmp), title); @@ -2935,8 +2938,10 @@ 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); + gtk_grid_attach(GTK_GRID(grid), box, 0, 1, 1, 1); + gtk_container_add(GTK_CONTAINER(tmp), grid); g_object_set_data(G_OBJECT(tmp), "_dw_boxhandle", (gpointer)box); + g_object_set_data(G_OBJECT(tmp), "_dw_grid", (gpointer)grid); } g_object_set_data(G_OBJECT(tmp), "_dw_style", GINT_TO_POINTER(flStyle)); DW_MUTEX_UNLOCK; @@ -3181,7 +3186,7 @@ DW_MUTEX_LOCK; if(GTK_IS_WINDOW(location) && - (box = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_boxhandle"))) + (box = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_grid"))) { /* If there is an existing menu bar, remove it */ GtkWidget *oldmenu = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_menubar"); @@ -3192,8 +3197,10 @@ gtk_widget_show(tmp); accel_group = gtk_accel_group_new(); g_object_set_data(G_OBJECT(tmp), "_dw_accel", (gpointer)accel_group); + /* Save pointers to each other */ g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); - dw_box_pack_end(box, (HWND)tmp, -1, -1, TRUE, FALSE, 0); + g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location); + gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1); } DW_MUTEX_UNLOCK; return tmp; @@ -3209,8 +3216,14 @@ if(menu && *menu) { int _locked_by_me = FALSE; + GtkWidget *window; DW_MUTEX_LOCK; + /* If it is a menu bar, try to delete the reference to it */ + if(GTK_IS_MENU_BAR(*menu) && + (window = (GtkWidget *)g_object_get_data(G_OBJECT(*menu), "_dw_window"))) + g_object_set_data(G_OBJECT(window), "_dw_menubar", NULL); + /* Actually destroy the menu */ gtk_widget_destroy(*menu); *menu = NULL; DW_MUTEX_UNLOCK;