diff --git a/gdk/gdksurface.c b/gdk/gdksurface.c index 9f26ff828d..6c8195523b 100644 --- a/gdk/gdksurface.c +++ b/gdk/gdksurface.c @@ -2783,6 +2783,18 @@ gdk_synthesize_surface_state (GdkSurface *surface, gdk_surface_set_state (surface, (surface->state | set_flags) & ~unset_flags); } +static void +hide_popup_chain (GdkSurface *surface) +{ + GdkSurface *parent; + + gdk_surface_hide (surface); + + parent = surface->parent; + if (parent->autohide) + hide_popup_chain (parent); +} + static gboolean check_autohide (GdkEvent *event) { @@ -2812,7 +2824,7 @@ check_autohide (GdkEvent *event) if (grab_surface != gdk_event_get_surface (event) && grab_surface->autohide) { - gdk_surface_hide (grab_surface); + hide_popup_chain (grab_surface); return TRUE; } } diff --git a/gdk/wayland/gdksurface-wayland.c b/gdk/wayland/gdksurface-wayland.c index 5b6c08a5fe..c644608031 100644 --- a/gdk/wayland/gdksurface-wayland.c +++ b/gdk/wayland/gdksurface-wayland.c @@ -2334,7 +2334,7 @@ can_map_grabbing_popup (GdkSurface *surface, return top_most_popup == parent; } -static void +static gboolean gdk_wayland_surface_create_xdg_popup (GdkSurface *surface, GdkSurface *parent, GdkWaylandSeat *grab_input_seat, @@ -2348,27 +2348,27 @@ gdk_wayland_surface_create_xdg_popup (GdkSurface *surface, gpointer positioner; if (!impl->display_server.wl_surface) - return; + return FALSE; if (!is_realized_shell_surface (parent)) - return; + return FALSE; if (is_realized_toplevel (surface)) { g_warning ("Can't map popup, already mapped as toplevel"); - return; + return FALSE; } if (is_realized_popup (surface)) { g_warning ("Can't map popup, already mapped"); - return; + return FALSE; } if (grab_input_seat && !can_map_grabbing_popup (surface, parent)) { g_warning ("Tried to map a grabbing popup with a non-top most parent"); - return; + return FALSE; } gdk_surface_freeze_updates (surface); @@ -2453,6 +2453,8 @@ gdk_wayland_surface_create_xdg_popup (GdkSurface *surface, display->current_grabbing_popups = g_list_prepend (display->current_grabbing_popups, surface); } + + return TRUE; } static GdkWaylandSeat * @@ -2827,11 +2829,13 @@ gdk_wayland_surface_map_popup (GdkSurface *surface, grab_input_seat = find_grab_input_seat (surface, parent); else grab_input_seat = NULL; - gdk_wayland_surface_create_xdg_popup (surface, - parent, - grab_input_seat, - width, height, - layout); + + if (!gdk_wayland_surface_create_xdg_popup (surface, + parent, + grab_input_seat, + width, height, + layout)) + return; impl->popup.layout = gdk_popup_layout_copy (layout); impl->popup.unconstrained_width = width; diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c index 11dd3f273b..4a2893b324 100644 --- a/gtk/gtkpopover.c +++ b/gtk/gtkpopover.c @@ -550,9 +550,9 @@ present_popup (GtkPopover *popover) layout = create_popup_layout (popover); gtk_widget_get_preferred_size (GTK_WIDGET (popover), NULL, &req); if (gdk_popup_present (GDK_POPUP (priv->surface), - MAX (req.width, 1), - MAX (req.height, 1), - layout)) + MAX (req.width, 1), + MAX (req.height, 1), + layout)) update_popover_layout (popover, layout); }