mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	input/tablet: focus appropriate node on tip down
This commit makes tablet input more usable when `focus_follows_mouse` is set to `no`. Previously, tapping down on surfaces that bound tablet input would not switch focus, whereas tapping on surfaces that didn't (and hence went through pointer emulation) did.
This commit is contained in:
		
							parent
							
								
									33aa59d4c6
								
							
						
					
					
						commit
						20deb8ec16
					
				
					 1 changed files with 23 additions and 1 deletions
				
			
		| 
						 | 
					@ -220,7 +220,14 @@ static void handle_tablet_tool_tip(struct sway_seat *seat,
 | 
				
			||||||
	struct sway_container *cont = node && node->type == N_CONTAINER ?
 | 
						struct sway_container *cont = node && node->type == N_CONTAINER ?
 | 
				
			||||||
		node->sway_container : NULL;
 | 
							node->sway_container : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (cont) {
 | 
						if (wlr_surface_is_layer_surface(surface)) {
 | 
				
			||||||
 | 
							// Handle tapping a layer surface
 | 
				
			||||||
 | 
							struct wlr_layer_surface_v1 *layer =
 | 
				
			||||||
 | 
									wlr_layer_surface_v1_from_wlr_surface(surface);
 | 
				
			||||||
 | 
							if (layer->current.keyboard_interactive) {
 | 
				
			||||||
 | 
								seat_set_focus_layer(seat, layer);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else if (cont) {
 | 
				
			||||||
		bool is_floating_or_child = container_is_floating_or_child(cont);
 | 
							bool is_floating_or_child = container_is_floating_or_child(cont);
 | 
				
			||||||
		bool is_fullscreen_or_child = container_is_fullscreen_or_child(cont);
 | 
							bool is_fullscreen_or_child = container_is_fullscreen_or_child(cont);
 | 
				
			||||||
		struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat->wlr_seat);
 | 
							struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat->wlr_seat);
 | 
				
			||||||
| 
						 | 
					@ -242,8 +249,23 @@ static void handle_tablet_tool_tip(struct sway_seat *seat,
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Handle tapping on a container surface
 | 
				
			||||||
 | 
							seat_set_focus_container(seat, cont);
 | 
				
			||||||
		seatop_begin_down(seat, node->sway_container, time_msec, sx, sy);
 | 
							seatop_begin_down(seat, node->sway_container, time_msec, sx, sy);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					#if HAVE_XWAYLAND
 | 
				
			||||||
 | 
						// Handle tapping on an xwayland unmanaged view
 | 
				
			||||||
 | 
						else if (wlr_surface_is_xwayland_surface(surface)) {
 | 
				
			||||||
 | 
							struct wlr_xwayland_surface *xsurface =
 | 
				
			||||||
 | 
									wlr_xwayland_surface_from_wlr_surface(surface);
 | 
				
			||||||
 | 
							if (xsurface->override_redirect &&
 | 
				
			||||||
 | 
									wlr_xwayland_or_surface_wants_focus(xsurface)) {
 | 
				
			||||||
 | 
								struct wlr_xwayland *xwayland = server.xwayland.wlr_xwayland;
 | 
				
			||||||
 | 
								wlr_xwayland_set_seat(xwayland, seat->wlr_seat);
 | 
				
			||||||
 | 
								seat_set_focus_surface(seat, xsurface->surface, false);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wlr_tablet_v2_tablet_tool_notify_down(tool->tablet_v2_tool);
 | 
						wlr_tablet_v2_tablet_tool_notify_down(tool->tablet_v2_tool);
 | 
				
			||||||
	wlr_tablet_tool_v2_start_implicit_grab(tool->tablet_v2_tool);
 | 
						wlr_tablet_tool_v2_start_implicit_grab(tool->tablet_v2_tool);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue