Mercurial > dwindows
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 } |