From: JengHyun Kang Date: Tue, 25 Apr 2017 09:51:02 +0000 (+0900) Subject: support a AUX code events generated from EV_ABS X-Git-Tag: submit/tizen/20170516.065046^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=be4b333671bf0ef761ec4e4be63e096665fab16d;p=platform%2Fupstream%2Flibinput.git support a AUX code events generated from EV_ABS Change-Id: I144282f5ddc330eb77b73b3da5a36cedb6af069f --- diff --git a/src/evdev.c b/src/evdev.c index d6dcd3b7..37823b4b 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -321,6 +321,20 @@ evdev_device_transform_pressure(struct evdev_device *device, } } +static void +evdev_flush_extra_aux_data(struct evdev_device *device, uint64_t time, int32_t type, int32_t slot, int32_t seat_slot) +{ + struct libinput_device *base = &device->base; + struct mt_aux_data *aux_data; + + list_for_each(aux_data, &device->mt.aux_data_list[slot], link) { + if (aux_data->changed) { + touch_notify_aux_data(base, time, slot, seat_slot, aux_data->code, aux_data->value); + aux_data->changed = false; + } + } +} + static void evdev_flush_pending_event(struct evdev_device *device, uint64_t time) { @@ -400,7 +414,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time) x = slot_data->x; y = slot_data->y; transform_absolute(device, &x, &y); - + evdev_flush_extra_aux_data(device, time, device->pending_event, slot, seat_slot); touch_notify_touch_down(base, time, slot, seat_slot, x, y, &slot_data->area, slot_data->pressure); break; case EVDEV_ABSOLUTE_MT_MOTION: @@ -415,6 +429,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time) break; transform_absolute(device, &x, &y); + evdev_flush_extra_aux_data(device, time, device->pending_event, slot, seat_slot); touch_notify_touch_motion(base, time, slot, seat_slot, x, y, &slot_data->area, slot_data->pressure); break; case EVDEV_ABSOLUTE_MT_UP: @@ -429,6 +444,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time) seat->slot_map &= ~(1 << seat_slot); + evdev_flush_extra_aux_data(device, time, device->pending_event, slot, seat_slot); touch_notify_touch_up(base, time, slot, seat_slot); break; case EVDEV_ABSOLUTE_TOUCH_DOWN: @@ -454,7 +470,6 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time) cx = device->abs.x; cy = device->abs.y; transform_absolute(device, &cx, &cy); - touch_notify_touch_down(base, time, -1, seat_slot, cx, cy, &default_touch, DEFAULT_TOUCH_PRESSURE); break; case EVDEV_ABSOLUTE_MOTION: @@ -624,6 +639,35 @@ evdev_process_key(struct evdev_device *device, } } +static bool +evdev_process_touch_extra_aux_data(struct evdev_device *device, + struct input_event *e) +{ + struct mt_aux_data *aux_data; + struct list *current_axis_list; + bool res = false; + + if (!device->mt.aux_data_list) return false; + + current_axis_list = &device->mt.aux_data_list[device->mt.slot]; + if (!current_axis_list) return false; + + if (list_empty(current_axis_list)) return false; + + list_for_each(aux_data, current_axis_list, link) { + if (aux_data->code == e->code) { + if (aux_data->value != e->value) { + aux_data->changed = true; + aux_data->value = e->value; + } + res = true; + break; + } + } + + return res; +} + static void evdev_process_touch(struct evdev_device *device, struct input_event *e, @@ -662,7 +706,8 @@ evdev_process_touch(struct evdev_device *device, current_slot->area.orientation = e->value; break; default: - needs_wake = false; + if (!evdev_process_touch_extra_aux_data(device, e)) + needs_wake = false; break; } if (needs_wake && device->pending_event == EVDEV_NONE) @@ -1638,6 +1683,16 @@ evdev_configure_device(struct evdev_device *device) device->mt.slots = slots; device->mt.slots_len = num_slots; device->mt.slot = active_slot; + + device->mt.aux_data_list = calloc(num_slots, sizeof(struct list)); + if (device->mt.aux_data_list) { + int i; + for (i=0; imt.aux_data_list[i]); + } + } + else + return -1; } } @@ -2363,3 +2418,41 @@ evdev_device_destroy(struct evdev_device *device) free(device->mt.slots); free(device); } + +int +evdev_device_has_aux_data(struct evdev_device *device, uint32_t code) +{ + const struct input_absinfo *absinfo_aux_data; + absinfo_aux_data = libevdev_get_abs_info(device->evdev, code); + + return !!absinfo_aux_data; +} + +void +evdev_device_set_aux_data(struct evdev_device *device, uint32_t code) +{ + int i; + struct mt_aux_data *aux_data, *aux_data_tmp; + + if (!list_empty(&device->mt.aux_data_list[0])) { + list_for_each(aux_data, &device->mt.aux_data_list[0], link) { + if (code == aux_data->code) return; + } + } + + for (i = 0; i < (int)device->mt.slots_len; i++) { + aux_data = calloc(1, sizeof(struct mt_aux_data)); + if (!aux_data) goto failed; + aux_data->code = code; + list_insert(&device->mt.aux_data_list[i], &aux_data->link); + } + + return; +failed: + for (i = i-1; i >= 0; i--) { + list_for_each_safe(aux_data, aux_data_tmp, &device->mt.aux_data_list[i], link) { + list_remove(&aux_data->link); + free(aux_data); + } + } +} diff --git a/src/evdev.h b/src/evdev.h index 85cbaa94..81c83b22 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -64,6 +64,13 @@ struct mt_slot { int32_t pressure; }; +struct mt_aux_data { + uint32_t code; + int32_t value; + bool changed; + struct list link; +}; + struct evdev_device { struct libinput_device base; @@ -93,6 +100,7 @@ struct evdev_device { struct { int slot; struct mt_slot *slots; + struct list *aux_data_list; size_t slots_len; } mt; struct mtdev *mtdev; @@ -368,4 +376,9 @@ evdev_to_left_handed(struct evdev_device *device, return button; } +int +evdev_device_has_aux_data(struct evdev_device *device, uint32_t code); + +void +evdev_device_set_aux_data(struct evdev_device *device, uint32_t code); #endif /* EVDEV_H */ diff --git a/src/libinput-private.h b/src/libinput-private.h index 8b6613da..5cca9ec3 100644 --- a/src/libinput-private.h +++ b/src/libinput-private.h @@ -362,6 +362,14 @@ void touch_notify_frame(struct libinput_device *device, uint64_t time); +void +touch_notify_aux_data(struct libinput_device *device, + uint64_t time, + int32_t slot, + int32_t seat_slot, + uint32_t code, + int32_t value); + static inline uint64_t libinput_now(struct libinput *libinput) { diff --git a/src/libinput.c b/src/libinput.c index 9ebc6899..784c8961 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -40,6 +40,10 @@ if (!check_event_type(li_, __func__, type_, __VA_ARGS__, -1)) \ return retval_; \ +#ifndef ABS_MT_PALM +#define ABS_MT_PALM 0x3e +#endif + static inline bool check_event_type(struct libinput *libinput, const char *function_name, @@ -117,6 +121,15 @@ struct libinput_event_touch { int32_t pressure; }; +struct libinput_event_touch_aux_data { + struct libinput_event base; + uint32_t time; + int32_t slot; + int32_t seat_slot; + uint32_t code; + int32_t value; +}; + static void libinput_default_log_func(struct libinput *libinput, enum libinput_log_priority priority, @@ -220,6 +233,7 @@ libinput_event_get_pointer_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_MOTION: case LIBINPUT_EVENT_TOUCH_CANCEL: case LIBINPUT_EVENT_TOUCH_FRAME: + case LIBINPUT_EVENT_TOUCH_AUX_DATA: break; } @@ -246,6 +260,7 @@ libinput_event_get_keyboard_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_MOTION: case LIBINPUT_EVENT_TOUCH_CANCEL: case LIBINPUT_EVENT_TOUCH_FRAME: + case LIBINPUT_EVENT_TOUCH_AUX_DATA: break; } @@ -272,6 +287,8 @@ libinput_event_get_touch_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_CANCEL: case LIBINPUT_EVENT_TOUCH_FRAME: return (struct libinput_event_touch *) event; + case LIBINPUT_EVENT_TOUCH_AUX_DATA: + break; } return NULL; @@ -296,6 +313,7 @@ libinput_event_get_device_notify_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_MOTION: case LIBINPUT_EVENT_TOUCH_CANCEL: case LIBINPUT_EVENT_TOUCH_FRAME: + case LIBINPUT_EVENT_TOUCH_AUX_DATA: break; } @@ -760,6 +778,135 @@ libinput_event_touch_has_pressure(struct libinput_event_touch *event) return device->abs.absinfo_pressure != 0; } +LIBINPUT_EXPORT struct libinput_event_touch_aux_data * +libinput_event_get_touch_aux_data(struct libinput_event *event) +{ + switch (event->type) { + case LIBINPUT_EVENT_NONE: + abort(); /* not used as actual event type */ + case LIBINPUT_EVENT_DEVICE_ADDED: + case LIBINPUT_EVENT_DEVICE_REMOVED: + case LIBINPUT_EVENT_KEYBOARD_KEY: + case LIBINPUT_EVENT_POINTER_MOTION: + case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: + case LIBINPUT_EVENT_POINTER_BUTTON: + case LIBINPUT_EVENT_POINTER_AXIS: + case LIBINPUT_EVENT_TOUCH_DOWN: + case LIBINPUT_EVENT_TOUCH_UP: + case LIBINPUT_EVENT_TOUCH_MOTION: + case LIBINPUT_EVENT_TOUCH_CANCEL: + case LIBINPUT_EVENT_TOUCH_FRAME: + break; + case LIBINPUT_EVENT_TOUCH_AUX_DATA: + return (struct libinput_event_touch_aux_data *) event; + } + + return NULL; +} + +LIBINPUT_EXPORT int +libinput_event_touch_aux_data_get_code(struct libinput_event_touch_aux_data *event) +{ + require_event_type(libinput_event_get_context(&event->base), + event->base.type, + 0, + LIBINPUT_EVENT_TOUCH_AUX_DATA); + + return event->code; +} + +LIBINPUT_EXPORT int +libinput_event_touch_aux_data_get_value(struct libinput_event_touch_aux_data *event) +{ + require_event_type(libinput_event_get_context(&event->base), + event->base.type, + 0, + LIBINPUT_EVENT_TOUCH_AUX_DATA); + + return event->value; +} + +LIBINPUT_EXPORT int +libinput_event_touch_aux_data_get_slot(struct libinput_event_touch_aux_data *event) +{ + require_event_type(libinput_event_get_context(&event->base), + event->base.type, + 0, + LIBINPUT_EVENT_TOUCH_AUX_DATA); + + return event->slot; +} + +LIBINPUT_EXPORT int +libinput_event_touch_aux_data_get_seat_slot(struct libinput_event_touch_aux_data *event) +{ + require_event_type(libinput_event_get_context(&event->base), + event->base.type, + 0, + LIBINPUT_EVENT_TOUCH_AUX_DATA); + + return event->seat_slot; +} + +LIBINPUT_EXPORT int +libinput_event_touch_aux_data_get_time(struct libinput_event_touch_aux_data *event) +{ + require_event_type(libinput_event_get_context(&event->base), + event->base.type, + 0, + LIBINPUT_EVENT_TOUCH_AUX_DATA); + + return event->time; +} + +LIBINPUT_EXPORT unsigned int +libinput_event_touch_aux_data_get_type(struct libinput_event_touch_aux_data *event) +{ + require_event_type(libinput_event_get_context(&event->base), + event->base.type, + 0, + LIBINPUT_EVENT_TOUCH_AUX_DATA); + + if (event->code == ABS_MT_PALM) { + return LIBINPUT_TOUCH_AUX_DATA_TYPE_PALM; + } + + return LIBINPUT_TOUCH_AUX_DATA_TYPE_UNKNOWN; +} + + +LIBINPUT_EXPORT int +libinput_device_touch_has_aux_data(struct libinput_device *device, uint32_t aux_data) +{ + if (!evdev_device_has_capability((struct evdev_device *)device, + LIBINPUT_DEVICE_CAP_TOUCH)) + return 0; + + return evdev_device_has_aux_data((struct evdev_device *)device, aux_data); +} + +LIBINPUT_EXPORT int +libinput_device_touch_set_aux_data(struct libinput_device *device, uint32_t aux_data) +{ + if (!evdev_device_has_capability((struct evdev_device *)device, + LIBINPUT_DEVICE_CAP_TOUCH)) + return 0; + + evdev_device_set_aux_data((struct evdev_device *)device, aux_data); + return 1; +} + +LIBINPUT_EXPORT unsigned int +libinput_device_touch_aux_data_get_code(enum libinput_touch_aux_data_type type) +{ + switch (type) { + case LIBINPUT_TOUCH_AUX_DATA_TYPE_PALM: + return ABS_MT_PALM; + default: + return 0; + } +} + struct libinput_source * libinput_add_fd(struct libinput *libinput, int fd, @@ -1495,6 +1642,39 @@ touch_notify_frame(struct libinput_device *device, TRACE_INPUT_END(); } +void +touch_notify_aux_data(struct libinput_device *device, + uint64_t time, + int32_t slot, + int32_t seat_slot, + uint32_t code, + int32_t value) +{ + struct libinput_event_touch_aux_data *touch_aux_data_event; + + TRACE_INPUT_BEGIN(touch_notify_aux_data); + + touch_aux_data_event = zalloc(sizeof *touch_aux_data_event); + if (!touch_aux_data_event) { + TRACE_INPUT_END(); + return; + } + + *touch_aux_data_event = (struct libinput_event_touch_aux_data) { + .time = time, + .slot = slot, + .seat_slot = seat_slot, + .code = code, + .value = value, + }; + + post_device_event(device, time, + LIBINPUT_EVENT_TOUCH_AUX_DATA, + &touch_aux_data_event->base); + + TRACE_INPUT_END(); +} + static void libinput_post_event(struct libinput *libinput, struct libinput_event *event) diff --git a/src/libinput.h b/src/libinput.h index 77921864..2597ea41 100644 --- a/src/libinput.h +++ b/src/libinput.h @@ -128,6 +128,11 @@ enum libinput_pointer_axis_source { LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS, }; +enum libinput_touch_aux_data_type { + LIBINPUT_TOUCH_AUX_DATA_TYPE_UNKNOWN, + LIBINPUT_TOUCH_AUX_DATA_TYPE_PALM, +}; + /** * @ingroup base * @@ -172,7 +177,9 @@ enum libinput_event_type { * Signals the end of a set of touchpoints at one device sample * time. This event has no coordinate information attached. */ - LIBINPUT_EVENT_TOUCH_FRAME + LIBINPUT_EVENT_TOUCH_FRAME, + LIBINPUT_EVENT_TOUCH_LAST = LIBINPUT_EVENT_TOUCH_FRAME, + LIBINPUT_EVENT_TOUCH_AUX_DATA = LIBINPUT_EVENT_TOUCH_LAST + 1, }; /** @@ -261,6 +268,14 @@ struct libinput_event_pointer; */ struct libinput_event_touch; +/** + * @ingroup event_touch_aux_data + * @struct libinput_event_touch_aux_data + * + * Support extra touch axis + */ +struct libinput_event_touch_aux_data; + /** * @defgroup event Accessing and destruction of events */ @@ -356,6 +371,7 @@ libinput_event_get_keyboard_event(struct libinput_event *event); struct libinput_event_touch * libinput_event_get_touch_event(struct libinput_event *event); + /** * @ingroup event * @@ -1106,6 +1122,36 @@ libinput_event_touch_get_orientation(struct libinput_event_touch *event); int libinput_event_touch_has_orientation(struct libinput_event_touch *event); +struct libinput_event_touch_aux_data * +libinput_event_get_touch_aux_data(struct libinput_event *event); + +int +libinput_device_touch_has_aux_data(struct libinput_device *device, uint32_t axis); + +int +libinput_device_touch_set_aux_data(struct libinput_device *device, uint32_t axis); + +unsigned int +libinput_device_touch_aux_data_get_code(enum libinput_touch_aux_data_type type); + +int +libinput_event_touch_aux_data_get_code(struct libinput_event_touch_aux_data *event); + +int +libinput_event_touch_aux_data_get_value(struct libinput_event_touch_aux_data *event); + +int +libinput_event_touch_aux_data_get_slot(struct libinput_event_touch_aux_data *event); + +int +libinput_event_touch_aux_data_get_seat_slot(struct libinput_event_touch_aux_data *event); + +int +libinput_event_touch_aux_data_get_time(struct libinput_event_touch_aux_data *event); + +unsigned int +libinput_event_touch_aux_data_get_type(struct libinput_event_touch_aux_data *event); + /** * @ingroup event_touch * diff --git a/src/libinput.sym b/src/libinput.sym index d17fb14a..4c71a15f 100644 --- a/src/libinput.sym +++ b/src/libinput.sym @@ -149,4 +149,14 @@ LIBINPUT_1.1_unreleased { libinput_event_touch_has_minor; libinput_event_touch_has_orientation; libinput_event_touch_has_pressure; + libinput_event_get_touch_aux_data; + libinput_device_touch_has_aux_data; + libinput_device_touch_set_aux_data; + libinput_event_touch_aux_data_get_code; + libinput_event_touch_aux_data_get_value; + libinput_event_touch_aux_data_get_slot; + libinput_event_touch_aux_data_get_seat_slot; + libinput_event_touch_aux_data_get_time; + libinput_event_touch_aux_data_get_type; + libinput_device_touch_aux_data_get_code; } LIBINPUT_0.9.0;