diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2023-04-07 21:42:10 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-04-21 09:10:05 +0200 |
commit | 126b847fdd0607d90887443c75e8f3a81177b248 (patch) | |
tree | 1c155115e0878d3df917a2a3e935b1a593f740e1 | |
parent | dd6ea529f8ff86734c0d36b0b54e4a1c7e66fbc0 (diff) | |
download | gtk+-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.c | 14 |
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); |