ecore-drm: add support for libinput device added and deleted events 84/39884/1 accepted/tizen/common/20150526.081153 accepted/tizen/mobile/20150526.094841 accepted/tizen/tv/20150526.094320 accepted/tizen/wearable/20150526.094623 submit/tizen/20150526.041002
authorGwanglim Lee <gl77.lee@samsung.com>
Tue, 26 May 2015 04:06:28 +0000 (13:06 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 26 May 2015 04:06:28 +0000 (13:06 +0900)
Change-Id: I38fb9483ed1a30de630dc44bdb8164db896dec80

src/lib/ecore_drm/Ecore_Drm.h
src/lib/ecore_drm/ecore_drm.c
src/lib/ecore_drm/ecore_drm_evdev.c
src/lib/ecore_drm/ecore_drm_inputs.c

index 1df5d09..0076dd1 100644 (file)
@@ -148,6 +148,22 @@ struct _Ecore_Drm_Event_Output
    Eina_Bool plug : 1;
 };
 
+struct _Ecore_Drm_Event_Input_Device_Add
+{
+   const char *name; /* descriptive device name */
+   const char *sysname; /* system name of the input device */
+   const char *seatname; /* logical name of the seat */
+   Ecore_Drm_Seat_Capabilities caps; /* capabilities on a device */
+};
+
+struct _Ecore_Drm_Event_Input_Device_Del
+{
+   const char *name; /* descriptive device name */
+   const char *sysname; /* system name of the input device */
+   const char *seatname; /* logical name of the seat */
+   Ecore_Drm_Seat_Capabilities caps; /* capabilities on a device */
+};
+
 /* opaque structure to represent a drm device */
 typedef struct _Ecore_Drm_Device Ecore_Drm_Device;
 
@@ -178,6 +194,12 @@ typedef struct _Ecore_Drm_Event_Page_Flip Ecore_Drm_Event_Page_Flip;
 /* sturcture to inform drm vblank */
 typedef struct _Ecore_Drm_Event_Vblank Ecore_Drm_Event_Vblank;
 
+/* sturcture to inform new input device added */
+typedef struct _Ecore_Drm_Event_Input_Device_Add Ecore_Drm_Event_Input_Device_Add;
+
+/* sturcture to inform old input device deleted */
+typedef struct _Ecore_Drm_Event_Input_Device_Del Ecore_Drm_Event_Input_Device_Del;
+
 /* structure to inform drm output plug events */
 /** @since 1.14 */
 typedef struct _Ecore_Drm_Event_Output Ecore_Drm_Event_Output;
@@ -185,6 +207,8 @@ typedef struct _Ecore_Drm_Event_Output Ecore_Drm_Event_Output;
 EAPI extern int ECORE_DRM_EVENT_ACTIVATE;
 EAPI extern int ECORE_DRM_EVENT_PAGE_FLIP;
 EAPI extern int ECORE_DRM_EVENT_VBLANK;
+EAPI extern int ECORE_DRM_EVENT_INPUT_DEVICE_ADD;
+EAPI extern int ECORE_DRM_EVENT_INPUT_DEVICE_DEL;
 
 EAPI extern int ECORE_DRM_EVENT_OUTPUT; /**< @since 1.14 */
 
@@ -352,4 +376,11 @@ EAPI Eina_Stringshare *ecore_drm_output_model_get(Ecore_Drm_Output *output);
  */
 EAPI Eina_Stringshare *ecore_drm_output_make_get(Ecore_Drm_Output *output);
 
+/**
+ * @since tizen 3.0
+ */
+EAPI Eina_List *ecore_drm_seat_evdev_list_get(Ecore_Drm_Seat *seat);
+EAPI const char *ecore_drm_evdev_name_get(Ecore_Drm_Evdev *evdev);
+EAPI const char *ecore_drm_evdev_sysname_get(Ecore_Drm_Evdev *evdev);
+
 #endif
index 28b872c..8fd62a6 100644 (file)
@@ -14,6 +14,8 @@ int _ecore_drm_log_dom = -1;
 EAPI int ECORE_DRM_EVENT_ACTIVATE = 0;
 EAPI int ECORE_DRM_EVENT_PAGE_FLIP = 0;
 EAPI int ECORE_DRM_EVENT_VBLANK = 0;
+EAPI int ECORE_DRM_EVENT_INPUT_DEVICE_ADD = 0;
+EAPI int ECORE_DRM_EVENT_INPUT_DEVICE_DEL = 0;
 
 static void
 _ecore_drm_event_activate_free(void *data EINA_UNUSED, void *event)
@@ -94,6 +96,8 @@ ecore_drm_init(void)
    ECORE_DRM_EVENT_PAGE_FLIP = ecore_event_type_new();
    ECORE_DRM_EVENT_VBLANK = ecore_event_type_new();
    ECORE_DRM_EVENT_OUTPUT = ecore_event_type_new();
