mirror of
				https://github.com/labwc/labwc.git
				synced 2025-10-29 05:40:24 -04:00 
			
		
		
		
	input: move cursor event listeners from tablet to seat
Otherwise we would subscribe multiple times to the same event when having multiple tablets.
This commit is contained in:
		
							parent
							
								
									538eb3ee83
								
							
						
					
					
						commit
						dd0cee02a4
					
				
					 9 changed files with 40 additions and 22 deletions
				
			
		|  | @ -36,7 +36,7 @@ struct drawing_tablet_pad { | |||
| 	struct wl_list link; /* seat.tablet_pads */ | ||||
| }; | ||||
| 
 | ||||
| void tablet_pad_init(struct seat *seat, struct wlr_input_device *wlr_input_device); | ||||
| void tablet_pad_create(struct seat *seat, struct wlr_input_device *wlr_input_device); | ||||
| void tablet_pad_attach_tablet(struct seat *seat); | ||||
| void tablet_pad_enter_surface(struct seat *seat, struct wlr_surface *wlr_surface); | ||||
| 
 | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ struct drawing_tablet_tool { | |||
| 	struct wl_list link; /* seat.tablet_tools */ | ||||
| }; | ||||
| 
 | ||||
| void tablet_tool_init(struct seat *seat, | ||||
| void tablet_tool_create(struct seat *seat, | ||||
| 	struct wlr_tablet_tool *wlr_tablet_tool); | ||||
| bool tablet_tool_has_focused_surface(struct seat *seat); | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,15 +23,13 @@ struct drawing_tablet { | |||
| 	double slider; | ||||
| 	double wheel_delta; | ||||
| 	struct { | ||||
| 		struct wl_listener tablet_tool_proximity; | ||||
| 		struct wl_listener tablet_tool_axis; | ||||
| 		struct wl_listener tablet_tool_tip; | ||||
| 		struct wl_listener tablet_tool_button; | ||||
| 		struct wl_listener destroy; | ||||
| 	} handlers; | ||||
| 	struct wl_list link; /* seat.tablets */ | ||||
| }; | ||||
| 
 | ||||
| void tablet_init(struct seat *seat, struct wlr_input_device *wlr_input_device); | ||||
| void tablet_init(struct seat *seat); | ||||
| void tablet_finish(struct seat *seat); | ||||
| void tablet_create(struct seat *seat, struct wlr_input_device *wlr_input_device); | ||||
| 
 | ||||
| #endif /* LABWC_TABLET_H */ | ||||
|  |  | |||
|  | @ -192,6 +192,11 @@ struct seat { | |||
| 	struct wl_listener touch_motion; | ||||
| 	struct wl_listener touch_frame; | ||||
| 
 | ||||
| 	struct wl_listener tablet_tool_proximity; | ||||
| 	struct wl_listener tablet_tool_axis; | ||||
| 	struct wl_listener tablet_tool_tip; | ||||
| 	struct wl_listener tablet_tool_button; | ||||
| 
 | ||||
| 	struct wl_list tablets; | ||||
| 	struct wl_list tablet_tools; | ||||
| 	struct wl_list tablet_pads; | ||||
|  |  | |||
|  | @ -13,12 +13,13 @@ | |||
| #include "common/scene-helpers.h" | ||||
| #include "common/surface-helpers.h" | ||||
| #include "config/mousebind.h" | ||||
| #include "config/tablet-tool.h" | ||||
| #include "dnd.h" | ||||
| #include "idle.h" | ||||
| #include "input/gestures.h" | ||||
| #include "input/touch.h" | ||||
| #include "input/tablet.h" | ||||
| #include "input/tablet-tool.h" | ||||
| #include "input/tablet-pad.h" | ||||
| #include "labwc.h" | ||||
| #include "layers.h" | ||||
| #include "menu/menu.h" | ||||
|  | @ -1450,6 +1451,8 @@ cursor_init(struct seat *seat) | |||
| 	gestures_init(seat); | ||||
| 	touch_init(seat); | ||||
| 
 | ||||
| 	tablet_init(seat); | ||||
| 
 | ||||
| 	seat->request_cursor.notify = request_cursor_notify; | ||||
| 	wl_signal_add(&seat->seat->events.request_set_cursor, | ||||
| 		&seat->request_cursor); | ||||
|  | @ -1488,6 +1491,8 @@ void cursor_finish(struct seat *seat) | |||
| 	gestures_finish(seat); | ||||
| 	touch_finish(seat); | ||||
| 
 | ||||
| 	tablet_finish(seat); | ||||
| 
 | ||||
| 	wl_list_remove(&seat->request_cursor.link); | ||||
| 	wl_list_remove(&seat->request_set_shape.link); | ||||
| 	wl_list_remove(&seat->request_set_selection.link); | ||||
|  |  | |||
|  | @ -175,7 +175,7 @@ handle_destroy(struct wl_listener *listener, void *data) | |||
| } | ||||
| 
 | ||||
| void | ||||
| tablet_pad_init(struct seat *seat, struct wlr_input_device *wlr_device) | ||||
| tablet_pad_create(struct seat *seat, struct wlr_input_device *wlr_device) | ||||
| { | ||||
| 	wlr_log(WLR_DEBUG, "setting up tablet pad"); | ||||
| 	struct drawing_tablet_pad *pad = znew(*pad); | ||||
|  |  | |||
|  | @ -60,7 +60,7 @@ handle_destroy(struct wl_listener *listener, void *data) | |||
| } | ||||
| 
 | ||||
| void | ||||
| tablet_tool_init(struct seat *seat, | ||||
| tablet_tool_create(struct seat *seat, | ||||
| 		struct wlr_tablet_tool *wlr_tablet_tool) | ||||
| { | ||||
| 	wlr_log(WLR_DEBUG, "setting up tablet tool"); | ||||
|  |  | |||
|  | @ -266,7 +266,7 @@ handle_tablet_tool_proximity(struct wl_listener *listener, void *data) | |||
| 		 * Unfortunately `wlr_tool` is only present in the events, so | ||||
| 		 * use proximity for creating a `wlr_tablet_v2_tablet_tool`. | ||||
| 		 */ | ||||
| 		tablet_tool_init(tablet->seat, ev->tool); | ||||
| 		tablet_tool_create(tablet->seat, ev->tool); | ||||
| 	} | ||||
| 
 | ||||
| 	/*
 | ||||
|  | @ -604,16 +604,12 @@ handle_destroy(struct wl_listener *listener, void *data) | |||
| 	wl_list_remove(&tablet->link); | ||||
| 	tablet_pad_attach_tablet(tablet->seat); | ||||
| 
 | ||||
| 	wl_list_remove(&tablet->handlers.tablet_tool_tip.link); | ||||
| 	wl_list_remove(&tablet->handlers.tablet_tool_button.link); | ||||
| 	wl_list_remove(&tablet->handlers.tablet_tool_proximity.link); | ||||
| 	wl_list_remove(&tablet->handlers.tablet_tool_axis.link); | ||||
| 	wl_list_remove(&tablet->handlers.destroy.link); | ||||
| 	free(tablet); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| tablet_init(struct seat *seat, struct wlr_input_device *wlr_device) | ||||
| tablet_create(struct seat *seat, struct wlr_input_device *wlr_device) | ||||
| { | ||||
| 	wlr_log(WLR_DEBUG, "setting up tablet"); | ||||
| 	struct drawing_tablet *tablet = znew(*tablet); | ||||
|  | @ -636,12 +632,26 @@ tablet_init(struct seat *seat, struct wlr_input_device *wlr_device) | |||
| 	tablet->wheel_delta = 0.0; | ||||
| 	wlr_log(WLR_INFO, "tablet dimensions: %.2fmm x %.2fmm", | ||||
| 		tablet->tablet->width_mm, tablet->tablet->height_mm); | ||||
| 	CONNECT_SIGNAL(seat->cursor, &tablet->handlers, tablet_tool_axis); | ||||
| 	CONNECT_SIGNAL(seat->cursor, &tablet->handlers, tablet_tool_proximity); | ||||
| 	CONNECT_SIGNAL(seat->cursor, &tablet->handlers, tablet_tool_tip); | ||||
| 	CONNECT_SIGNAL(seat->cursor, &tablet->handlers, tablet_tool_button); | ||||
| 	CONNECT_SIGNAL(wlr_device, &tablet->handlers, destroy); | ||||
| 
 | ||||
| 	wl_list_insert(&seat->tablets, &tablet->link); | ||||
| 	tablet_pad_attach_tablet(tablet->seat); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| tablet_init(struct seat *seat) | ||||
| { | ||||
| 	CONNECT_SIGNAL(seat->cursor, seat, tablet_tool_axis); | ||||
| 	CONNECT_SIGNAL(seat->cursor, seat, tablet_tool_proximity); | ||||
| 	CONNECT_SIGNAL(seat->cursor, seat, tablet_tool_tip); | ||||
| 	CONNECT_SIGNAL(seat->cursor, seat, tablet_tool_button); | ||||
| } | ||||
| 
 | ||||
| void | ||||
| tablet_finish(struct seat *seat) | ||||
| { | ||||
| 	wl_list_remove(&seat->tablet_tool_axis.link); | ||||
| 	wl_list_remove(&seat->tablet_tool_proximity.link); | ||||
| 	wl_list_remove(&seat->tablet_tool_tip.link); | ||||
| 	wl_list_remove(&seat->tablet_tool_button.link); | ||||
| } | ||||
|  |  | |||
|  | @ -367,7 +367,7 @@ new_tablet(struct seat *seat, struct wlr_input_device *dev) | |||
| { | ||||
| 	struct input *input = znew(*input); | ||||
| 	input->wlr_input_device = dev; | ||||
| 	tablet_init(seat, dev); | ||||
| 	tablet_create(seat, dev); | ||||
| 	wlr_cursor_attach_input_device(seat->cursor, dev); | ||||
| 	wlr_log(WLR_INFO, "map tablet to output %s\n", rc.tablet.output_name); | ||||
| 	map_input_to_output(seat, dev, rc.tablet.output_name); | ||||
|  | @ -380,7 +380,7 @@ new_tablet_pad(struct seat *seat, struct wlr_input_device *dev) | |||
| { | ||||
| 	struct input *input = znew(*input); | ||||
| 	input->wlr_input_device = dev; | ||||
| 	tablet_pad_init(seat, dev); | ||||
| 	tablet_pad_create(seat, dev); | ||||
| 
 | ||||
| 	return input; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jens Peters
						Jens Peters