comparison gtk4/dw.c @ 2331:addbd7db1e5c

GTK4: If parent passed to dw_menu_popup() is a GtkWindow, add the popup to the grid, and then remove it from the grid in the close callback.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 01 Mar 2021 12:12:31 +0000
parents 58700e9fcba3
children 594111e84e89
comparison
equal deleted inserted replaced
2330:58700e9fcba3 2331:addbd7db1e5c
3067 3067
3068 /* Delayed unparent of the popup menu from the parent */ 3068 /* Delayed unparent of the popup menu from the parent */
3069 gboolean _dw_idle_popover_unparent(gpointer data) 3069 gboolean _dw_idle_popover_unparent(gpointer data)
3070 { 3070 {
3071 GtkWidget *self = GTK_WIDGET(data); 3071 GtkWidget *self = GTK_WIDGET(data);
3072 3072 GtkWidget *box, *window = g_object_get_data(G_OBJECT(self), "_dw_window");
3073 gtk_widget_unparent(self); 3073
3074 if(window && GTK_IS_WINDOW(window) &&
3075 (box = g_object_get_data(G_OBJECT(window), "_dw_grid")) && GTK_IS_GRID(box))
3076 gtk_grid_remove(GTK_GRID(box), self);
3077 else
3078 gtk_widget_unparent(self);
3074 return false; 3079 return false;
3075 } 3080 }
3076 3081
3077 void _dw_popover_menu_closed(GtkPopover *self, gpointer data) 3082 void _dw_popover_menu_closed(GtkPopover *self, gpointer data)
3078 { 3083 {
3101 if(menu && *menu && G_MENU(*menu)) 3106 if(menu && *menu && G_MENU(*menu))
3102 { 3107 {
3103 GtkWidget *tmp = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(*menu), GTK_POPOVER_MENU_NESTED); 3108 GtkWidget *tmp = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(*menu), GTK_POPOVER_MENU_NESTED);
3104 GdkRectangle rect = { x, y, 1, 1 }; 3109 GdkRectangle rect = { x, y, 1, 1 };
3105 3110
3106 gtk_widget_set_parent(tmp, GTK_WIDGET(parent)); 3111 if(GTK_IS_WINDOW(parent))
3112 {
3113 GtkWidget *box = g_object_get_data(G_OBJECT(parent), "_dw_grid");
3114
3115 if(box && GTK_IS_GRID(box))
3116 {
3117 gtk_grid_attach(GTK_GRID(box), tmp, 65535, 65535, 1, 1);
3118 g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)parent);
3119 }
3120 }
3121 else
3122 gtk_widget_set_parent(tmp, GTK_WIDGET(parent));
3107 3123
3108 if(!g_object_get_data(G_OBJECT(*menu), "_dw_menuparent")) 3124 if(!g_object_get_data(G_OBJECT(*menu), "_dw_menuparent"))
3109 { 3125 {
3110 int menugroup = DW_POINTER_TO_INT(g_object_get_data(G_OBJECT(*menu), "_dw_menugroup")); 3126 int menugroup = DW_POINTER_TO_INT(g_object_get_data(G_OBJECT(*menu), "_dw_menugroup"));
3111 GSimpleActionGroup *group = g_object_get_data(G_OBJECT(*menu), "_dw_group"); 3127 GSimpleActionGroup *group = g_object_get_data(G_OBJECT(*menu), "_dw_group");