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