diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2017-11-07 11:04:03 +0900 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2017-11-08 20:37:50 +0900 |
commit | 7a7abb043add0af083c46305824d8c341daf2374 (patch) | |
tree | e25ef8ac67091ebc612b831361ece2a0f7420963 | |
parent | 10b6eb627abe7f0419b1c76ff73faf90274e940b (diff) |
elput - re-enable switches (power buttons, lid etc.)
this is needed for devices that no longer produce aspi events for
these. otherwise good luck getting any event on lid open/close or on
pressing the power button. this also stops hiding switch events from
libinput and now you can get switch events to find lid or tablet mode
switching changes.
@fix
-rw-r--r-- | src/lib/elput/Elput.h | 27 | ||||
-rw-r--r-- | src/lib/elput/elput.c | 3 | ||||
-rw-r--r-- | src/lib/elput/elput_evdev.c | 37 |
3 files changed, 54 insertions, 13 deletions
diff --git a/src/lib/elput/Elput.h b/src/lib/elput/Elput.h index b05536130b..db62c52d10 100644 --- a/src/lib/elput/Elput.h +++ b/src/lib/elput/Elput.h @@ -38,6 +38,7 @@ typedef enum ELPUT_DEVICE_CAPS_TABLET_TOOL = (1 << 3), ELPUT_DEVICE_CAPS_TABLET_PAD = (1 << 4), ELPUT_DEVICE_CAPS_GESTURE = (1 << 5), + ELPUT_DEVICE_CAPS_SWITCH = (1 << 6), } Elput_Device_Caps; /* opaque structure to represent an input manager */ @@ -112,6 +113,29 @@ typedef struct Elput_Event_Pointer_Motion double dy_unaccel; } Elput_Event_Pointer_Motion; +/** @since 1.21 */ +typedef enum +{ + ELPUT_SWITCH_TYPE_LID = 1, + ELPUT_SWITCH_TYPE_TABLET_MODE, +} Elput_Switch_Type; + +/** @since 1.21 */ +typedef enum +{ + ELPUT_SWITCH_STATE_OFF = 0, + ELPUT_SWITCH_STATE_ON = 1, +} Elput_Switch_State; + +/** @since 1.21 */ +typedef struct _Elput_Event_Switch +{ + Elput_Device *device; + uint64_t time_usec; + Elput_Switch_Type type; + Elput_Switch_State state; +} Elput_Event_Switch; + EAPI extern int ELPUT_EVENT_SEAT_CAPS; EAPI extern int ELPUT_EVENT_SEAT_FRAME; @@ -122,6 +146,9 @@ EAPI extern int ELPUT_EVENT_SESSION_ACTIVE; /** @since 1.19 */ EAPI extern int ELPUT_EVENT_POINTER_MOTION; +/** @since 1.21 */ +EAPI extern int ELPUT_EVENT_SWITCH; + /** * @file * @brief Ecore functions for dealing with libinput diff --git a/src/lib/elput/elput.c b/src/lib/elput/elput.c index 9519129759..f3cda411ea 100644 --- a/src/lib/elput/elput.c +++ b/src/lib/elput/elput.c @@ -13,6 +13,7 @@ EAPI int ELPUT_EVENT_MODIFIERS_SEND = 0; EAPI int ELPUT_EVENT_DEVICE_CHANGE = 0; EAPI int ELPUT_EVENT_SESSION_ACTIVE = 0; EAPI int ELPUT_EVENT_POINTER_MOTION = 0; +EAPI int ELPUT_EVENT_SWITCH = 0; EAPI int elput_event_session_ready = 0; EAPI int @@ -41,6 +42,7 @@ elput_init(void) ELPUT_EVENT_DEVICE_CHANGE = ecore_event_type_new(); ELPUT_EVENT_SESSION_ACTIVE = ecore_event_type_new(); ELPUT_EVENT_POINTER_MOTION = ecore_event_type_new(); + ELPUT_EVENT_SWITCH = ecore_event_type_new(); elput_event_session_ready = ecore_event_type_new(); } @@ -71,6 +73,7 @@ elput_shutdown(void) ELPUT_EVENT_DEVICE_CHANGE, ELPUT_EVENT_SESSION_ACTIVE, ELPUT_EVENT_POINTER_MOTION, + ELPUT_EVENT_SWITCH, elput_event_session_ready); eina_log_domain_unregister(_elput_log_dom); diff --git a/src/lib/elput/elput_evdev.c b/src/lib/elput/elput_evdev.c index 09d75932f8..afa42df68c 100644 --- a/src/lib/elput/elput_evdev.c +++ b/src/lib/elput/elput_evdev.c @@ -1595,6 +1595,20 @@ _tablet_tool_tip(struct libinput_device *idev, struct libinput_event_tablet_tool _pointer_button_send(dev, press[state]); } +static void +_switch_toggle(struct libinput_device *idev, struct libinput_event_switch *event) +{ + Elput_Event_Switch *ev; + + ev = calloc(1, sizeof(Elput_Event_Switch)); + if (!ev) return; + ev->device = libinput_device_get_user_data(idev); + ev->time_usec = libinput_event_switch_get_time_usec(event); + ev->type = (Elput_Switch_Type)libinput_event_switch_get_switch(event); + ev->state = (Elput_Switch_State)libinput_event_switch_get_switch_state(event); + ecore_event_add(ELPUT_EVENT_SWITCH, ev, NULL, NULL); +} + int _evdev_event_process(struct libinput_event *event) { @@ -1642,6 +1656,9 @@ _evdev_event_process(struct libinput_event *event) case LIBINPUT_EVENT_TABLET_TOOL_TIP: /* is this useful? */ _tablet_tool_tip(idev, libinput_event_get_tablet_tool_event(event)); break; + case LIBINPUT_EVENT_SWITCH_TOGGLE: + _switch_toggle(idev, libinput_event_get_switch_event(event)); + break; default: ret = 0; break; @@ -1670,7 +1687,6 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device) edev->refs = 1; edev->seat = seat; edev->device = device; - edev->caps = 0; edev->ow = seat->manager->output_w; edev->oh = seat->manager->output_h; @@ -1679,13 +1695,14 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device) oname = libinput_device_get_name(device); eina_stringshare_replace(&edev->output_name, oname); + if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_SWITCH)) + edev->caps |= ELPUT_DEVICE_CAPS_SWITCH; if ((libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)) && (libinput_device_keyboard_has_key(device, KEY_ENTER))) - { - _keyboard_init(seat, seat->manager->cached.keymap); - edev->caps |= ELPUT_DEVICE_CAPS_KEYBOARD; - } - + edev->caps |= ELPUT_DEVICE_CAPS_KEYBOARD; + if (edev->caps & (ELPUT_DEVICE_CAPS_SWITCH | ELPUT_DEVICE_CAPS_KEYBOARD)) + _keyboard_init(seat, seat->manager->cached.keymap); + if ((libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER) && (libinput_device_pointer_has_button(device, BTN_LEFT)))) edev->caps |= ELPUT_DEVICE_CAPS_POINTER; @@ -1694,10 +1711,7 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device) if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TABLET_PAD)) edev->caps |= ELPUT_DEVICE_CAPS_TABLET_PAD; if (edev->caps & ELPUT_DEVICE_CAPS_POINTER) - { - _pointer_init(seat); - edev->caps |= ELPUT_DEVICE_CAPS_POINTER; - } + _pointer_init(seat); if (libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) edev->caps |= ELPUT_DEVICE_CAPS_TOUCH; @@ -1706,8 +1720,6 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device) if (edev->caps & ELPUT_DEVICE_CAPS_TOUCH) _touch_init(seat); - if (!edev->caps) goto err; - libinput_device_set_user_data(device, edev); libinput_device_ref(edev->device); @@ -1721,7 +1733,6 @@ _evdev_device_create(Elput_Seat *seat, struct libinput_device *device) return edev; -err: eina_stringshare_del(edev->output_name); free(edev); return NULL; |