A proximity-in event is something we want, especially since the current drafted wayland spec has a proximity-in event. Adding this also makes our events more consistent. And since we can just report the current tool in use with proximity-in events, we can get rid of the tool-update event.
Signed-off-by: Stephen Chandler Paul <[email protected]> --- src/evdev-tablet.c | 62 +++++++++++++++++++++++++++----------------------- src/evdev-tablet.h | 5 +++- src/libinput-private.h | 6 ++--- src/libinput.c | 28 +++++++++++------------ src/libinput.h | 27 +++++++++++----------- test/tablet.c | 43 ++++++++++++++-------------------- tools/event-debug.c | 10 ++++---- tools/event-gui.c | 2 +- 8 files changed, 92 insertions(+), 91 deletions(-) diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c index 584b49e..44b631a 100644 --- a/src/evdev-tablet.c +++ b/src/evdev-tablet.c @@ -99,6 +99,7 @@ tablet_update_tool(struct tablet_dispatch *tablet, tablet_set_status(tablet, TABLET_TOOL_UPDATED); } tablet_mark_all_axes_changed(tablet, device); + tablet_set_status(tablet, TABLET_TOOL_ENTERING_PROXIMITY); tablet_unset_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY); } else @@ -250,8 +251,6 @@ tablet_process_misc(struct tablet_dispatch *tablet, e->value != -1) { tablet->current_tool_serial = e->value; tablet_set_status(tablet, TABLET_TOOL_UPDATED); - tablet_unset_status(tablet, - TABLET_TOOL_OUT_OF_PROXIMITY); } break; default: @@ -264,36 +263,43 @@ tablet_process_misc(struct tablet_dispatch *tablet, } static void -tablet_notify_tool(struct tablet_dispatch *tablet, - struct evdev_device *device, - uint32_t time) +tablet_check_notify_proximity_in(struct tablet_dispatch *tablet, + struct evdev_device *device, + uint32_t time) { struct libinput_device *base = &device->base; - struct libinput_tool *tool; - struct libinput_tool *new_tool = NULL; - - /* Check if we already have the tool in our list of tools */ - list_for_each(tool, &base->seat->libinput->tool_list, link) { - if (tablet->current_tool_type == tool->type && - tablet->current_tool_serial == tool->serial) { - new_tool = tool; - break; + + if (tablet_has_status(tablet, TABLET_TOOL_UPDATED)) { + struct libinput_tool *tool, + *new_tool = NULL; + + /* Check if we already have the tool in our list of tools */ + list_for_each(tool, &base->seat->libinput->tool_list, link) { + if (tablet->current_tool_type == tool->type && + tablet->current_tool_serial == tool->serial) { + new_tool = tool; + break; + } } - } - /* If we didn't already have the tool in our list of tools, add it */ - if (new_tool == NULL) { - new_tool = zalloc(sizeof *new_tool); - *new_tool = (struct libinput_tool) { - .type = tablet->current_tool_type, - .serial = tablet->current_tool_serial, - .refcount = 1, - }; + /* If we didn't already have the new_tool in our list of tools, + * add it */ + if (new_tool == NULL) { + new_tool = zalloc(sizeof *new_tool); + *new_tool = (struct libinput_tool) { + .type = tablet->current_tool_type, + .serial = tablet->current_tool_serial, + .refcount = 1, + }; + + list_insert(&base->seat->libinput->tool_list, + &new_tool->link); + } - list_insert(&base->seat->libinput->tool_list, &new_tool->link); + tablet->current_tool = new_tool; } - tablet_notify_tool_update(base, time, new_tool); + tablet_notify_proximity_in(base, time, tablet->current_tool); } static void @@ -383,9 +389,9 @@ tablet_flush(struct tablet_dispatch *tablet, /* Release all stylus buttons */ tablet->button_state.stylus_buttons = 0; tablet_set_status(tablet, TABLET_BUTTONS_RELEASED); - } else if (tablet_has_status(tablet, TABLET_TOOL_UPDATED)) { - tablet_notify_tool(tablet, device, time); - tablet_unset_status(tablet, TABLET_TOOL_UPDATED); + } else if (tablet_has_status(tablet, TABLET_TOOL_ENTERING_PROXIMITY)) { + tablet_check_notify_proximity_in(tablet, device, time); + tablet_unset_status(tablet, TABLET_TOOL_ENTERING_PROXIMITY); } if (tablet_has_status(tablet, TABLET_AXES_UPDATED)) { diff --git a/src/evdev-tablet.h b/src/evdev-tablet.h index 89cf224..aa6b455 100644 --- a/src/evdev-tablet.h +++ b/src/evdev-tablet.h @@ -35,7 +35,8 @@ enum tablet_status { TABLET_BUTTONS_RELEASED = 1 << 3, TABLET_STYLUS_IN_CONTACT = 1 << 4, TABLET_TOOL_LEAVING_PROXIMITY = 1 << 5, - TABLET_TOOL_OUT_OF_PROXIMITY = 1 << 6 + TABLET_TOOL_OUT_OF_PROXIMITY = 1 << 6, + TABLET_TOOL_ENTERING_PROXIMITY = 1 << 7 }; struct button_state { @@ -54,6 +55,8 @@ struct tablet_dispatch { enum libinput_tool_type current_tool_type; uint32_t current_tool_serial; + + struct libinput_tool *current_tool; }; static inline enum libinput_tablet_axis diff --git a/src/libinput-private.h b/src/libinput-private.h index db78cca..e59fe12 100644 --- a/src/libinput-private.h +++ b/src/libinput-private.h @@ -218,9 +218,9 @@ tablet_notify_axis(struct libinput_device *device, double *axes); void -tablet_notify_tool_update(struct libinput_device *device, - uint32_t time, - struct libinput_tool *tool); +tablet_notify_proximity_in(struct libinput_device *device, + uint32_t time, + struct libinput_tool *tool); void tablet_notify_proximity_out(struct libinput_device *device, diff --git a/src/libinput.c b/src/libinput.c index e72ad8b..3726eb5 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -195,7 +195,7 @@ libinput_event_get_pointer_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_CANCEL: case LIBINPUT_EVENT_TOUCH_FRAME: case LIBINPUT_EVENT_TABLET_AXIS: - case LIBINPUT_EVENT_TABLET_TOOL_UPDATE: + case LIBINPUT_EVENT_TABLET_PROXIMITY_IN: case LIBINPUT_EVENT_TABLET_PROXIMITY_OUT: case LIBINPUT_EVENT_TABLET_BUTTON: break; @@ -225,7 +225,7 @@ libinput_event_get_keyboard_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_CANCEL: case LIBINPUT_EVENT_TOUCH_FRAME: case LIBINPUT_EVENT_TABLET_AXIS: - case LIBINPUT_EVENT_TABLET_TOOL_UPDATE: + case LIBINPUT_EVENT_TABLET_PROXIMITY_IN: case LIBINPUT_EVENT_TABLET_PROXIMITY_OUT: case LIBINPUT_EVENT_TABLET_BUTTON: break; @@ -255,7 +255,7 @@ libinput_event_get_touch_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_FRAME: return (struct libinput_event_touch *) event; case LIBINPUT_EVENT_TABLET_AXIS: - case LIBINPUT_EVENT_TABLET_TOOL_UPDATE: + case LIBINPUT_EVENT_TABLET_PROXIMITY_IN: case LIBINPUT_EVENT_TABLET_PROXIMITY_OUT: case LIBINPUT_EVENT_TABLET_BUTTON: break; @@ -284,7 +284,7 @@ libinput_event_get_tablet_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_FRAME: break; case LIBINPUT_EVENT_TABLET_AXIS: - case LIBINPUT_EVENT_TABLET_TOOL_UPDATE: + case LIBINPUT_EVENT_TABLET_PROXIMITY_IN: case LIBINPUT_EVENT_TABLET_PROXIMITY_OUT: case LIBINPUT_EVENT_TABLET_BUTTON: return (struct libinput_event_tablet *) event; @@ -313,7 +313,7 @@ libinput_event_get_device_notify_event(struct libinput_event *event) case LIBINPUT_EVENT_TOUCH_CANCEL: case LIBINPUT_EVENT_TOUCH_FRAME: case LIBINPUT_EVENT_TABLET_AXIS: - case LIBINPUT_EVENT_TABLET_TOOL_UPDATE: + case LIBINPUT_EVENT_TABLET_PROXIMITY_IN: case LIBINPUT_EVENT_TABLET_PROXIMITY_OUT: case LIBINPUT_EVENT_TABLET_BUTTON: break; @@ -1250,24 +1250,24 @@ tablet_notify_axis(struct libinput_device *device, } void -tablet_notify_tool_update(struct libinput_device *device, - uint32_t time, - struct libinput_tool *tool) +tablet_notify_proximity_in(struct libinput_device *device, + uint32_t time, + struct libinput_tool *tool) { - struct libinput_event_tablet *tool_update_event; + struct libinput_event_tablet *proximity_in_event; - tool_update_event = zalloc(sizeof *tool_update_event); - if (!tool_update_event) + proximity_in_event = zalloc(sizeof *proximity_in_event); + if (!proximity_in_event) return; - *tool_update_event = (struct libinput_event_tablet) { + *proximity_in_event = (struct libinput_event_tablet) { .time = time, .tool = tool, }; post_device_event(device, - LIBINPUT_EVENT_TABLET_TOOL_UPDATE, - &tool_update_event->base); + LIBINPUT_EVENT_TABLET_PROXIMITY_IN, + &proximity_in_event->base); } void diff --git a/src/libinput.h b/src/libinput.h index 38b6610..49162dd 100644 --- a/src/libinput.h +++ b/src/libinput.h @@ -261,10 +261,10 @@ enum libinput_event_type { LIBINPUT_EVENT_TABLET_AXIS = 600, /** - * Signals that a device with the @ref LIBINPUT_DEVICE_CAP_TABLET - * capability has changed its tool. + * Signals that a tool has come into proximity of a device with the @ref + * LIBINPUT_DEVICE_CAP_TABLET capability. */ - LIBINPUT_EVENT_TABLET_TOOL_UPDATE, + LIBINPUT_EVENT_TABLET_PROXIMITY_IN, /** * Signals that a device with the @ref LIBINPUT_DEVICE_CAP_TABLET * capability has detected that there is no longer a tool in use. When @@ -305,8 +305,8 @@ struct libinput_event_touch; * * Tablet event representing an axis update, button press, or tool update. Valid * event types for this event are @ref LIBINPUT_EVENT_TABLET_AXIS, @ref - * LIBINPUT_EVENT_TABLET_TOOL_UPDATE, @ref LIBINPUT_EVENT_TABLET_TOOL_UPDATE and - * @ref LIBINPUT_EVENT_TABLET_BUTTON. + * LIBINPUT_EVENT_TABLET_PROXIMITY_IN, @ref LIBINPUT_EVENT_TABLET_PROXIMITY_IN + * and @ref LIBINPUT_EVENT_TABLET_BUTTON. */ struct libinput_event_tablet; @@ -918,17 +918,18 @@ libinput_event_tablet_get_y_transformed(struct libinput_event_tablet *event, /** * @ingroup event_tablet * - * Return the new tool in use for this event. + * Returns the tool that came into proximity for this event. * For tablet events that are not of type @ref - * LIBINPUT_EVENT_TABLET_TOOL_UPDATE, this function returns NULL. By default, - * the lifetime of each tool is bound to the lifetime of the event, so the tool - * will be destroyed when the event is destroyed. However, the lifetime of the - * tool may be extended by using libinput_tool_ref() to increment the reference - * count of the tool. Whenever libinput detects that the tool is in proximity of - * any tablet that's connected, it will return the same libinput_tool object. + * LIBINPUT_EVENT_TABLET_PROXIMITY_IN, this function returns NULL. By default, + * the lifetime of each tool will stay valid for as long as it is being used, + * and is destroyed when another tool comes into proximity. However, the + * lifetime of the tool may be extended by using libinput_tool_ref() to + * increment the reference count of the tool. This guarantees that whenever the + * tool comes back into proximity of the tablet, that the same structure will be + * used to represent the tool. * * @note It is an application bug to call this function for events other than - * @ref LIBINPUT_EVENT_TABLET_TOOL_UPDATE. + * @ref LIBINPUT_EVENT_TABLET_PROXIMITY_IN. * * @note On tablets where the serial number of tools is not reported, each tool * cannot be guaranteed to be unique. diff --git a/test/tablet.c b/test/tablet.c index 6fb4465..0f0728e 100644 --- a/test/tablet.c +++ b/test/tablet.c @@ -55,7 +55,7 @@ START_TEST(proximity_in_out) while ((event = libinput_get_event(li))) { if (libinput_event_get_type(event) == - LIBINPUT_EVENT_TABLET_TOOL_UPDATE) { + LIBINPUT_EVENT_TABLET_PROXIMITY_IN) { struct libinput_tool * tool; have_tool_update++; @@ -444,7 +444,7 @@ START_TEST(tool_serial) libinput_dispatch(li); while ((event = libinput_get_event(li))) { if (libinput_event_get_type(event) == - LIBINPUT_EVENT_TABLET_TOOL_UPDATE) { + LIBINPUT_EVENT_TABLET_PROXIMITY_IN) { tablet_event = libinput_event_get_tablet_event(event); tool = libinput_event_tablet_get_tool(tablet_event); @@ -460,36 +460,35 @@ START_TEST(serial_changes_tool) { struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; - struct libinput_event_tablet *tablet_event; struct libinput_event *event; + struct libinput_event_tablet *tablet_event; struct libinput_tool *tool; - bool tool_updated = false; litest_drain_events(li); litest_event(dev, EV_KEY, BTN_TOOL_PEN, 1); litest_event(dev, EV_MSC, MSC_SERIAL, 1000); litest_event(dev, EV_SYN, SYN_REPORT, 0); - + litest_event(dev, EV_KEY, BTN_TOOL_PEN, 0); + litest_event(dev, EV_SYN, SYN_REPORT, 0); litest_drain_events(li); + litest_event(dev, EV_KEY, BTN_TOOL_PEN, 1); litest_event(dev, EV_MSC, MSC_SERIAL, 2000); litest_event(dev, EV_SYN, SYN_REPORT, 0); libinput_dispatch(li); while ((event = libinput_get_event(li))) { if (libinput_event_get_type(event) == - LIBINPUT_EVENT_TABLET_TOOL_UPDATE) { + LIBINPUT_EVENT_TABLET_PROXIMITY_IN) { tablet_event = libinput_event_get_tablet_event(event); tool = libinput_event_tablet_get_tool(tablet_event); ck_assert_uint_eq(libinput_tool_get_serial(tool), 2000); - tool_updated = true; } libinput_event_destroy(event); } - ck_assert(tool_updated); } END_TEST @@ -498,42 +497,34 @@ START_TEST(invalid_serials) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; struct libinput_event *event; - bool tool_updated = false; + struct libinput_event_tablet *tablet_event; + struct libinput_tool *tool; litest_drain_events(li); litest_event(dev, EV_KEY, BTN_TOOL_PEN, 1); litest_event(dev, EV_MSC, MSC_SERIAL, 1000); litest_event(dev, EV_SYN, SYN_REPORT, 0); + litest_event(dev, EV_KEY, BTN_TOOL_PEN, 0); + litest_event(dev, EV_SYN, SYN_REPORT, 0); litest_drain_events(li); + litest_event(dev, EV_KEY, BTN_TOOL_PEN, 1); litest_event(dev, EV_MSC, MSC_SERIAL, -1); litest_event(dev, EV_SYN, SYN_REPORT, 0); libinput_dispatch(li); while ((event = libinput_get_event(li))) { if (libinput_event_get_type(event) == - LIBINPUT_EVENT_TABLET_TOOL_UPDATE) - tool_updated = true; - - libinput_event_destroy(event); - } - ck_assert(!tool_updated); - - /* Make sure libinput doesn't report a tool update when the serial - * number goes back from -1 to what it was previously */ - litest_event(dev, EV_MSC, MSC_SERIAL, 1000); - litest_event(dev, EV_SYN, SYN_REPORT, 0); + LIBINPUT_EVENT_TABLET_PROXIMITY_IN) { + tablet_event = libinput_event_get_tablet_event(event); + tool = libinput_event_tablet_get_tool(tablet_event); - libinput_dispatch(li); - while ((event = libinput_get_event(li))) { - if (libinput_event_get_type(event) == - LIBINPUT_EVENT_TABLET_TOOL_UPDATE) - tool_updated = true; + ck_assert_uint_eq(libinput_tool_get_serial(tool), 1000); + } libinput_event_destroy(event); } - ck_assert(!tool_updated); } END_TEST diff --git a/tools/event-debug.c b/tools/event-debug.c index 299587b..5c6a062 100644 --- a/tools/event-debug.c +++ b/tools/event-debug.c @@ -243,8 +243,8 @@ print_event_header(struct libinput_event *ev) case LIBINPUT_EVENT_TABLET_AXIS: type = "TABLET_AXIS"; break; - case LIBINPUT_EVENT_TABLET_TOOL_UPDATE: - type = "TABLET_TOOL_UPDATE"; + case LIBINPUT_EVENT_TABLET_PROXIMITY_IN: + type = "TABLET_PROXIMITY_IN"; break; case LIBINPUT_EVENT_TABLET_PROXIMITY_OUT: type = "TABLET_PROXIMITY_OUT"; @@ -424,7 +424,7 @@ print_touch_event_without_coords(struct libinput_event *ev) } static void -print_tool_update_event(struct libinput_event *ev) +print_proximity_in_event(struct libinput_event *ev) { struct libinput_event_tablet *t = libinput_event_get_tablet_event(ev); struct libinput_tool *tool = libinput_event_tablet_get_tool(t); @@ -543,8 +543,8 @@ handle_and_print_events(struct libinput *li) case LIBINPUT_EVENT_TABLET_AXIS: print_tablet_axis_event(ev); break; - case LIBINPUT_EVENT_TABLET_TOOL_UPDATE: - print_tool_update_event(ev); + case LIBINPUT_EVENT_TABLET_PROXIMITY_IN: + print_proximity_in_event(ev); break; case LIBINPUT_EVENT_TABLET_PROXIMITY_OUT: print_proximity_out_event(ev); diff --git a/tools/event-gui.c b/tools/event-gui.c index b184a42..7bc3828 100644 --- a/tools/event-gui.c +++ b/tools/event-gui.c @@ -376,7 +376,7 @@ handle_event_libinput(GIOChannel *source, GIOCondition condition, gpointer data) } break; case LIBINPUT_EVENT_TABLET_AXIS: - case LIBINPUT_EVENT_TABLET_TOOL_UPDATE: + case LIBINPUT_EVENT_TABLET_PROXIMITY_IN: case LIBINPUT_EVENT_TABLET_PROXIMITY_OUT: case LIBINPUT_EVENT_TABLET_BUTTON: break; -- 1.8.5.5 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