+   ECORE_DRM_EVENT_INPUT_DEVICE_ADD = ecore_event_type_new();
+   ECORE_DRM_EVENT_INPUT_DEVICE_DEL = ecore_event_type_new();
 
    /* return init count */
    return _ecore_drm_init_count;
index 5e6dd82..c7f9f1b 100644 (file)
@@ -868,3 +868,21 @@ cont:
         continue;
      }
 }
+
+EAPI const char *
+ecore_drm_evdev_name_get(Ecore_Drm_Evdev *evdev)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(evdev, NULL);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(evdev->device, NULL);
+
+   return libinput_device_get_name(evdev->device);
+}
+
+EAPI const char *
+ecore_drm_evdev_sysname_get(Ecore_Drm_Evdev *evdev)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(evdev, NULL);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(evdev->device, NULL);
+
+   return libinput_device_get_sysname(evdev->device);
+}
index 4af1886..ab196c6 100644 (file)
@@ -81,6 +81,32 @@ _seat_get(Ecore_Drm_Input *input, const char *seat)
    return s;
 }
 
+static void
+_ecore_drm_event_input_device_add_free(void *data EINA_UNUSED, void *ev)
+{
+   Ecore_Drm_Event_Input_Device_Add *e;
+
+   e = ev;
+   eina_stringshare_del(e->name);
+   eina_stringshare_del(e->sysname);
+   eina_stringshare_del(e->seatname);
+
+   free(e);
+}
+
+static void
+_ecore_drm_event_input_device_del_free(void *data EINA_UNUSED, void *ev)
+{
+   Ecore_Drm_Event_Input_Device_Del *e;
+
+   e = ev;
+   eina_stringshare_del(e->name);
+   eina_stringshare_del(e->sysname);
+   eina_stringshare_del(e->seatname);
+
+   free(e);
+}
+
 static void 
 _device_added(Ecore_Drm_Input *input, struct libinput_device *device)
 {
@@ -88,6 +114,7 @@ _device_added(Ecore_Drm_Input *input, struct libinput_device *device)
    const char *seat_name;
    Ecore_Drm_Seat *seat;
    Ecore_Drm_Evdev *edev;
+   Ecore_Drm_Event_Input_Device_Add *ev;
 
    libinput_seat = libinput_device_get_seat(device);
    seat_name = libinput_seat_get_logical_name(libinput_seat);
@@ -108,17 +135,44 @@ _device_added(Ecore_Drm_Input *input, struct libinput_device *device)
 
    /* append this device to the seat */
    seat->devices = eina_list_append(seat->devices, edev);
+
+   ev = calloc(1, sizeof(Ecore_Drm_Event_Input_Device_Add));
+   if (!ev) return;
+
+   ev->name = eina_stringshare_add(libinput_device_get_name(device));
+   ev->sysname = eina_stringshare_add(edev->path);
+   ev->seatname = eina_stringshare_add(edev->seat->name);
+   ev->caps = edev->seat_caps;
+
+   ecore_event_add(ECORE_DRM_EVENT_INPUT_DEVICE_ADD,
+                   ev,
+                   _ecore_drm_event_input_device_add_free,
+                   NULL);
 }
 
 static void 
-_device_removed(Ecore_Drm_Input *input EINA_UNUSED, struct libinput_device *device)
+_device_removed(Ecore_Drm_Input *input, struct libinput_device *device)
 {
    Ecore_Drm_Evdev *edev;
+   Ecore_Drm_Event_Input_Device_Del *ev;
 
    /* try to get the evdev structure */
    if (!(edev = libinput_device_get_user_data(device)))
      return;
 
+   ev = calloc(1, sizeof(Ecore_Drm_Event_Input_Device_Del));
+   if (!ev) return;
+
+   ev->name = eina_stringshare_add(libinput_device_get_name(device));
+   ev->sysname = eina_stringshare_add(edev->path);
+   ev->seatname = eina_stringshare_add(edev->seat->name);
+   ev->caps = edev->seat_caps;
+
+   ecore_event_add(ECORE_DRM_EVENT_INPUT_DEVICE_DEL,
+                   ev,
+                   _ecore_drm_event_input_device_del_free,
+                   NULL);
+
    /* remove this evdev from the seat's list of devices */
    edev->seat->devices = eina_list_remove(edev->seat->devices, edev);
 
@@ -349,3 +403,10 @@ ecore_drm_inputs_disable(Ecore_Drm_Input *input)
 
    input->suspended = EINA_TRUE;
 }
+
+EAPI Eina_List *
+ecore_drm_seat_evdev_list_get(Ecore_Drm_Seat *seat)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(seat, NULL);
+   return seat->devices;
+}