From efe5bed5b4a8706fc796dfd7dc07562a866c12ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 31 Oct 2019 07:36:52 +0100 Subject: [PATCH] x11-display: Don't unset the X11 focused window after setting one When using DesktopIcons extension and clicking in an icon, gnome-shell starts an infinite loop caused by the first focus change that may trigger on X11 a focus in/out event that leads to stage activation/deactivation which never ends. This happens because as part of meta_x11_display_set_input_focus_xwindow() to focus the X11 stage window, we unset the display focus, but this also causes to request the X11 display to unset the focus since we convolute by calling meta_x11_display_set_input_focus() with no window, that leads to focusing the no_focus_window and then a focus-in / focus-out dance that the shell amplifies in order to give back the focus to the stage. In order to fix this, mimic what meta_display_set_input_focus() does, but without updating the X11 display, and so without implicitly calling meta_x11_display_set_input_focus(), stopping the said convolution and properly focusing the requested xwindow. Also ensure that we're not doing this when using an older timestamp, since this check isn't performed anymore. Fixes https://gitlab.gnome.org/GNOME/mutter/issues/896 Fixes https://gitlab.gnome.org/GNOME/mutter/issues/899 https://gitlab.gnome.org/GNOME/mutter/merge_requests/909 --- src/x11/meta-x11-display.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index 92ecb89da..03cbce3ec 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -1934,10 +1934,15 @@ meta_x11_display_set_input_focus_xwindow (MetaX11Display *x11_display, { gulong serial; + if (meta_display_timestamp_too_old (x11_display->display, ×tamp)) + return; + serial = XNextRequest (x11_display->xdisplay); meta_x11_display_set_input_focus_internal (x11_display, window, timestamp); meta_x11_display_update_focus_window (x11_display, window, serial, TRUE); - meta_display_unset_input_focus (x11_display->display, timestamp); + meta_display_update_focus_window (x11_display->display, NULL); + meta_display_remove_autoraise_callback (x11_display->display); + x11_display->display->last_focus_time = timestamp; } static MetaX11DisplayLogicalMonitorData *