summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2023-04-07 21:42:10 +0200
committerMatthias Clasen <mclasen@redhat.com>2023-04-21 09:10:05 +0200
commit126b847fdd0607d90887443c75e8f3a81177b248 (patch)
tree1c155115e0878d3df917a2a3e935b1a593f740e1
parentdd6ea529f8ff86734c0d36b0b54e4a1c7e66fbc0 (diff)
downloadgtk+-126b847fdd0607d90887443c75e8f3a81177b248.tar.gz
gtkpopover: Move GTK grabs to map/unmap
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
-rw-r--r--gtk/gtkpopover.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index e60f9ea4df..f7fe4e4d82 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -1078,20 +1078,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);
@@ -1138,6 +1130,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
@@ -1147,6 +1142,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);