mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	touch: make cancel functions take a wlr_seat_client
The surface argument is only used to obtain a wlr_seat_client and semantically makes no sense. The wl_touch.cancel event applies to all touch points and all surfaces of a client. I decided to make the functions accept a wlr_seat_client rather than a wl_client as it is directly available in the wlr_touch_point struct and simplifies the implementation.
This commit is contained in:
		
							parent
							
								
									2f3ea4590a
								
							
						
					
					
						commit
						34219b0334
					
				
					 2 changed files with 11 additions and 20 deletions
				
			
		| 
						 | 
					@ -137,7 +137,7 @@ struct wlr_touch_grab_interface {
 | 
				
			||||||
	void (*cancel)(struct wlr_seat_touch_grab *grab);
 | 
						void (*cancel)(struct wlr_seat_touch_grab *grab);
 | 
				
			||||||
	// Send wl_touch.cancel
 | 
						// Send wl_touch.cancel
 | 
				
			||||||
	void (*wl_cancel)(struct wlr_seat_touch_grab *grab,
 | 
						void (*wl_cancel)(struct wlr_seat_touch_grab *grab,
 | 
				
			||||||
			struct wlr_surface *surface);
 | 
								struct wlr_seat_client *seat_client);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -632,11 +632,12 @@ void wlr_seat_touch_send_motion(struct wlr_seat *seat, uint32_t time_msec,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Notify the seat that this is a global gesture and the client should cancel
 | 
					 * Notify the seat that this is a global gesture and the client should cancel
 | 
				
			||||||
 * processing it. The event will go to the client for the surface given.
 | 
					 * processing it. The event will go to the client given.
 | 
				
			||||||
 * This function does not respect touch grabs: you probably want
 | 
					 * This function does not respect touch grabs: you probably want
 | 
				
			||||||
 * wlr_seat_touch_notify_cancel() instead.
 | 
					 * wlr_seat_touch_notify_cancel() instead.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void wlr_seat_touch_send_cancel(struct wlr_seat *seat, struct wlr_surface *surface);
 | 
					void wlr_seat_touch_send_cancel(struct wlr_seat *seat,
 | 
				
			||||||
 | 
							struct wlr_seat_client *seat_client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_seat_touch_send_frame(struct wlr_seat *seat);
 | 
					void wlr_seat_touch_send_frame(struct wlr_seat *seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -669,7 +670,7 @@ void wlr_seat_touch_notify_motion(struct wlr_seat *seat, uint32_t time_msec,
 | 
				
			||||||
 * cancel processing it. Defers to any grab of the touch device.
 | 
					 * cancel processing it. Defers to any grab of the touch device.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void wlr_seat_touch_notify_cancel(struct wlr_seat *seat,
 | 
					void wlr_seat_touch_notify_cancel(struct wlr_seat *seat,
 | 
				
			||||||
		struct wlr_surface *surface);
 | 
							struct wlr_seat_client *seat_client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_seat_touch_notify_frame(struct wlr_seat *seat);
 | 
					void wlr_seat_touch_notify_frame(struct wlr_seat *seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,8 +40,8 @@ static void default_touch_cancel(struct wlr_seat_touch_grab *grab) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void default_touch_wl_cancel(struct wlr_seat_touch_grab *grab,
 | 
					static void default_touch_wl_cancel(struct wlr_seat_touch_grab *grab,
 | 
				
			||||||
		struct wlr_surface *surface) {
 | 
							struct wlr_seat_client *seat_client) {
 | 
				
			||||||
	wlr_seat_touch_send_cancel(grab->seat, surface);
 | 
						wlr_seat_touch_send_cancel(grab->seat, seat_client);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct wlr_touch_grab_interface default_touch_grab_impl = {
 | 
					const struct wlr_touch_grab_interface default_touch_grab_impl = {
 | 
				
			||||||
| 
						 | 
					@ -242,17 +242,12 @@ void wlr_seat_touch_notify_frame(struct wlr_seat *seat) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_seat_touch_notify_cancel(struct wlr_seat *seat,
 | 
					void wlr_seat_touch_notify_cancel(struct wlr_seat *seat,
 | 
				
			||||||
		struct wlr_surface *surface) {
 | 
							struct wlr_seat_client *seat_client) {
 | 
				
			||||||
	struct wlr_seat_touch_grab *grab = seat->touch_state.grab;
 | 
						struct wlr_seat_touch_grab *grab = seat->touch_state.grab;
 | 
				
			||||||
	if (grab->interface->wl_cancel) {
 | 
						if (grab->interface->wl_cancel) {
 | 
				
			||||||
		grab->interface->wl_cancel(grab, surface);
 | 
							grab->interface->wl_cancel(grab, seat_client);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct wl_client *client = wl_resource_get_client(surface->resource);
 | 
					 | 
				
			||||||
	struct wlr_seat_client *seat_client = wlr_seat_client_for_wl_client(seat, client);
 | 
					 | 
				
			||||||
	if (seat_client == NULL) {
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	struct wlr_touch_point *point, *tmp;
 | 
						struct wlr_touch_point *point, *tmp;
 | 
				
			||||||
	wl_list_for_each_safe(point, tmp, &seat->touch_state.touch_points, link) {
 | 
						wl_list_for_each_safe(point, tmp, &seat->touch_state.touch_points, link) {
 | 
				
			||||||
		if (point->client == seat_client) {
 | 
							if (point->client == seat_client) {
 | 
				
			||||||
| 
						 | 
					@ -399,13 +394,8 @@ void wlr_seat_touch_send_frame(struct wlr_seat *seat) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void wlr_seat_touch_send_cancel(struct wlr_seat *seat, struct wlr_surface *surface) {
 | 
					void wlr_seat_touch_send_cancel(struct wlr_seat *seat,
 | 
				
			||||||
	struct wl_client *client = wl_resource_get_client(surface->resource);
 | 
							struct wlr_seat_client *seat_client) {
 | 
				
			||||||
	struct wlr_seat_client *seat_client = wlr_seat_client_for_wl_client(seat, client);
 | 
					 | 
				
			||||||
	if (seat_client == NULL) {
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	struct wl_resource *resource;
 | 
						struct wl_resource *resource;
 | 
				
			||||||
	wl_resource_for_each(resource, &seat_client->touches) {
 | 
						wl_resource_for_each(resource, &seat_client->touches) {
 | 
				
			||||||
		if (seat_client_from_touch_resource(resource) == NULL) {
 | 
							if (seat_client_from_touch_resource(resource) == NULL) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue