mirror of
https://github.com/labwc/labwc.git
synced 2025-10-31 22:25:34 -04:00
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).
This commit is contained in:
parent
cf759ec183
commit
270b45da88
6 changed files with 13 additions and 25 deletions
|
|
@ -51,6 +51,11 @@ desktop_focus_view(struct view *view, bool raise)
|
||||||
return;
|
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) {
|
if (view->minimized) {
|
||||||
/*
|
/*
|
||||||
* Unminimizing will map the view which triggers a call to this
|
* Unminimizing will map the view which triggers a call to this
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,6 @@ foreign_request_fullscreen(struct foreign_toplevel *toplevel, bool fullscreen)
|
||||||
void
|
void
|
||||||
foreign_request_activate(struct foreign_toplevel *toplevel)
|
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);
|
desktop_focus_view(toplevel->view, /*raise*/ true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
dnd_icons_move(seat, seat->cursor->x, seat->cursor->y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ctx.view || ctx.surface) && rc.focus_follow_mouse
|
if ((ctx.view || ctx.surface) && rc.focus_follow_mouse) {
|
||||||
&& server->input_mode
|
|
||||||
!= LAB_INPUT_STATE_WINDOW_SWITCHER) {
|
|
||||||
desktop_focus_view_or_surface(seat, ctx.view, ctx.surface,
|
desktop_focus_view_or_surface(seat, ctx.view, ctx.surface,
|
||||||
rc.raise_on_focus);
|
rc.raise_on_focus);
|
||||||
}
|
}
|
||||||
|
|
@ -641,15 +639,10 @@ _cursor_update_focus(struct server *server)
|
||||||
struct cursor_context ctx = get_cursor_context(server);
|
struct cursor_context ctx = get_cursor_context(server);
|
||||||
|
|
||||||
if ((ctx.view || ctx.surface) && rc.focus_follow_mouse
|
if ((ctx.view || ctx.surface) && rc.focus_follow_mouse
|
||||||
&& !rc.focus_follow_mouse_requires_movement
|
&& !rc.focus_follow_mouse_requires_movement) {
|
||||||
&& server->input_mode
|
|
||||||
!= LAB_INPUT_STATE_WINDOW_SWITCHER) {
|
|
||||||
/*
|
/*
|
||||||
* Always focus the surface below the cursor when
|
* Always focus the surface below the cursor when
|
||||||
* followMouse=yes and followMouseRequiresMovement=no.
|
* 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,
|
desktop_focus_view_or_surface(&server->seat, ctx.view,
|
||||||
ctx.surface, rc.raise_on_focus);
|
ctx.surface, rc.raise_on_focus);
|
||||||
|
|
|
||||||
|
|
@ -803,6 +803,12 @@ void
|
||||||
view_minimize(struct view *view, bool minimized)
|
view_minimize(struct view *view, bool minimized)
|
||||||
{
|
{
|
||||||
assert(view);
|
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
|
* Minimize the root window first because some xwayland clients send a
|
||||||
* request-unmap to sub-windows at this point (for example gimp and its
|
* request-unmap to sub-windows at this point (for example gimp and its
|
||||||
|
|
|
||||||
|
|
@ -875,11 +875,6 @@ xdg_activation_handle_request(struct wl_listener *listener, void *data)
|
||||||
return;
|
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");
|
wlr_log(WLR_DEBUG, "Activating surface");
|
||||||
desktop_focus_view(view, /*raise*/ true);
|
desktop_focus_view(view, /*raise*/ true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -402,11 +402,6 @@ handle_request_activate(struct wl_listener *listener, void *data)
|
||||||
return;
|
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);
|
desktop_focus_view(view, /*raise*/ true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue