diff --git a/include/input/tablet-pad.h b/include/input/tablet-pad.h index 4f39239f..3ada7634 100644 --- a/include/input/tablet-pad.h +++ b/include/input/tablet-pad.h @@ -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); diff --git a/include/input/tablet-tool.h b/include/input/tablet-tool.h index 8f7b589d..76306877 100644 --- a/include/input/tablet-tool.h +++ b/include/input/tablet-tool.h @@ -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); diff --git a/include/input/tablet.h b/include/input/tablet.h index 0ca11fae..e9145636 100644 --- a/include/input/tablet.h +++ b/include/input/tablet.h @@ -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 */ diff --git a/include/labwc.h b/include/labwc.h index 1e577c86..14ce607c 100644 --- a/include/labwc.h +++ b/include/labwc.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; diff --git a/src/input/cursor.c b/src/input/cursor.c index 94e23fdd..3b2583f0 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -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); diff --git a/src/input/tablet-pad.c b/src/input/tablet-pad.c index c5381ef1..2453be96 100644 --- a/src/input/tablet-pad.c +++ b/src/input/tablet-pad.c @@ -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); diff --git a/src/input/tablet-tool.c b/src/input/tablet-tool.c index 3e36f5b0..fcc1e733 100644 --- a/src/input/tablet-tool.c +++ b/src/input/tablet-tool.c @@ -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"); diff --git a/src/input/tablet.c b/src/input/tablet.c index 1d280e71..489da6fa 100644 --- a/src/input/tablet.c +++ b/src/input/tablet.c @@ -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); +} diff --git a/src/seat.c b/src/seat.c index 7987b5a3..49f317cc 100644 --- a/src/seat.c +++ b/src/seat.c @@ -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; }