forked from AuroraMiddleware/gtk
wayland: Don't continue showing if xdg_popup creation failed
We don't create a grabbing popup if it's not the top most one, as that is a protocol violation, and complain if anything attempts to do it. What we didn't do is handle this gracefully in the code that tries to create said popup. Fix this by dropping the attempt to show the popup on the floor, instead of setting various state making it look like it succeeded. This won't actually fix anything, but it'll result in a bit more accurate warnings logged, as the state more correctly corresponds to the reality.
This commit is contained in:
parent
0a79eb02ac
commit
ab59459f7a
@ -2334,7 +2334,7 @@ can_map_grabbing_popup (GdkSurface *surface,
|
|||||||
return top_most_popup == parent;
|
return top_most_popup == parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
gdk_wayland_surface_create_xdg_popup (GdkSurface *surface,
|
gdk_wayland_surface_create_xdg_popup (GdkSurface *surface,
|
||||||
GdkSurface *parent,
|
GdkSurface *parent,
|
||||||
GdkWaylandSeat *grab_input_seat,
|
GdkWaylandSeat *grab_input_seat,
|
||||||
@ -2348,27 +2348,27 @@ gdk_wayland_surface_create_xdg_popup (GdkSurface *surface,
|
|||||||
gpointer positioner;
|
gpointer positioner;
|
||||||
|
|
||||||
if (!impl->display_server.wl_surface)
|
if (!impl->display_server.wl_surface)
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
if (!is_realized_shell_surface (parent))
|
if (!is_realized_shell_surface (parent))
|
||||||
return;
|
return FALSE;
|
||||||
|
|
||||||
if (is_realized_toplevel (surface))
|
if (is_realized_toplevel (surface))
|
||||||
{
|
{
|
||||||
g_warning ("Can't map popup, already mapped as toplevel");
|
g_warning ("Can't map popup, already mapped as toplevel");
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (is_realized_popup (surface))
|
if (is_realized_popup (surface))
|
||||||
{
|
{
|
||||||
g_warning ("Can't map popup, already mapped");
|
g_warning ("Can't map popup, already mapped");
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (grab_input_seat &&
|
if (grab_input_seat &&
|
||||||
!can_map_grabbing_popup (surface, parent))
|
!can_map_grabbing_popup (surface, parent))
|
||||||
{
|
{
|
||||||
g_warning ("Tried to map a grabbing popup with a non-top most parent");
|
g_warning ("Tried to map a grabbing popup with a non-top most parent");
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gdk_surface_freeze_updates (surface);
|
gdk_surface_freeze_updates (surface);
|
||||||
@ -2453,6 +2453,8 @@ gdk_wayland_surface_create_xdg_popup (GdkSurface *surface,
|
|||||||
display->current_grabbing_popups =
|
display->current_grabbing_popups =
|
||||||
g_list_prepend (display->current_grabbing_popups, surface);
|
g_list_prepend (display->current_grabbing_popups, surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GdkWaylandSeat *
|
static GdkWaylandSeat *
|
||||||
@ -2827,11 +2829,13 @@ gdk_wayland_surface_map_popup (GdkSurface *surface,
|
|||||||
grab_input_seat = find_grab_input_seat (surface, parent);
|
grab_input_seat = find_grab_input_seat (surface, parent);
|
||||||
else
|
else
|
||||||
grab_input_seat = NULL;
|
grab_input_seat = NULL;
|
||||||
gdk_wayland_surface_create_xdg_popup (surface,
|
|
||||||
|
if (!gdk_wayland_surface_create_xdg_popup (surface,
|
||||||
parent,
|
parent,
|
||||||
grab_input_seat,
|
grab_input_seat,
|
||||||
width, height,
|
width, height,
|
||||||
layout);
|
layout))
|
||||||
|
return;
|
||||||
|
|
||||||
impl->popup.layout = gdk_popup_layout_copy (layout);
|
impl->popup.layout = gdk_popup_layout_copy (layout);
|
||||||
impl->popup.unconstrained_width = width;
|
impl->popup.unconstrained_width = width;
|
||||||
|
Loading…
Reference in New Issue
Block a user