x11/display: Don't try to retrieve xwindow of wayland windows

Trying to get the xwindow of a wayland only window would fail when
casting to a x11 window. Which happens as
meta_x11_display_set_input_focus is called whenever the focused
window changes, whether it is a wayland or x11 one

Fixes: bc9cd123e ("window: Move xwindow to WindowX11")
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3506>
This commit is contained in:
Bilal Elmoussaoui 2024-01-09 21:18:09 +01:00
parent 5ad8a79823
commit 09b7cd9f4a

View File

@ -2088,10 +2088,14 @@ meta_x11_display_set_input_focus (MetaX11Display *x11_display,
MetaWindow *window, MetaWindow *window,
uint32_t timestamp) uint32_t timestamp)
{ {
Window xwindow; Window xwindow = x11_display->no_focus_window;
gulong serial; gulong serial;
#ifdef HAVE_X11
MetaDisplay *display = x11_display->display;
ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_display (display));
#endif
if (window) if (window && META_IS_WINDOW_X11 (window))
{ {
/* For output-only windows, focus the frame. /* For output-only windows, focus the frame.
* This seems to result in the client window getting key events * This seems to result in the client window getting key events
@ -2106,33 +2110,19 @@ meta_x11_display_set_input_focus (MetaX11Display *x11_display,
#ifdef HAVE_X11 #ifdef HAVE_X11
if (!meta_is_wayland_compositor ()) if (!meta_is_wayland_compositor ())
{
MetaDisplay *display = x11_display->display;
ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_display (display));
clutter_stage_set_key_focus (stage, NULL); clutter_stage_set_key_focus (stage, NULL);
} }
#endif else if (!meta_is_wayland_compositor () &&
} stage_has_focus_actor (x11_display))
else
{ {
#ifdef HAVE_X11
/* If we expect keyboard focus (e.g. there is a focused actor, keep /* If we expect keyboard focus (e.g. there is a focused actor, keep
* focus on the stage window, otherwise focus the no focus window. * focus on the stage window, otherwise focus the no focus window.
*/ */
if (!meta_is_wayland_compositor () &&
stage_has_focus_actor (x11_display))
{
MetaDisplay *display = x11_display->display;
ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_display (display));
xwindow = meta_x11_get_stage_window (stage); xwindow = meta_x11_get_stage_window (stage);
} }
else #else
}
#endif #endif
{
xwindow = x11_display->no_focus_window;
}
}
meta_topic (META_DEBUG_FOCUS, "Setting X11 input focus for window %s to 0x%lx", meta_topic (META_DEBUG_FOCUS, "Setting X11 input focus for window %s to 0x%lx",
window ? window->desc : "none", xwindow); window ? window->desc : "none", xwindow);