mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-02-25 17:30:34 +01:00
evdev: improve type-safety on dispatch switches
Set the dispatch type on creation, then check that whenever we try to get the dispatch struct. This avoids a potential mismatch between the backends. Plus, use of container_of means we're not dependent on the exact layout anymore. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
dc15a42d6c
commit
60de087e65
10 changed files with 113 additions and 53 deletions
|
|
@ -41,13 +41,22 @@ struct lid_switch_dispatch {
|
|||
} keyboard;
|
||||
};
|
||||
|
||||
static inline struct lid_switch_dispatch*
|
||||
lid_dispatch(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct lid_switch_dispatch *l;
|
||||
|
||||
evdev_verify_dispatch_type(dispatch, DISPATCH_LID_SWITCH);
|
||||
|
||||
return container_of(dispatch, l, base);
|
||||
}
|
||||
|
||||
static void
|
||||
lid_switch_keyboard_event(uint64_t time,
|
||||
struct libinput_event *event,
|
||||
void *data)
|
||||
{
|
||||
struct lid_switch_dispatch *dispatch =
|
||||
(struct lid_switch_dispatch*)data;
|
||||
struct lid_switch_dispatch *dispatch = lid_dispatch(data);
|
||||
|
||||
if (!dispatch->lid_is_closed)
|
||||
return;
|
||||
|
|
@ -127,8 +136,7 @@ lid_switch_process(struct evdev_dispatch *evdev_dispatch,
|
|||
struct input_event *event,
|
||||
uint64_t time)
|
||||
{
|
||||
struct lid_switch_dispatch *dispatch =
|
||||
(struct lid_switch_dispatch*)evdev_dispatch;
|
||||
struct lid_switch_dispatch *dispatch = lid_dispatch(evdev_dispatch);
|
||||
|
||||
switch (event->type) {
|
||||
case EV_SW:
|
||||
|
|
@ -168,8 +176,7 @@ evdev_read_switch_reliability_prop(struct evdev_device *device)
|
|||
static void
|
||||
lid_switch_destroy(struct evdev_dispatch *evdev_dispatch)
|
||||
{
|
||||
struct lid_switch_dispatch *dispatch =
|
||||
(struct lid_switch_dispatch*)evdev_dispatch;
|
||||
struct lid_switch_dispatch *dispatch = lid_dispatch(evdev_dispatch);
|
||||
|
||||
free(dispatch);
|
||||
}
|
||||
|
|
@ -179,7 +186,7 @@ lid_switch_pair_keyboard(struct evdev_device *lid_switch,
|
|||
struct evdev_device *keyboard)
|
||||
{
|
||||
struct lid_switch_dispatch *dispatch =
|
||||
(struct lid_switch_dispatch*)lid_switch->dispatch;
|
||||
lid_dispatch(lid_switch->dispatch);
|
||||
unsigned int bus_kbd = libevdev_get_id_bustype(keyboard->evdev);
|
||||
|
||||
if ((keyboard->tags & EVDEV_TAG_KEYBOARD) == 0)
|
||||
|
|
@ -214,8 +221,7 @@ static void
|
|||
lid_switch_interface_device_removed(struct evdev_device *device,
|
||||
struct evdev_device *removed_device)
|
||||
{
|
||||
struct lid_switch_dispatch *dispatch =
|
||||
(struct lid_switch_dispatch*)device->dispatch;
|
||||
struct lid_switch_dispatch *dispatch = lid_dispatch(device->dispatch);
|
||||
|
||||
if (removed_device == dispatch->keyboard.keyboard) {
|
||||
libinput_device_remove_event_listener(
|
||||
|
|
@ -228,8 +234,7 @@ static void
|
|||
lid_switch_sync_initial_state(struct evdev_device *device,
|
||||
struct evdev_dispatch *evdev_dispatch)
|
||||
{
|
||||
struct lid_switch_dispatch *dispatch =
|
||||
(struct lid_switch_dispatch*)evdev_dispatch;
|
||||
struct lid_switch_dispatch *dispatch = lid_dispatch(device->dispatch);
|
||||
struct libevdev *evdev = device->evdev;
|
||||
bool is_closed = false;
|
||||
|
||||
|
|
@ -284,6 +289,7 @@ evdev_lid_switch_dispatch_create(struct evdev_device *lid_device)
|
|||
if (dispatch == NULL)
|
||||
return NULL;
|
||||
|
||||
dispatch->base.dispatch_type = DISPATCH_LID_SWITCH;
|
||||
dispatch->base.interface = &lid_switch_interface;
|
||||
dispatch->device = lid_device;
|
||||
libinput_device_init_event_listener(&dispatch->keyboard.listener);
|
||||
|
|
|
|||
|
|
@ -901,7 +901,7 @@ tp_tap_config_count(struct libinput_device *device)
|
|||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
dispatch = ((struct evdev_device *) device)->dispatch;
|
||||
tp = container_of(dispatch, tp, base);
|
||||
tp = tp_dispatch(dispatch);
|
||||
|
||||
return min(tp->ntouches, 3U); /* we only do up to 3 finger tap */
|
||||
}
|
||||
|
|
@ -910,10 +910,12 @@ static enum libinput_config_status
|
|||
tp_tap_config_set_enabled(struct libinput_device *device,
|
||||
enum libinput_config_tap_state enabled)
|
||||
{
|
||||
struct evdev_dispatch *dispatch = ((struct evdev_device *) device)->dispatch;
|
||||
struct evdev_dispatch *dispatch;
|
||||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
tp = container_of(dispatch, tp, base);
|
||||
dispatch = ((struct evdev_device *) device)->dispatch;
|
||||
tp = tp_dispatch(dispatch);
|
||||
|
||||
tp_tap_enabled_update(tp, tp->tap.suspended,
|
||||
(enabled == LIBINPUT_CONFIG_TAP_ENABLED),
|
||||
libinput_now(device->seat->libinput));
|
||||
|
|
@ -928,7 +930,7 @@ tp_tap_config_is_enabled(struct libinput_device *device)
|
|||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
dispatch = ((struct evdev_device *) device)->dispatch;
|
||||
tp = container_of(dispatch, tp, base);
|
||||
tp = tp_dispatch(dispatch);
|
||||
|
||||
return tp->tap.enabled ? LIBINPUT_CONFIG_TAP_ENABLED :
|
||||
LIBINPUT_CONFIG_TAP_DISABLED;
|
||||
|
|
@ -971,7 +973,7 @@ tp_tap_config_set_map(struct libinput_device *device,
|
|||
struct evdev_dispatch *dispatch = ((struct evdev_device *) device)->dispatch;
|
||||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
tp = container_of(dispatch, tp, base);
|
||||
tp = tp_dispatch(dispatch);
|
||||
tp->tap.want_map = map;
|
||||
|
||||
tp_tap_update_map(tp);
|
||||
|
|
@ -985,7 +987,7 @@ tp_tap_config_get_map(struct libinput_device *device)
|
|||
struct evdev_dispatch *dispatch = ((struct evdev_device *) device)->dispatch;
|
||||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
tp = container_of(dispatch, tp, base);
|
||||
tp = tp_dispatch(dispatch);
|
||||
|
||||
return tp->tap.want_map;
|
||||
}
|
||||
|
|
@ -1003,7 +1005,7 @@ tp_tap_config_set_drag_enabled(struct libinput_device *device,
|
|||
struct evdev_dispatch *dispatch = ((struct evdev_device *) device)->dispatch;
|
||||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
tp = container_of(dispatch, tp, base);
|
||||
tp = tp_dispatch(dispatch);
|
||||
tp->tap.drag_enabled = enabled;
|
||||
|
||||
return LIBINPUT_CONFIG_STATUS_SUCCESS;
|
||||
|
|
@ -1015,7 +1017,7 @@ tp_tap_config_get_drag_enabled(struct libinput_device *device)
|
|||
struct evdev_device *evdev = (struct evdev_device *)device;
|
||||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
tp = container_of(evdev->dispatch, tp, base);
|
||||
tp = tp_dispatch(evdev->dispatch);
|
||||
|
||||
return tp->tap.drag_enabled;
|
||||
}
|
||||
|
|
@ -1041,7 +1043,7 @@ tp_tap_config_set_draglock_enabled(struct libinput_device *device,
|
|||
struct evdev_dispatch *dispatch = ((struct evdev_device *) device)->dispatch;
|
||||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
tp = container_of(dispatch, tp, base);
|
||||
tp = tp_dispatch(dispatch);
|
||||
tp->tap.drag_lock_enabled = enabled;
|
||||
|
||||
return LIBINPUT_CONFIG_STATUS_SUCCESS;
|
||||
|
|
@ -1053,7 +1055,7 @@ tp_tap_config_get_draglock_enabled(struct libinput_device *device)
|
|||
struct evdev_device *evdev = (struct evdev_device *)device;
|
||||
struct tp_dispatch *tp = NULL;
|
||||
|
||||
tp = container_of(evdev->dispatch, tp, base);
|
||||
tp = tp_dispatch(evdev->dispatch);
|
||||
|
||||
return tp->tap.drag_lock_enabled;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1140,8 +1140,7 @@ tp_interface_process(struct evdev_dispatch *dispatch,
|
|||
struct input_event *e,
|
||||
uint64_t time)
|
||||
{
|
||||
struct tp_dispatch *tp =
|
||||
(struct tp_dispatch *)dispatch;
|
||||
struct tp_dispatch *tp = tp_dispatch(dispatch);
|
||||
|
||||
if (tp->ignore_events)
|
||||
return;
|
||||
|
|
@ -1185,8 +1184,7 @@ tp_remove_sendevents(struct tp_dispatch *tp)
|
|||
static void
|
||||
tp_interface_remove(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct tp_dispatch *tp =
|
||||
(struct tp_dispatch*)dispatch;
|
||||
struct tp_dispatch *tp = tp_dispatch(dispatch);
|
||||
|
||||
tp_remove_tap(tp);
|
||||
tp_remove_buttons(tp);
|
||||
|
|
@ -1198,8 +1196,7 @@ tp_interface_remove(struct evdev_dispatch *dispatch)
|
|||
static void
|
||||
tp_interface_destroy(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct tp_dispatch *tp =
|
||||
(struct tp_dispatch*)dispatch;
|
||||
struct tp_dispatch *tp = tp_dispatch(dispatch);
|
||||
|
||||
free(tp->touches);
|
||||
free(tp);
|
||||
|
|
@ -1261,7 +1258,7 @@ static void
|
|||
tp_interface_suspend(struct evdev_dispatch *dispatch,
|
||||
struct evdev_device *device)
|
||||
{
|
||||
struct tp_dispatch *tp = (struct tp_dispatch *)dispatch;
|
||||
struct tp_dispatch *tp = tp_dispatch(dispatch);
|
||||
|
||||
tp_clear_state(tp);
|
||||
}
|
||||
|
|
@ -1742,7 +1739,7 @@ tp_interface_toggle_touch(struct evdev_dispatch *dispatch,
|
|||
struct evdev_device *device,
|
||||
bool enable)
|
||||
{
|
||||
struct tp_dispatch *tp = (struct tp_dispatch*)dispatch;
|
||||
struct tp_dispatch *tp = tp_dispatch(dispatch);
|
||||
bool ignore_events = !enable;
|
||||
|
||||
if (ignore_events == tp->ignore_events)
|
||||
|
|
@ -2322,6 +2319,7 @@ static int
|
|||
tp_init(struct tp_dispatch *tp,
|
||||
struct evdev_device *device)
|
||||
{
|
||||
tp->base.dispatch_type = DISPATCH_TOUCHPAD;
|
||||
tp->base.interface = &tp_interface;
|
||||
tp->device = device;
|
||||
|
||||
|
|
|
|||
|
|
@ -383,6 +383,16 @@ struct tp_dispatch {
|
|||
} lid_switch;
|
||||
};
|
||||
|
||||
static inline struct tp_dispatch*
|
||||
tp_dispatch(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct tp_dispatch *tp;
|
||||
|
||||
evdev_verify_dispatch_type(dispatch, DISPATCH_TOUCHPAD);
|
||||
|
||||
return container_of(dispatch, tp, base);
|
||||
}
|
||||
|
||||
#define tp_for_each_touch(_tp, _t) \
|
||||
for (unsigned int _i = 0; _i < (_tp)->ntouches && (_t = &(_tp)->touches[_i]); _i++)
|
||||
|
||||
|
|
|
|||
|
|
@ -452,7 +452,7 @@ pad_process(struct evdev_dispatch *dispatch,
|
|||
struct input_event *e,
|
||||
uint64_t time)
|
||||
{
|
||||
struct pad_dispatch *pad = (struct pad_dispatch *)dispatch;
|
||||
struct pad_dispatch *pad = pad_dispatch(dispatch);
|
||||
|
||||
switch (e->type) {
|
||||
case EV_ABS:
|
||||
|
|
@ -481,7 +481,7 @@ static void
|
|||
pad_suspend(struct evdev_dispatch *dispatch,
|
||||
struct evdev_device *device)
|
||||
{
|
||||
struct pad_dispatch *pad = (struct pad_dispatch *)dispatch;
|
||||
struct pad_dispatch *pad = pad_dispatch(dispatch);
|
||||
struct libinput *libinput = pad_libinput_context(pad);
|
||||
unsigned int code;
|
||||
|
||||
|
|
@ -496,7 +496,7 @@ pad_suspend(struct evdev_dispatch *dispatch,
|
|||
static void
|
||||
pad_destroy(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct pad_dispatch *pad = (struct pad_dispatch*)dispatch;
|
||||
struct pad_dispatch *pad = pad_dispatch(dispatch);
|
||||
|
||||
pad_destroy_leds(pad);
|
||||
free(pad);
|
||||
|
|
@ -556,6 +556,7 @@ pad_init_left_handed(struct evdev_device *device)
|
|||
static int
|
||||
pad_init(struct pad_dispatch *pad, struct evdev_device *device)
|
||||
{
|
||||
pad->base.dispatch_type = DISPATCH_TABLET_PAD;
|
||||
pad->base.interface = &pad_interface;
|
||||
pad->device = device;
|
||||
pad->status = PAD_NONE;
|
||||
|
|
|
|||
|
|
@ -70,6 +70,16 @@ struct pad_dispatch {
|
|||
} modes;
|
||||
};
|
||||
|
||||
static inline struct pad_dispatch*
|
||||
pad_dispatch(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct pad_dispatch *p;
|
||||
|
||||
evdev_verify_dispatch_type(dispatch, DISPATCH_TABLET_PAD);
|
||||
|
||||
return container_of(dispatch, p, base);
|
||||
}
|
||||
|
||||
static inline struct libinput *
|
||||
pad_libinput_context(const struct pad_dispatch *pad)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -201,8 +201,7 @@ tablet_process_absolute(struct tablet_dispatch *tablet,
|
|||
static void
|
||||
tablet_change_to_left_handed(struct evdev_device *device)
|
||||
{
|
||||
struct tablet_dispatch *tablet =
|
||||
(struct tablet_dispatch*)device->dispatch;
|
||||
struct tablet_dispatch *tablet = tablet_dispatch(device->dispatch);
|
||||
|
||||
if (device->left_handed.enabled == device->left_handed.want_enabled)
|
||||
return;
|
||||
|
|
@ -1484,8 +1483,7 @@ tablet_process(struct evdev_dispatch *dispatch,
|
|||
struct input_event *e,
|
||||
uint64_t time)
|
||||
{
|
||||
struct tablet_dispatch *tablet =
|
||||
(struct tablet_dispatch *)dispatch;
|
||||
struct tablet_dispatch *tablet = tablet_dispatch(dispatch);
|
||||
|
||||
switch (e->type) {
|
||||
case EV_ABS:
|
||||
|
|
@ -1518,8 +1516,7 @@ static void
|
|||
tablet_suspend(struct evdev_dispatch *dispatch,
|
||||
struct evdev_device *device)
|
||||
{
|
||||
struct tablet_dispatch *tablet =
|
||||
(struct tablet_dispatch *)dispatch;
|
||||
struct tablet_dispatch *tablet = tablet_dispatch(dispatch);
|
||||
|
||||
tablet_set_touch_device_enabled(tablet->touch_device, true);
|
||||
}
|
||||
|
|
@ -1527,8 +1524,7 @@ tablet_suspend(struct evdev_dispatch *dispatch,
|
|||
static void
|
||||
tablet_destroy(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct tablet_dispatch *tablet =
|
||||
(struct tablet_dispatch*)dispatch;
|
||||
struct tablet_dispatch *tablet = tablet_dispatch(dispatch);
|
||||
struct libinput_tablet_tool *tool, *tmp;
|
||||
|
||||
list_for_each_safe(tool, tmp, &tablet->tool_list, link) {
|
||||
|
|
@ -1542,8 +1538,7 @@ static void
|
|||
tablet_device_added(struct evdev_device *device,
|
||||
struct evdev_device *added_device)
|
||||
{
|
||||
struct tablet_dispatch *tablet =
|
||||
(struct tablet_dispatch*)device->dispatch;
|
||||
struct tablet_dispatch *tablet = tablet_dispatch(device->dispatch);
|
||||
|
||||
if (libinput_device_get_device_group(&device->base) !=
|
||||
libinput_device_get_device_group(&added_device->base))
|
||||
|
|
@ -1560,8 +1555,7 @@ static void
|
|||
tablet_device_removed(struct evdev_device *device,
|
||||
struct evdev_device *removed_device)
|
||||
{
|
||||
struct tablet_dispatch *tablet =
|
||||
(struct tablet_dispatch*)device->dispatch;
|
||||
struct tablet_dispatch *tablet = tablet_dispatch(device->dispatch);
|
||||
|
||||
if (tablet->touch_device == removed_device)
|
||||
tablet->touch_device = NULL;
|
||||
|
|
@ -1571,10 +1565,10 @@ static void
|
|||
tablet_check_initial_proximity(struct evdev_device *device,
|
||||
struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct tablet_dispatch *tablet = tablet_dispatch(dispatch);
|
||||
bool tool_in_prox = false;
|
||||
int code, state;
|
||||
enum libinput_tablet_tool_type tool;
|
||||
struct tablet_dispatch *tablet = (struct tablet_dispatch*)dispatch;
|
||||
|
||||
for (tool = LIBINPUT_TABLET_TOOL_TYPE_PEN; tool <= LIBINPUT_TABLET_TOOL_TYPE_MAX; tool++) {
|
||||
code = tablet_tool_to_evcode(tool);
|
||||
|
|
@ -1746,6 +1740,7 @@ tablet_init(struct tablet_dispatch *tablet,
|
|||
enum libinput_tablet_tool_axis axis;
|
||||
int rc;
|
||||
|
||||
tablet->base.dispatch_type = DISPATCH_TABLET;
|
||||
tablet->base.interface = &tablet_interface;
|
||||
tablet->device = device;
|
||||
tablet->status = TABLET_NONE;
|
||||
|
|
|
|||
|
|
@ -76,6 +76,16 @@ struct tablet_dispatch {
|
|||
struct evdev_device *touch_device;
|
||||
};
|
||||
|
||||
static inline struct tablet_dispatch*
|
||||
tablet_dispatch(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct tablet_dispatch *t;
|
||||
|
||||
evdev_verify_dispatch_type(dispatch, DISPATCH_TABLET);
|
||||
|
||||
return container_of(dispatch, t, base);
|
||||
}
|
||||
|
||||
static inline enum libinput_tablet_tool_axis
|
||||
evcode_to_axis(const uint32_t evcode)
|
||||
{
|
||||
|
|
|
|||
17
src/evdev.c
17
src/evdev.c
|
|
@ -1097,7 +1097,7 @@ fallback_process(struct evdev_dispatch *evdev_dispatch,
|
|||
struct input_event *event,
|
||||
uint64_t time)
|
||||
{
|
||||
struct fallback_dispatch *dispatch = (struct fallback_dispatch*)evdev_dispatch;
|
||||
struct fallback_dispatch *dispatch = fallback_dispatch(evdev_dispatch);
|
||||
enum evdev_event_type sent;
|
||||
|
||||
if (dispatch->ignore_events)
|
||||
|
|
@ -1226,7 +1226,7 @@ static void
|
|||
fallback_suspend(struct evdev_dispatch *evdev_dispatch,
|
||||
struct evdev_device *device)
|
||||
{
|
||||
struct fallback_dispatch *dispatch = (struct fallback_dispatch*)evdev_dispatch;
|
||||
struct fallback_dispatch *dispatch = fallback_dispatch(evdev_dispatch);
|
||||
|
||||
fallback_return_to_neutral_state(dispatch, device);
|
||||
}
|
||||
|
|
@ -1236,7 +1236,7 @@ fallback_toggle_touch(struct evdev_dispatch *evdev_dispatch,
|
|||
struct evdev_device *device,
|
||||
bool enable)
|
||||
{
|
||||
struct fallback_dispatch *dispatch = (struct fallback_dispatch*)evdev_dispatch;
|
||||
struct fallback_dispatch *dispatch = fallback_dispatch(evdev_dispatch);
|
||||
bool ignore_events = !enable;
|
||||
|
||||
if (ignore_events == dispatch->ignore_events)
|
||||
|
|
@ -1251,7 +1251,7 @@ fallback_toggle_touch(struct evdev_dispatch *evdev_dispatch,
|
|||
static void
|
||||
fallback_destroy(struct evdev_dispatch *evdev_dispatch)
|
||||
{
|
||||
struct fallback_dispatch *dispatch = (struct fallback_dispatch*)evdev_dispatch;
|
||||
struct fallback_dispatch *dispatch = fallback_dispatch(evdev_dispatch);
|
||||
|
||||
free(dispatch->mt.slots);
|
||||
free(dispatch);
|
||||
|
|
@ -1369,7 +1369,7 @@ evdev_left_handed_has(struct libinput_device *device)
|
|||
static void
|
||||
evdev_change_to_left_handed(struct evdev_device *device)
|
||||
{
|
||||
struct fallback_dispatch *dispatch = (struct fallback_dispatch*)device->dispatch;
|
||||
struct fallback_dispatch *dispatch = fallback_dispatch(device->dispatch);
|
||||
|
||||
if (device->left_handed.want_enabled == device->left_handed.enabled)
|
||||
return;
|
||||
|
|
@ -1431,7 +1431,7 @@ evdev_scroll_get_methods(struct libinput_device *device)
|
|||
static void
|
||||
evdev_change_scroll_method(struct evdev_device *device)
|
||||
{
|
||||
struct fallback_dispatch *dispatch = (struct fallback_dispatch*)device->dispatch;
|
||||
struct fallback_dispatch *dispatch = fallback_dispatch(device->dispatch);
|
||||
|
||||
if (device->scroll.want_method == device->scroll.method &&
|
||||
device->scroll.want_button == device->scroll.button)
|
||||
|
|
@ -1620,7 +1620,7 @@ evdev_rotation_config_set_angle(struct libinput_device *libinput_device,
|
|||
unsigned int degrees_cw)
|
||||
{
|
||||
struct evdev_device *device = (struct evdev_device*)libinput_device;
|
||||
struct fallback_dispatch *dispatch = (struct fallback_dispatch*)device->dispatch;
|
||||
struct fallback_dispatch *dispatch = fallback_dispatch(device->dispatch);
|
||||
|
||||
dispatch->rotation.angle = degrees_cw;
|
||||
matrix_init_rotate(&dispatch->rotation.matrix, degrees_cw);
|
||||
|
|
@ -1632,7 +1632,7 @@ static unsigned int
|
|||
evdev_rotation_config_get_angle(struct libinput_device *libinput_device)
|
||||
{
|
||||
struct evdev_device *device = (struct evdev_device*)libinput_device;
|
||||
struct fallback_dispatch *dispatch = (struct fallback_dispatch*)device->dispatch;
|
||||
struct fallback_dispatch *dispatch = fallback_dispatch(device->dispatch);
|
||||
|
||||
return dispatch->rotation.angle;
|
||||
}
|
||||
|
|
@ -1774,6 +1774,7 @@ fallback_dispatch_create(struct libinput_device *device)
|
|||
if (dispatch == NULL)
|
||||
return NULL;
|
||||
|
||||
dispatch->base.dispatch_type = DISPATCH_FALLBACK;
|
||||
dispatch->base.interface = &fallback_interface;
|
||||
dispatch->pending_event = EVDEV_NONE;
|
||||
|
||||
|
|
|
|||
27
src/evdev.h
27
src/evdev.h
|
|
@ -284,7 +284,16 @@ struct evdev_dispatch_interface {
|
|||
bool enable);
|
||||
};
|
||||
|
||||
enum evdev_dispatch_type {
|
||||
DISPATCH_FALLBACK,
|
||||
DISPATCH_TOUCHPAD,
|
||||
DISPATCH_TABLET,
|
||||
DISPATCH_TABLET_PAD,
|
||||
DISPATCH_LID_SWITCH,
|
||||
};
|
||||
|
||||
struct evdev_dispatch {
|
||||
enum evdev_dispatch_type dispatch_type;
|
||||
struct evdev_dispatch_interface *interface;
|
||||
|
||||
struct {
|
||||
|
|
@ -293,6 +302,14 @@ struct evdev_dispatch {
|
|||
} sendevents;
|
||||
};
|
||||
|
||||
static inline void
|
||||
evdev_verify_dispatch_type(struct evdev_dispatch *dispatch,
|
||||
enum evdev_dispatch_type type)
|
||||
{
|
||||
if (dispatch->dispatch_type != type)
|
||||
abort();
|
||||
}
|
||||
|
||||
struct fallback_dispatch {
|
||||
struct evdev_dispatch base;
|
||||
|
||||
|
|
@ -336,6 +353,16 @@ struct fallback_dispatch {
|
|||
bool ignore_events;
|
||||
};
|
||||
|
||||
static inline struct fallback_dispatch*
|
||||
fallback_dispatch(struct evdev_dispatch *dispatch)
|
||||
{
|
||||
struct fallback_dispatch *f;
|
||||
|
||||
evdev_verify_dispatch_type(dispatch, DISPATCH_FALLBACK);
|
||||
|
||||
return container_of(dispatch, f, base);
|
||||
}
|
||||
|
||||
struct evdev_device *
|
||||
evdev_device_create(struct libinput_seat *seat,
|
||||
struct udev_device *device);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue