From 270b45da881ca4a0c0cf1ab58e4d960e09ae3c24 Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Mon, 24 Feb 2025 21:40:46 +0900 Subject: [PATCH] desktop: harden window stacking order while window switching This commit moves the check against server->input_mode from the callers of desktop_focus_view() into desktop_focus_view() itself. This eliminates code duplications and makes it harder to mess up the window stacking order while window switching. I also added the same check in view_minimize() so that minimize requests from panels never messes up the window stacking order (I think only this should be described in the release note). --- src/desktop.c | 5 +++++ src/foreign-toplevel/foreign.c | 6 ------ src/input/cursor.c | 11 ++--------- src/view.c | 6 ++++++ src/xdg.c | 5 ----- src/xwayland.c | 5 ----- 6 files changed, 13 insertions(+), 25 deletions(-) diff --git a/src/desktop.c b/src/desktop.c index e3380705..45a6fc67 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -51,6 +51,11 @@ desktop_focus_view(struct view *view, bool raise) return; } + if (view->server->input_mode == LAB_INPUT_STATE_WINDOW_SWITCHER) { + wlr_log(WLR_DEBUG, "not focusing window while window switching"); + return; + } + if (view->minimized) { /* * Unminimizing will map the view which triggers a call to this diff --git a/src/foreign-toplevel/foreign.c b/src/foreign-toplevel/foreign.c index 6f626c6e..a469305c 100644 --- a/src/foreign-toplevel/foreign.c +++ b/src/foreign-toplevel/foreign.c @@ -29,12 +29,6 @@ foreign_request_fullscreen(struct foreign_toplevel *toplevel, bool fullscreen) void foreign_request_activate(struct foreign_toplevel *toplevel) { - if (toplevel->view->server->input_mode - == LAB_INPUT_STATE_WINDOW_SWITCHER) { - wlr_log(WLR_INFO, "Preventing focus request while in window switcher"); - return; - } - desktop_focus_view(toplevel->view, /*raise*/ true); } diff --git a/src/input/cursor.c b/src/input/cursor.c index e9ae9ad0..1a261ca9 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -599,9 +599,7 @@ cursor_process_motion(struct server *server, uint32_t time, double *sx, double * dnd_icons_move(seat, seat->cursor->x, seat->cursor->y); } - if ((ctx.view || ctx.surface) && rc.focus_follow_mouse - && server->input_mode - != LAB_INPUT_STATE_WINDOW_SWITCHER) { + if ((ctx.view || ctx.surface) && rc.focus_follow_mouse) { desktop_focus_view_or_surface(seat, ctx.view, ctx.surface, rc.raise_on_focus); } @@ -641,15 +639,10 @@ _cursor_update_focus(struct server *server) struct cursor_context ctx = get_cursor_context(server); if ((ctx.view || ctx.surface) && rc.focus_follow_mouse - && !rc.focus_follow_mouse_requires_movement - && server->input_mode - != LAB_INPUT_STATE_WINDOW_SWITCHER) { + && !rc.focus_follow_mouse_requires_movement) { /* * Always focus the surface below the cursor when * followMouse=yes and followMouseRequiresMovement=no. - * - * We should ignore them while window-switching though, because - * calling desktop_focus_view() un-minimizes previewed window. */ desktop_focus_view_or_surface(&server->seat, ctx.view, ctx.surface, rc.raise_on_focus); diff --git a/src/view.c b/src/view.c index cc5af20d..f5041262 100644 --- a/src/view.c +++ b/src/view.c @@ -803,6 +803,12 @@ void view_minimize(struct view *view, bool minimized) { assert(view); + + if (view->server->input_mode == LAB_INPUT_STATE_WINDOW_SWITCHER) { + wlr_log(WLR_ERROR, "not minimizing window while window switching"); + return; + } + /* * Minimize the root window first because some xwayland clients send a * request-unmap to sub-windows at this point (for example gimp and its diff --git a/src/xdg.c b/src/xdg.c index cd2200f2..4b8c9f96 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -875,11 +875,6 @@ xdg_activation_handle_request(struct wl_listener *listener, void *data) return; } - if (view->server->input_mode == LAB_INPUT_STATE_WINDOW_SWITCHER) { - wlr_log(WLR_INFO, "Preventing focus request while in window switcher"); - return; - } - wlr_log(WLR_DEBUG, "Activating surface"); desktop_focus_view(view, /*raise*/ true); } diff --git a/src/xwayland.c b/src/xwayland.c index 1eb9c1a3..a295e03a 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -402,11 +402,6 @@ handle_request_activate(struct wl_listener *listener, void *data) return; } - if (view->server->input_mode == LAB_INPUT_STATE_WINDOW_SWITCHER) { - wlr_log(WLR_INFO, "Preventing focus request while in window switcher"); - return; - } - desktop_focus_view(view, /*raise*/ true); }