changeset 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
files gtk4/dw.c
diffstat 1 files changed, 19 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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"))
       {