gtkpopover: Move GTK grabs to map/unmap
authorCarlos Garnacho <carlosg@gnome.org>
Fri, 7 Apr 2023 19:42:10 +0000 (21:42 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 7 Apr 2023 20:12:41 +0000 (22:12 +0200)
Typically, a popover gets mapped when shown and unmapped when
hidden. A situation there that breaks is where the popover gets
recursively unmapped/unrealized when its root is destroyed.

In that situation, the popover does however unmap (without being
hidden first), moving the GTK grab from show/hide to map/unmap
will handle the previous situations, plus this one.

Fixes things being unclickable if e.g. a modal dialog got a
popover popped up, then got closed via Alt-F4.

Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/5730
gtk/gtkpopover.c

index cf90a3bd7dcfcb79caa2701092d4fd103f7ed547..90d7df6ffbb9b0dc7d4c5d43d6f90fde031f82db 100644 (file)
@@ -1087,20 +1087,12 @@ gtk_popover_show (GtkWidget *widget)
     {
       if (!gtk_widget_get_focus_child (widget))
         gtk_widget_child_focus (widget, GTK_DIR_TAB_FORWARD);
-
-      gtk_grab_add (widget);
     }
 }
 
 static void
 gtk_popover_hide (GtkWidget *widget)
 {
-  GtkPopover *popover = GTK_POPOVER (widget);
-  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
-
-  if (priv->autohide)
-    gtk_grab_remove (widget);
-
   gtk_popover_set_mnemonics_visible (GTK_POPOVER (widget), FALSE);
   _gtk_widget_set_visible_flag (widget, FALSE);
   gtk_widget_unmap (widget);
@@ -1147,6 +1139,9 @@ gtk_popover_map (GtkWidget *widget)
                                                        unset_surface_transform_changed_cb);
 
   GTK_WIDGET_CLASS (gtk_popover_parent_class)->map (widget);
+
+  if (priv->autohide)
+    gtk_grab_add (widget);
 }
 
 static void
@@ -1156,6 +1151,9 @@ gtk_popover_unmap (GtkWidget *widget)
   GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
   GtkWidget *parent;
 
+  if (priv->autohide)
+    gtk_grab_remove (widget);
+
   parent = gtk_widget_get_parent (widget);
   gtk_widget_remove_surface_transform_changed_callback (parent,
                                                         priv->surface_transform_changed_cb);