# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1614600751 0 # Node ID addbd7db1e5c679fd41a23a9218e6c32a3f70adb # Parent 58700e9fcba34ea61ef6b0e9c53f41cd2fb698ad 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. diff -r 58700e9fcba3 -r addbd7db1e5c gtk4/dw.c --- a/gtk4/dw.c Mon Mar 01 01:31:12 2021 +0000 +++ b/gtk4/dw.c Mon Mar 01 12:12:31 2021 +0000 @@ -3069,8 +3069,13 @@ gboolean _dw_idle_popover_unparent(gpointer data) { GtkWidget *self = GTK_WIDGET(data); - - gtk_widget_unparent(self); + GtkWidget *box, *window = g_object_get_data(G_OBJECT(self), "_dw_window"); + + if(window && GTK_IS_WINDOW(window) && + (box = g_object_get_data(G_OBJECT(window), "_dw_grid")) && GTK_IS_GRID(box)) + gtk_grid_remove(GTK_GRID(box), self); + else + gtk_widget_unparent(self); return false; } @@ -3103,7 +3108,18 @@ GtkWidget *tmp = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(*menu), GTK_POPOVER_MENU_NESTED); GdkRectangle rect = { x, y, 1, 1 }; - gtk_widget_set_parent(tmp, GTK_WIDGET(parent)); + if(GTK_IS_WINDOW(parent)) + { + GtkWidget *box = g_object_get_data(G_OBJECT(parent), "_dw_grid"); + + if(box && GTK_IS_GRID(box)) + { + gtk_grid_attach(GTK_GRID(box), tmp, 65535, 65535, 1, 1); + g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)parent); + } + } + else + gtk_widget_set_parent(tmp, GTK_WIDGET(parent)); if(!g_object_get_data(G_OBJECT(*menu), "_dw_menuparent")) {