raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=7a7abb043add0af083c46305824d8c341daf2374

commit 7a7abb043add0af083c46305824d8c341daf2374
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Tue Nov 7 11:04:03 2017 +0900

    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
---
 src/lib/elput/Elput.h       | 27 +++++++++++++++++++++++++++
 src/lib/elput/elput.c       |  3 +++
 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;

-- 


Reply via email to