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;