mirror of
				https://github.com/labwc/labwc.git
				synced 2025-10-29 05:40:24 -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; | ||||
| 	} | ||||
| 
 | ||||
| 	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 | ||||
|  |  | |||
|  | @ -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); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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); | ||||
| } | ||||
|  |  | |||
|  | @ -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); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 tokyo4j
						tokyo4j