comparison gtk3/dw.c @ 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 77f530f95826
comparison
equal deleted inserted replaced
1451:95ca625b8ffc 1452:dbe16031ffb4
2890 gtk_mdi_put(GTK_MDI(hwndOwner), tmp, 100, 75, label); 2890 gtk_mdi_put(GTK_MDI(hwndOwner), tmp, 100, 75, label);
2891 } 2891 }
2892 else 2892 else
2893 { 2893 {
2894 GtkWidget *box = dw_box_new(DW_VERT, 0); 2894 GtkWidget *box = dw_box_new(DW_VERT, 0);
2895 2895 GtkWidget *grid = gtk_grid_new();
2896
2897 gtk_widget_show_all(grid);
2898
2896 last_window = tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL); 2899 last_window = tmp = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2897 2900
2898 gtk_window_set_title(GTK_WINDOW(tmp), title); 2901 gtk_window_set_title(GTK_WINDOW(tmp), title);
2899 if(!(flStyle & DW_FCF_SIZEBORDER)) 2902 if(!(flStyle & DW_FCF_SIZEBORDER))
2900 gtk_window_set_resizable(GTK_WINDOW(tmp), FALSE); 2903 gtk_window_set_resizable(GTK_WINDOW(tmp), FALSE);
2933 gdk_window_reparent(gtk_widget_get_window(GTK_WIDGET(tmp)), gtk_widget_get_window(GTK_WIDGET(hwndOwner)), 0, 0); 2936 gdk_window_reparent(gtk_widget_get_window(GTK_WIDGET(tmp)), gtk_widget_get_window(GTK_WIDGET(hwndOwner)), 0, 0);
2934 2937
2935 if(flStyle & DW_FCF_SIZEBORDER) 2938 if(flStyle & DW_FCF_SIZEBORDER)
2936 g_object_set_data(G_OBJECT(tmp), "_dw_size", GINT_TO_POINTER(1)); 2939 g_object_set_data(G_OBJECT(tmp), "_dw_size", GINT_TO_POINTER(1));
2937 2940
2938 gtk_container_add(GTK_CONTAINER(tmp), box); 2941 gtk_grid_attach(GTK_GRID(grid), box, 0, 1, 1, 1);
2942 gtk_container_add(GTK_CONTAINER(tmp), grid);
2939 g_object_set_data(G_OBJECT(tmp), "_dw_boxhandle", (gpointer)box); 2943 g_object_set_data(G_OBJECT(tmp), "_dw_boxhandle", (gpointer)box);
2944 g_object_set_data(G_OBJECT(tmp), "_dw_grid", (gpointer)grid);
2940 } 2945 }
2941 g_object_set_data(G_OBJECT(tmp), "_dw_style", GINT_TO_POINTER(flStyle)); 2946 g_object_set_data(G_OBJECT(tmp), "_dw_style", GINT_TO_POINTER(flStyle));
2942 DW_MUTEX_UNLOCK; 2947 DW_MUTEX_UNLOCK;
2943 return tmp; 2948 return tmp;
2944 } 2949 }
3179 GtkWidget *box; 3184 GtkWidget *box;
3180 HMENUI tmp = 0; 3185 HMENUI tmp = 0;
3181 3186
3182 DW_MUTEX_LOCK; 3187 DW_MUTEX_LOCK;
3183 if(GTK_IS_WINDOW(location) && 3188 if(GTK_IS_WINDOW(location) &&
3184 (box = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_boxhandle"))) 3189 (box = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_grid")))
3185 { 3190 {
3186 /* If there is an existing menu bar, remove it */ 3191 /* If there is an existing menu bar, remove it */
3187 GtkWidget *oldmenu = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_menubar"); 3192 GtkWidget *oldmenu = (GtkWidget *)g_object_get_data(G_OBJECT(location), "_dw_menubar");
3188 if(oldmenu) 3193 if(oldmenu)
3189 gtk_widget_destroy(oldmenu); 3194 gtk_widget_destroy(oldmenu);
3190 /* Create a new menu bar */ 3195 /* Create a new menu bar */
3191 tmp = gtk_menu_bar_new(); 3196 tmp = gtk_menu_bar_new();
3192 gtk_widget_show(tmp); 3197 gtk_widget_show(tmp);
3193 accel_group = gtk_accel_group_new(); 3198 accel_group = gtk_accel_group_new();
3194 g_object_set_data(G_OBJECT(tmp), "_dw_accel", (gpointer)accel_group); 3199 g_object_set_data(G_OBJECT(tmp), "_dw_accel", (gpointer)accel_group);
3200 /* Save pointers to each other */
3195 g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); 3201 g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp);
3196 dw_box_pack_end(box, (HWND)tmp, -1, -1, TRUE, FALSE, 0); 3202 g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location);
3203 gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1);
3197 } 3204 }
3198 DW_MUTEX_UNLOCK; 3205 DW_MUTEX_UNLOCK;
3199 return tmp; 3206 return tmp;
3200 } 3207 }
3201 3208
3207 void dw_menu_destroy(HMENUI *menu) 3214 void dw_menu_destroy(HMENUI *menu)
3208 { 3215 {
3209 if(menu && *menu) 3216 if(menu && *menu)
3210 { 3217 {
3211 int _locked_by_me = FALSE; 3218 int _locked_by_me = FALSE;
3219 GtkWidget *window;
3212 3220
3213 DW_MUTEX_LOCK; 3221 DW_MUTEX_LOCK;
3222 /* If it is a menu bar, try to delete the reference to it */
3223 if(GTK_IS_MENU_BAR(*menu) &&
3224 (window = (GtkWidget *)g_object_get_data(G_OBJECT(*menu), "_dw_window")))
3225 g_object_set_data(G_OBJECT(window), "_dw_menubar", NULL);
3226 /* Actually destroy the menu */
3214 gtk_widget_destroy(*menu); 3227 gtk_widget_destroy(*menu);
3215 *menu = NULL; 3228 *menu = NULL;
3216 DW_MUTEX_UNLOCK; 3229 DW_MUTEX_UNLOCK;
3217 } 3230 }
3218 } 3231 }