mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-11-03 09:01:40 -05:00 
			
		
		
		
	data-device: touch grab stubs
This commit is contained in:
		
							parent
							
								
									cbb6fd7352
								
							
						
					
					
						commit
						94e7dc8a3e
					
				
					 4 changed files with 61 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -521,6 +521,31 @@ wlr_pointer_grab_interface wlr_data_device_pointer_drag_interface = {
 | 
			
		|||
	.cancel = pointer_drag_cancel,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void touch_drag_down(struct wlr_seat_touch_grab *grab, struct wlr_surface *surface,
 | 
			
		||||
			uint32_t time, int32_t touch_id, double sx, double sy) {
 | 
			
		||||
	// TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void touch_drag_up(struct wlr_seat_touch_grab *grab, uint32_t time, int32_t touch_id) {
 | 
			
		||||
	// TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void touch_drag_motion(struct wlr_seat_touch_grab *grab, uint32_t time, int32_t
 | 
			
		||||
			touch_id, double sx, double sy) {
 | 
			
		||||
	// TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void touch_drag_cancel(struct wlr_seat_touch_grab *grab) {
 | 
			
		||||
	// TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct wlr_touch_grab_interface wlr_data_device_touch_drag_interface = {
 | 
			
		||||
	.down = touch_drag_down,
 | 
			
		||||
	.up = touch_drag_up,
 | 
			
		||||
	.motion = touch_drag_motion,
 | 
			
		||||
	.cancel = touch_drag_cancel,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void keyboard_drag_enter(struct wlr_seat_keyboard_grab *grab,
 | 
			
		||||
		struct wlr_surface *surface) {
 | 
			
		||||
	// nothing has keyboard focus during drags
 | 
			
		||||
| 
						 | 
				
			
			@ -562,12 +587,30 @@ static void drag_handle_drag_source_destroy(struct wl_listener *listener,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static bool seat_client_start_drag(struct wlr_seat_client *client,
 | 
			
		||||
		struct wlr_data_source *source, struct wlr_surface *icon) {
 | 
			
		||||
		struct wlr_data_source *source, struct wlr_surface *icon,
 | 
			
		||||
		struct wlr_surface *origin, uint32_t serial) {
 | 
			
		||||
	struct wlr_drag *drag = calloc(1, sizeof(struct wlr_drag));
 | 
			
		||||
	if (drag == NULL) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	struct wlr_seat_pointer_state pointer_state = client->seat->pointer_state;
 | 
			
		||||
	struct wlr_seat_touch_state touch_state = client->seat->touch_state;
 | 
			
		||||
 | 
			
		||||
	bool is_pointer_grab = client->pointer &&
 | 
			
		||||
		pointer_state.button_count == 1 &&
 | 
			
		||||
		pointer_state.grab_serial == serial &&
 | 
			
		||||
		pointer_state.focused_surface &&
 | 
			
		||||
		pointer_state.focused_surface == origin;
 | 
			
		||||
 | 
			
		||||
	bool is_touch_grab = client->touch &&
 | 
			
		||||
		wl_list_length(&touch_state.touch_points) == 1 &&
 | 
			
		||||
		touch_state.grab_serial == serial;
 | 
			
		||||
 | 
			
		||||
	if (!is_pointer_grab || !is_touch_grab) {
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	struct wlr_seat *seat = client->seat;
 | 
			
		||||
 | 
			
		||||
	if (icon) {
 | 
			
		||||
| 
						 | 
				
			
			@ -587,13 +630,20 @@ static bool seat_client_start_drag(struct wlr_seat_client *client,
 | 
			
		|||
	drag->pointer_grab.data = drag;
 | 
			
		||||
	drag->pointer_grab.interface = &wlr_data_device_pointer_drag_interface;
 | 
			
		||||
 | 
			
		||||
	drag->touch_grab.data = drag;
 | 
			
		||||
	drag->touch_grab.interface = &wlr_data_device_touch_drag_interface;
 | 
			
		||||
 | 
			
		||||
	drag->keyboard_grab.data = drag;
 | 
			
		||||
	drag->keyboard_grab.interface = &wlr_data_device_keyboard_drag_interface;
 | 
			
		||||
 | 
			
		||||
	wlr_seat_pointer_clear_focus(seat);
 | 
			
		||||
 | 
			
		||||
	wlr_seat_keyboard_start_grab(seat, &drag->keyboard_grab);
 | 
			
		||||
	wlr_seat_pointer_start_grab(seat, &drag->pointer_grab);
 | 
			
		||||
 | 
			
		||||
	if (is_pointer_grab) {
 | 
			
		||||
		wlr_seat_pointer_clear_focus(seat);
 | 
			
		||||
		wlr_seat_pointer_start_grab(seat, &drag->pointer_grab);
 | 
			
		||||
	} else {
 | 
			
		||||
		wlr_seat_touch_start_grab(seat, &drag->touch_grab);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -634,7 +684,7 @@ static void data_device_start_drag(struct wl_client *client,
 | 
			
		|||
 | 
			
		||||
	// TODO touch grab
 | 
			
		||||
 | 
			
		||||
	if (!seat_client_start_drag(seat_client, source, icon)) {
 | 
			
		||||
	if (!seat_client_start_drag(seat_client, source, icon, origin, serial)) {
 | 
			
		||||
		wl_resource_post_no_memory(device_resource);
 | 
			
		||||
	} else {
 | 
			
		||||
		source->seat_client = seat_client;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -961,6 +961,9 @@ void wlr_seat_touch_notify_down(struct wlr_seat *seat,
 | 
			
		|||
		double sy) {
 | 
			
		||||
	struct wlr_seat_touch_grab *grab = seat->touch_state.grab;
 | 
			
		||||
	grab->interface->down(grab, surface, time, touch_id, sx, sy);
 | 
			
		||||
	if (wl_list_length(&seat->touch_state.touch_points) == 1) {
 | 
			
		||||
		seat->touch_state.grab_serial = wl_display_get_serial(seat->display);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void wlr_seat_touch_notify_up(struct wlr_seat *seat, uint32_t time,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue