mirror of
https://github.com/brl/mutter.git
synced 2024-11-27 18:40:40 -05:00
wayland: Ensure we don't focus xdg_popups iff they're non-grabbing
Commit 4295fdb892
made us skip focusing
all xdg_popups instead of just non-grabbing ones as intended. This
means that when unmanaging a window we might select a xdg_popup window
to focus (in meta_stack_get_default_focus_window() ) but then since we
don't actually focus it we go on unmanaging the focused window which
triggers an assertion, as it should.
To avoid this and still fixing bug 771694 we can make use of the
MetaWindow->input property for non-grabbing xdg_popup windows since
their semantics, in this regard, are the same as no input X11 windows.
This way, when unmanaging a focused window while a xdg_popup is up,
we'll either give focus to the xdg_popup or not select the popup at
all to be focused if it's non-grabbing.
https://bugzilla.gnome.org/show_bug.cgi?id=775986
This commit is contained in:
parent
497a94fac7
commit
d9fc81e702
@ -839,6 +839,17 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
|||||||
|
|
||||||
xdg_popup->popup = popup;
|
xdg_popup->popup = popup;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The keyboard focus semantics for non-grabbing zxdg_shell_v6 popups
|
||||||
|
* is pretty undefined. Same applies for subsurfaces, but in practice,
|
||||||
|
* subsurfaces never receive keyboard focus, so it makes sense to
|
||||||
|
* do the same for non-grabbing popups.
|
||||||
|
*
|
||||||
|
* See https://bugzilla.gnome.org/show_bug.cgi?id=771694#c24
|
||||||
|
*/
|
||||||
|
window->input = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -117,24 +117,11 @@ static void
|
|||||||
meta_window_wayland_focus (MetaWindow *window,
|
meta_window_wayland_focus (MetaWindow *window,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
MetaWaylandSurface *surface = window->surface;
|
if (window->input)
|
||||||
MetaWaylandSurfaceRoleShellSurface *shell_surface_role =
|
meta_display_set_input_focus_window (window->display,
|
||||||
META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE (surface->role);
|
window,
|
||||||
|
FALSE,
|
||||||
/* The keyboard focus semantics for non-grabbing zxdg_shell_v6 popups
|
timestamp);
|
||||||
* is pretty undefined. Same applies for subsurfaces, but in practice,
|
|
||||||
* subsurfaces never receive keyboard focus, so it makes sense to
|
|
||||||
* do the same for non-grabbing popups.
|
|
||||||
*
|
|
||||||
* See https://bugzilla.gnome.org/show_bug.cgi?id=771694#c24
|
|
||||||
*/
|
|
||||||
if (META_IS_WAYLAND_XDG_POPUP (shell_surface_role))
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_display_set_input_focus_window (window->display,
|
|
||||||
window,
|
|
||||||
FALSE,
|
|
||||||
timestamp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user