|  |  |  | @ -386,28 +386,29 @@ static void pointer_motion(struct sway_cursor *cursor, uint32_t time_msec, | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_motion_relative( | 
			
		
	
		
			
				
					|  |  |  |  | 		struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of(listener, cursor, motion); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_motion *e = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, e->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_motion_event *e = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &e->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	pointer_motion(cursor, e->time_msec, e->device, e->delta_x, e->delta_y, | 
			
		
	
		
			
				
					|  |  |  |  | 			e->unaccel_dx, e->unaccel_dy); | 
			
		
	
		
			
				
					|  |  |  |  | 	pointer_motion(cursor, e->time_msec, &e->pointer->base, e->delta_x, | 
			
		
	
		
			
				
					|  |  |  |  | 		e->delta_y, e->unaccel_dx, e->unaccel_dy); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_motion_absolute( | 
			
		
	
		
			
				
					|  |  |  |  | 		struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_container_of(listener, cursor, motion_absolute); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_motion_absolute *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_motion_absolute_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	double lx, ly; | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_cursor_absolute_to_layout_coords(cursor->cursor, event->device, | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_cursor_absolute_to_layout_coords(cursor->cursor, &event->pointer->base, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->x, event->y, &lx, &ly); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	double dx = lx - cursor->cursor->x; | 
			
		
	
		
			
				
					|  |  |  |  | 	double dy = ly - cursor->cursor->y; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	pointer_motion(cursor, event->time_msec, event->device, dx, dy, dx, dy); | 
			
		
	
		
			
				
					|  |  |  |  | 	pointer_motion(cursor, event->time_msec, &event->pointer->base, dx, dy, | 
			
		
	
		
			
				
					|  |  |  |  | 		dx, dy); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void dispatch_cursor_button(struct sway_cursor *cursor, | 
			
		
	
	
		
			
				
					|  |  |  | @ -422,7 +423,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_button(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of(listener, cursor, button); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_button *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_button_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (event->state == WLR_BUTTON_PRESSED) { | 
			
		
	
		
			
				
					|  |  |  |  | 		cursor->pressed_button_count++; | 
			
		
	
	
		
			
				
					|  |  |  | @ -434,20 +435,20 @@ static void handle_pointer_button(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	dispatch_cursor_button(cursor, event->device, | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	dispatch_cursor_button(cursor, &event->pointer->base, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->button, event->state); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void dispatch_cursor_axis(struct sway_cursor *cursor, | 
			
		
	
		
			
				
					|  |  |  |  | 		struct wlr_event_pointer_axis *event) { | 
			
		
	
		
			
				
					|  |  |  |  | 		struct wlr_pointer_axis_event *event) { | 
			
		
	
		
			
				
					|  |  |  |  | 	seatop_pointer_axis(cursor->seat, event); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_axis(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of(listener, cursor, axis); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_axis *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_axis_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	dispatch_cursor_axis(cursor, event); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -458,8 +459,8 @@ static void handle_pointer_frame(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_touch_down(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_down); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_touch_down *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_touch_down_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->touch->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_hide(cursor); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_seat *seat = cursor->seat; | 
			
		
	
	
		
			
				
					|  |  |  | @ -467,7 +468,7 @@ static void handle_touch_down(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_surface *surface = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	double lx, ly; | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_cursor_absolute_to_layout_coords(cursor->cursor, event->device, | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_cursor_absolute_to_layout_coords(cursor->cursor, &event->touch->base, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->x, event->y, &lx, &ly); | 
			
		
	
		
			
				
					|  |  |  |  | 	double sx, sy; | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_node *focused_node = node_at_coords(seat, lx, ly, &surface, &sx, &sy); | 
			
		
	
	
		
			
				
					|  |  |  | @ -495,24 +496,25 @@ static void handle_touch_down(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 		double dx, dy; | 
			
		
	
		
			
				
					|  |  |  |  | 		dx = lx - cursor->cursor->x; | 
			
		
	
		
			
				
					|  |  |  |  | 		dy = ly - cursor->cursor->y; | 
			
		
	
		
			
				
					|  |  |  |  | 		pointer_motion(cursor, event->time_msec, event->device, dx, dy, dx, dy); | 
			
		
	
		
			
				
					|  |  |  |  | 		dispatch_cursor_button(cursor, event->device, event->time_msec, | 
			
		
	
		
			
				
					|  |  |  |  | 		pointer_motion(cursor, event->time_msec, &event->touch->base, dx, dy, | 
			
		
	
		
			
				
					|  |  |  |  | 			dx, dy); | 
			
		
	
		
			
				
					|  |  |  |  | 		dispatch_cursor_button(cursor, &event->touch->base, event->time_msec, | 
			
		
	
		
			
				
					|  |  |  |  | 				BTN_LEFT, WLR_BUTTON_PRESSED); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_touch_up(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_up); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_touch_up *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_touch_up_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->touch->base); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_seat *wlr_seat = cursor->seat->wlr_seat; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cursor->simulating_pointer_from_touch) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (cursor->pointer_touch_id == cursor->seat->touch_id) { | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_touch_up = true; | 
			
		
	
		
			
				
					|  |  |  |  | 			dispatch_cursor_button(cursor, event->device, event->time_msec, | 
			
		
	
		
			
				
					|  |  |  |  | 					BTN_LEFT, WLR_BUTTON_RELEASED); | 
			
		
	
		
			
				
					|  |  |  |  | 			dispatch_cursor_button(cursor, &event->touch->base, | 
			
		
	
		
			
				
					|  |  |  |  | 				event->time_msec, BTN_LEFT, WLR_BUTTON_RELEASED); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} else { | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_seat_touch_notify_up(wlr_seat, event->time_msec, event->touch_id); | 
			
		
	
	
		
			
				
					|  |  |  | @ -522,15 +524,15 @@ static void handle_touch_up(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_touch_motion(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_container_of(listener, cursor, touch_motion); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_touch_motion *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_touch_motion_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->touch->base); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_seat *seat = cursor->seat; | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_seat *wlr_seat = seat->wlr_seat; | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_surface *surface = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	double lx, ly; | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_cursor_absolute_to_layout_coords(cursor->cursor, event->device, | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_cursor_absolute_to_layout_coords(cursor->cursor, &event->touch->base, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->x, event->y, &lx, &ly); | 
			
		
	
		
			
				
					|  |  |  |  | 	double sx, sy; | 
			
		
	
		
			
				
					|  |  |  |  | 	node_at_coords(cursor->seat, lx, ly, &surface, &sx, &sy); | 
			
		
	
	
		
			
				
					|  |  |  | @ -552,7 +554,8 @@ static void handle_touch_motion(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 			double dx, dy; | 
			
		
	
		
			
				
					|  |  |  |  | 			dx = lx - cursor->cursor->x; | 
			
		
	
		
			
				
					|  |  |  |  | 			dy = ly - cursor->cursor->y; | 
			
		
	
		
			
				
					|  |  |  |  | 			pointer_motion(cursor, event->time_msec, event->device, dx, dy, dx, dy); | 
			
		
	
		
			
				
					|  |  |  |  | 			pointer_motion(cursor, event->time_msec, &event->touch->base, | 
			
		
	
		
			
				
					|  |  |  |  | 				dx, dy, dx, dy); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} else if (surface) { | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_seat_touch_notify_motion(wlr_seat, event->time_msec, | 
			
		
	
	
		
			
				
					|  |  |  | @ -661,8 +664,8 @@ static void handle_tablet_tool_position(struct sway_cursor *cursor, | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_tool_axis(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_axis); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_tablet_tool_axis *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_tablet_tool_axis_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->tablet->base); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_tablet_tool *sway_tool = event->tool->data; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!sway_tool) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -717,8 +720,8 @@ static void handle_tool_axis(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_tool_tip(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_tip); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_tablet_tool_tip *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_tablet_tool_tip_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->tablet->base); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_tablet_tool *sway_tool = event->tool->data; | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_tablet_v2_tablet *tablet_v2 = sway_tool->tablet->tablet_v2; | 
			
		
	
	
		
			
				
					|  |  |  | @ -733,7 +736,7 @@ static void handle_tool_tip(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cursor->simulating_pointer_from_tool_tip && | 
			
		
	
		
			
				
					|  |  |  |  | 			event->state == WLR_TABLET_TOOL_TIP_UP) { | 
			
		
	
		
			
				
					|  |  |  |  | 		cursor->simulating_pointer_from_tool_tip = false; | 
			
		
	
		
			
				
					|  |  |  |  | 		dispatch_cursor_button(cursor, event->device, event->time_msec, | 
			
		
	
		
			
				
					|  |  |  |  | 		dispatch_cursor_button(cursor, &event->tablet->base, event->time_msec, | 
			
		
	
		
			
				
					|  |  |  |  | 			BTN_LEFT, WLR_BUTTON_RELEASED); | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat); | 
			
		
	
		
			
				
					|  |  |  |  | 	} else if (!surface || !wlr_surface_accepts_tablet_v2(tablet_v2, surface)) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -745,8 +748,8 @@ static void handle_tool_tip(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 				WLR_TABLET_TOOL_TIP_UP); | 
			
		
	
		
			
				
					|  |  |  |  | 		} else { | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->simulating_pointer_from_tool_tip = true; | 
			
		
	
		
			
				
					|  |  |  |  | 			dispatch_cursor_button(cursor, event->device, event->time_msec, | 
			
		
	
		
			
				
					|  |  |  |  | 				BTN_LEFT, WLR_BUTTON_PRESSED); | 
			
		
	
		
			
				
					|  |  |  |  | 			dispatch_cursor_button(cursor, &event->tablet->base, | 
			
		
	
		
			
				
					|  |  |  |  | 				event->time_msec, BTN_LEFT, WLR_BUTTON_PRESSED); | 
			
		
	
		
			
				
					|  |  |  |  | 			wlr_seat_pointer_notify_frame(cursor->seat->wlr_seat); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} else { | 
			
		
	
	
		
			
				
					|  |  |  | @ -768,12 +771,13 @@ static struct sway_tablet *get_tablet_for_device(struct sway_cursor *cursor, | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_tool_proximity(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = | 
			
		
	
		
			
				
					|  |  |  |  | 		wl_container_of(listener, cursor, tool_proximity); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_tablet_tool_proximity *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_tablet_tool_proximity_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->tablet->base); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_tablet_tool *tool = event->tool; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!tool->data) { | 
			
		
	
		
			
				
					|  |  |  |  | 		struct sway_tablet *tablet = get_tablet_for_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 		struct sway_tablet *tablet = get_tablet_for_device(cursor, | 
			
		
	
		
			
				
					|  |  |  |  | 			&event->tablet->base); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (!tablet) { | 
			
		
	
		
			
				
					|  |  |  |  | 			sway_log(SWAY_ERROR, "no tablet for tablet tool"); | 
			
		
	
		
			
				
					|  |  |  |  | 			return; | 
			
		
	
	
		
			
				
					|  |  |  | @ -798,8 +802,8 @@ static void handle_tool_proximity(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_tool_button(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_button); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_tablet_tool_button *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_tablet_tool_button_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->tablet->base); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_tablet_tool *sway_tool = event->tool->data; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!sway_tool) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -820,14 +824,14 @@ static void handle_tool_button(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 		switch (event->state) { | 
			
		
	
		
			
				
					|  |  |  |  | 		case WLR_BUTTON_PRESSED: | 
			
		
	
		
			
				
					|  |  |  |  | 			if (cursor->tool_buttons == 0) { | 
			
		
	
		
			
				
					|  |  |  |  | 				dispatch_cursor_button(cursor, event->device, | 
			
		
	
		
			
				
					|  |  |  |  | 				dispatch_cursor_button(cursor, &event->tablet->base, | 
			
		
	
		
			
				
					|  |  |  |  | 						event->time_msec, BTN_RIGHT, event->state); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->tool_buttons++; | 
			
		
	
		
			
				
					|  |  |  |  | 			break; | 
			
		
	
		
			
				
					|  |  |  |  | 		case WLR_BUTTON_RELEASED: | 
			
		
	
		
			
				
					|  |  |  |  | 			if (cursor->tool_buttons == 1) { | 
			
		
	
		
			
				
					|  |  |  |  | 				dispatch_cursor_button(cursor, event->device, | 
			
		
	
		
			
				
					|  |  |  |  | 				dispatch_cursor_button(cursor, &event->tablet->base, | 
			
		
	
		
			
				
					|  |  |  |  | 						event->time_msec, BTN_RIGHT, event->state); | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->tool_buttons--; | 
			
		
	
	
		
			
				
					|  |  |  | @ -927,8 +931,8 @@ static void handle_request_pointer_set_cursor(struct wl_listener *listener, | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_pinch_begin(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of( | 
			
		
	
		
			
				
					|  |  |  |  | 			listener, cursor, pinch_begin); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_pinch_begin *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_pinch_begin_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_pointer_gestures_v1_send_pinch_begin( | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_gestures, cursor->seat->wlr_seat, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->fingers); | 
			
		
	
	
		
			
				
					|  |  |  | @ -937,8 +941,8 @@ static void handle_pointer_pinch_begin(struct wl_listener *listener, void *data) | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_pinch_update(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of( | 
			
		
	
		
			
				
					|  |  |  |  | 			listener, cursor, pinch_update); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_pinch_update *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_pinch_update_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_pointer_gestures_v1_send_pinch_update( | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_gestures, cursor->seat->wlr_seat, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->dx, event->dy, | 
			
		
	
	
		
			
				
					|  |  |  | @ -948,8 +952,8 @@ static void handle_pointer_pinch_update(struct wl_listener *listener, void *data | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_pinch_end(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of( | 
			
		
	
		
			
				
					|  |  |  |  | 			listener, cursor, pinch_end); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_pinch_end *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_pinch_end_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_pointer_gestures_v1_send_pinch_end( | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_gestures, cursor->seat->wlr_seat, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->cancelled); | 
			
		
	
	
		
			
				
					|  |  |  | @ -958,8 +962,8 @@ static void handle_pointer_pinch_end(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_swipe_begin(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of( | 
			
		
	
		
			
				
					|  |  |  |  | 			listener, cursor, swipe_begin); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_swipe_begin *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_swipe_begin_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_pointer_gestures_v1_send_swipe_begin( | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_gestures, cursor->seat->wlr_seat, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->fingers); | 
			
		
	
	
		
			
				
					|  |  |  | @ -968,8 +972,8 @@ static void handle_pointer_swipe_begin(struct wl_listener *listener, void *data) | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_swipe_update(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of( | 
			
		
	
		
			
				
					|  |  |  |  | 			listener, cursor, swipe_update); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_swipe_update *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_swipe_update_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_pointer_gestures_v1_send_swipe_update( | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_gestures, cursor->seat->wlr_seat, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->dx, event->dy); | 
			
		
	
	
		
			
				
					|  |  |  | @ -978,8 +982,8 @@ static void handle_pointer_swipe_update(struct wl_listener *listener, void *data | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_swipe_end(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of( | 
			
		
	
		
			
				
					|  |  |  |  | 			listener, cursor, swipe_end); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_swipe_end *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_swipe_end_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_pointer_gestures_v1_send_swipe_end( | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_gestures, cursor->seat->wlr_seat, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->cancelled); | 
			
		
	
	
		
			
				
					|  |  |  | @ -988,8 +992,8 @@ static void handle_pointer_swipe_end(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_hold_begin(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of( | 
			
		
	
		
			
				
					|  |  |  |  | 			listener, cursor, hold_begin); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_hold_begin *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_hold_begin_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_pointer_gestures_v1_send_hold_begin( | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_gestures, cursor->seat->wlr_seat, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->fingers); | 
			
		
	
	
		
			
				
					|  |  |  | @ -998,8 +1002,8 @@ static void handle_pointer_hold_begin(struct wl_listener *listener, void *data) | 
			
		
	
		
			
				
					|  |  |  |  | static void handle_pointer_hold_end(struct wl_listener *listener, void *data) { | 
			
		
	
		
			
				
					|  |  |  |  | 	struct sway_cursor *cursor = wl_container_of( | 
			
		
	
		
			
				
					|  |  |  |  | 			listener, cursor, hold_end); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_event_pointer_hold_end *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, event->device); | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_pointer_hold_end_event *event = data; | 
			
		
	
		
			
				
					|  |  |  |  | 	cursor_handle_activity_from_device(cursor, &event->pointer->base); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_pointer_gestures_v1_send_hold_end( | 
			
		
	
		
			
				
					|  |  |  |  | 			cursor->pointer_gestures, cursor->seat->wlr_seat, | 
			
		
	
		
			
				
					|  |  |  |  | 			event->time_msec, event->cancelled); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |