ecore_wl2: generate Ecore_Device_Add/Del events 39/168239/7
authorJengHyun Kang <jhyuni.kang@samsung.com>
Thu, 25 Jan 2018 06:41:31 +0000 (15:41 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Tue, 30 Jan 2018 05:09:42 +0000 (05:09 +0000)
Change-Id: I2cd40d865276e8a12891a5419211c7fdc965e952

src/lib/ecore_wl2/Ecore_Wl2.h
src/lib/ecore_wl2/ecore_wl2.c
src/lib/ecore_wl2/ecore_wl2_input.c
src/lib/ecore_wl2/ecore_wl2_private.h
src/lib/ecore_wl2/ecore_wl2_window.c
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c

index 6ff7875..3065c1b 100644 (file)
@@ -550,26 +550,6 @@ typedef struct _Ecore_Wl2_Window_Keygrab_Info
 } Ecore_Wl2_Window_Keygrab_Info;
 //
 
-// TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
-typedef struct _Ecore_Wl2_Event_Tizen_Device_Info
-{
-   Ecore_Wl2_Display *display;
-   const char *name;
-   const char *identifier;
-   const char *seatname;
-   Efl_Input_Device_Type clas;
-   Efl_Input_Device_Subtype subclas;
-} Ecore_Wl2_Event_Tizen_Device_Info;
-
-typedef struct _Ecore_Wl2_Event_Tizen_Input_Device_Info
-{
-   Eo *dev;
-   const char *name;
-   const char *identifier;
-   int window_id;
-} Ecore_Wl2_Event_Tizen_Input_Device_Info;
-//
-
 typedef void (*Ecore_Wl2_Bind_Cb)(struct wl_client *client, void *data, uint32_t version, uint32_t id);
 typedef void (*Ecore_Wl2_Unbind_Cb)(struct wl_resource *resource);
 typedef void (*Ecore_Wl2_Frame_Cb)(Ecore_Wl2_Window *win, uint32_t timestamp, void *data);
@@ -631,12 +611,6 @@ EAPI extern int ECORE_WL2_EVENT_IGNORE_OUTPUT_TRANSFORM;
 EAPI extern int ECORE_WL2_EVENT_INDICATOR_FLICK;
 EAPI extern int ECORE_WL2_EVENT_CLIPBOARD_DATA_SELECTED;
 //
-// TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
-EAPI extern int ECORE_WL2_EVENT_TIZEN_DEVICE_ADD;
-EAPI extern int ECORE_WL2_EVENT_TIZEN_DEVICE_DEL;
-EAPI extern int ECORE_WL2_EVENT_TIZEN_INPUT_DEVICE_ADDED;
-EAPI extern int ECORE_WL2_EVENT_TIZEN_INPUT_DEVICE_REMOVED;
-//
 
 /**
  * @file
index b623ff2..c3e3d69 100644 (file)
@@ -68,12 +68,6 @@ EAPI int ECORE_WL2_EVENT_IGNORE_OUTPUT_TRANSFORM = 0;
 EAPI int ECORE_WL2_EVENT_INDICATOR_FLICK = 0;
 EAPI int ECORE_WL2_EVENT_CLIPBOARD_DATA_SELECTED = 0;
 //
-// TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
-EAPI int ECORE_WL2_EVENT_TIZEN_DEVICE_ADD = 0;
-EAPI int ECORE_WL2_EVENT_TIZEN_DEVICE_DEL = 0;
-EAPI int ECORE_WL2_EVENT_TIZEN_INPUT_DEVICE_ADDED = 0;
-EAPI int ECORE_WL2_EVENT_TIZEN_INPUT_DEVICE_REMOVED = 0;
-//
 
 EAPI int _ecore_wl2_event_window_www = -1;
 EAPI int _ecore_wl2_event_window_www_drag = -1;
@@ -172,12 +166,6 @@ ecore_wl2_init(void)
         ECORE_WL2_EVENT_INDICATOR_FLICK = ecore_event_type_new();
         ECORE_WL2_EVENT_CLIPBOARD_DATA_SELECTED = ecore_event_type_new();
         //
-        // TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
-        ECORE_WL2_EVENT_TIZEN_DEVICE_ADD = ecore_event_type_new();
-        ECORE_WL2_EVENT_TIZEN_DEVICE_DEL = ecore_event_type_new();
-        ECORE_WL2_EVENT_TIZEN_INPUT_DEVICE_ADDED = ecore_event_type_new();
-        ECORE_WL2_EVENT_TIZEN_INPUT_DEVICE_REMOVED = ecore_event_type_new();
-        //
      }
    if (!no_session_recovery)
      no_session_recovery = !!getenv("EFL_NO_WAYLAND_SESSION_RECOVERY");
@@ -269,13 +257,7 @@ ecore_wl2_shutdown(void)
                           ECORE_WL2_EVENT_IGNORE_OUTPUT_TRANSFORM,
                           ECORE_WL2_EVENT_INDICATOR_FLICK,
                           ECORE_WL2_EVENT_CLIPBOARD_DATA_SELECTED,
-                          ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE,
-                          // TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
-                          ECORE_WL2_EVENT_TIZEN_DEVICE_ADD,
-                          ECORE_WL2_EVENT_TIZEN_DEVICE_DEL,
-                          ECORE_WL2_EVENT_TIZEN_INPUT_DEVICE_ADDED,
-                          ECORE_WL2_EVENT_TIZEN_INPUT_DEVICE_REMOVED);
-                          //
+                          ECORE_WL2_EVENT_WINDOW_ICONIFY_STATE_CHANGE);
 
    /* shutdown Ecore_Event */
    ecore_event_shutdown();
index 9371c69..2847723 100644 (file)
@@ -3028,7 +3028,7 @@ err:
 static void
 _ecore_wl2_input_device_info_free(void *data EINA_UNUSED, void *ev)
 {
-   Ecore_Wl2_Event_Tizen_Device_Info *e;
+   Ecore_Event_Device_Info *e;
 
    e = ev;
    eina_stringshare_del(e->name);
@@ -3039,13 +3039,13 @@ _ecore_wl2_input_device_info_free(void *data EINA_UNUSED, void *ev)
 }
 
 void
-_ecore_wl2_input_device_info_send(Ecore_Wl2_Display *dpy, const char *name,  const char *identifier, Ecore_Device_Class clas, Ecore_Device_Subclass subclas, Eina_Bool flag)
+_ecore_wl2_input_device_info_send(Ecore_Window win_id, const char *name,  const char *identifier, Ecore_Device_Class clas, Ecore_Device_Subclass subclas, Eina_Bool flag)
 {
-   Ecore_Wl2_Event_Tizen_Device_Info *e;
+   Ecore_Event_Device_Info *e;
 
-   if (!(e = calloc(1, sizeof(Ecore_Wl2_Event_Tizen_Device_Info)))) return;
+   if (!(e = calloc(1, sizeof(Ecore_Event_Device_Info)))) return;
 
-   e->display = dpy;
+   e->window = win_id;
    e->name = eina_stringshare_add(name);
    e->identifier = eina_stringshare_add(identifier);
    e->seatname = eina_stringshare_add(name);
@@ -3053,33 +3053,33 @@ _ecore_wl2_input_device_info_send(Ecore_Wl2_Display *dpy, const char *name,  con
    e->subclas = subclas;
 
    if (flag)
-     ecore_event_add(ECORE_WL2_EVENT_TIZEN_DEVICE_ADD, e, _ecore_wl2_input_device_info_free, NULL);
+     ecore_event_add(ECORE_EVENT_DEVICE_ADD, e, _ecore_wl2_input_device_info_free, NULL);
    else
-     ecore_event_add(ECORE_WL2_EVENT_TIZEN_DEVICE_DEL, e, _ecore_wl2_input_device_info_free, NULL);
+     ecore_event_add(ECORE_EVENT_DEVICE_DEL, e, _ecore_wl2_input_device_info_free, NULL);
 }
 
-static void
+static Eina_Bool
 _ecore_wl2_input_device_ecore_device_add(Ecore_Wl2_Tizen_Input_Device *dev)
 {
    Ecore_Device *ecdev;
    Eina_List *l;
    const char *ecdev_name;
 
-   if (!dev->identifier) return;
+   if (!dev->identifier) return EINA_FALSE;
 
    EINA_LIST_FOREACH((Eina_List *)ecore_device_list(), l, ecdev)
      {
         ecdev_name = ecore_device_identifier_get(ecdev);
         if (!ecdev_name) continue;
         if ((ecore_device_class_get(ecdev) == dev->clas) && (!strcmp(ecdev_name, dev->identifier)))
-          return;
+          return EINA_FALSE;
      }
 
    ecdev = ecore_device_add();
    if (!ecdev)
      {
         ERR("Failed to add ecore device for name: %s (%s)\n", dev->name, dev->identifier);
-        return;
+        return EINA_FALSE;
      }
    ecore_device_name_set(ecdev, dev->name);
    ecore_device_identifier_set(ecdev, dev->identifier);
@@ -3087,16 +3087,18 @@ _ecore_wl2_input_device_ecore_device_add(Ecore_Wl2_Tizen_Input_Device *dev)
    ecore_device_subclass_set(ecdev, dev->subclas);
 
    dev->device = efl_ref(ecdev);
+
+   return EINA_TRUE;
 }
 
-static void
+static Eina_Bool
 _ecore_wl2_input_device_ecore_device_remove(Ecore_Wl2_Tizen_Input_Device *dev)
 {
    Ecore_Device *ecdev;
    const Eina_List *l;
    const char *ecdev_name;
 
-   if (!dev->identifier) return;
+   if (!dev->identifier) return EINA_FALSE;
 
    EINA_LIST_FOREACH(ecore_device_list(), l, ecdev)
      {
@@ -3107,26 +3109,67 @@ _ecore_wl2_input_device_ecore_device_remove(Ecore_Wl2_Tizen_Input_Device *dev)
            {
               ecore_device_del(ecdev);
               dev->device = NULL;
-              return;
+              return EINA_TRUE;
            }
       }
+
+    return EINA_FALSE;
 }
 
 static void
 _ecore_wl2_input_device_info_broadcast(Ecore_Wl2_Tizen_Input_Device *dev, Eina_Bool flag)
 {
+   Eina_Hash *windows = NULL;
+   Eina_Iterator *itr;
+   Ecore_Wl2_Window *win = NULL;
+   void *data;
+   Eina_Bool res, has_win = EINA_FALSE;
+
    if (!dev) return;
    if (!dev->name) return;
    if (!dev->input || !dev->input->display) return;
 
-   _ecore_wl2_input_device_info_send(dev->input->display, dev->name, dev->identifier, dev->clas, dev->subclas, flag);
-
    if (flag)
-     _ecore_wl2_input_device_ecore_device_add(dev);
+     res = _ecore_wl2_input_device_ecore_device_add(dev);
    else
-     _ecore_wl2_input_device_ecore_device_remove(dev);
+     res = _ecore_wl2_input_device_ecore_device_remove(dev);
+
+   if (!res) return;
+
+   windows = _ecore_wl2_window_hash_get();
+   if (windows)
+     {
+        itr = eina_hash_iterator_data_new(windows);
+        while (eina_iterator_next(itr, &data))
+          {
+             win = data;
+             has_win = EINA_TRUE;
+             _ecore_wl2_input_device_info_send(win->id, dev->name, dev->identifier, dev->clas, dev->subclas, flag);
+          }
+
+        eina_iterator_free(itr);
+     }
+   if (!has_win)
+     {
+        _ecore_wl2_input_device_info_send((uintptr_t)NULL, dev->name, dev->identifier, dev->clas, dev->subclas, flag);
+     }
 }
 
+void
+_ecore_wl2_input_devices_send(Ecore_Wl2_Input *input, Ecore_Wl2_Window *win)
+{
+   Eina_List *l;
+   Ecore_Wl2_Tizen_Input_Device *dev;
+
+   if (!input) return;
+
+   EINA_LIST_FOREACH(input->devmgr.devices, l, dev)
+     {
+        _ecore_wl2_input_device_info_send(win->id, dev->name, dev->identifier, dev->clas, dev->subclas, EINA_TRUE);
+     }
+}
+
+
 static void
 _ecore_wl2_input_device_cb_device_info(void *data, struct tizen_input_device *tizen_input_device EINA_UNUSED, const char *name, uint32_t clas, uint32_t subclas, struct wl_array *axes EINA_UNUSED)
 {
index 1d5e0c4..11d8af6 100755 (executable)
@@ -803,6 +803,7 @@ Eina_Hash *_ecore_wl2_keygrab_hash_get(void);
 // TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
 void _ecore_wl2_input_device_manager_setup(Ecore_Wl2_Display *ewd, unsigned int id, unsigned int version);
 //
+void _ecore_wl2_input_devices_send(Ecore_Wl2_Input *input, Ecore_Wl2_Window *win);
 
 //TIZEN_ONLY(20171115): support output transform
 void _ecore_wl2_window_ignore_output_transform_set(Ecore_Wl2_Window *window, Eina_Bool ignore);
@@ -812,6 +813,7 @@ void _ecore_wl2_window_ignore_output_transform_set(Ecore_Wl2_Window *window, Ein
 void _ecore_wl2_window_init(void);
 void _ecore_wl2_window_shutdown(void);
 //
+Eina_Hash *_ecore_wl2_window_hash_get(void);
 
 EAPI extern int _ecore_wl2_event_window_www;
 EAPI extern int _ecore_wl2_event_window_www_drag;
index 5e7cd45..2b79290 100644 (file)
@@ -24,6 +24,12 @@ _ecore_wl2_window_shutdown(void)
    _windows = NULL;
 }
 
+Eina_Hash *
+_ecore_wl2_window_hash_get(void)
+{
+   return _windows;
+}
+
 static char *
 _ecore_wl2_window_id_str_get(int win_id)
 {
@@ -980,6 +986,8 @@ ecore_wl2_window_new(Ecore_Wl2_Display *display, Ecore_Wl2_Window *parent, int x
    eina_hash_add(_windows, _ecore_wl2_window_id_str_get(win->id), win);
 //
 
+   _ecore_wl2_input_devices_send(ecore_wl2_input_default_input_get(display), win);
+
    return win;
 }
 
index 497ce9b..9de7c25 100644 (file)
@@ -1537,11 +1537,15 @@ _ecore_evas_wl_common_default_seat_get(Evas *evas)
 static Eina_Bool
 _ecore_evas_wl_common_cb_tizen_device_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
-   Ecore_Wl2_Event_Tizen_Device_Info *ev;
+   Ecore_Event_Device_Info *ev;
+   Ecore_Wl2_Window *win = NULL;
+   Ecore_Wl2_Display *display = NULL;
    Ecore_Evas *ee;
    Eina_List *l;
 
    ev = event;
+   if (ev->window) win = ecore_wl2_window_find(ev->window);
+   if (win) display = ecore_wl2_window_display_get(win);
 
    EINA_LIST_FOREACH(ee_list, l, ee)
      {
@@ -1549,7 +1553,7 @@ _ecore_evas_wl_common_cb_tizen_device_add(void *data EINA_UNUSED, int type EINA_
         Evas_Device *device, *seat;
 
         wdata = ee->engine.data;
-        if (ev->display != wdata->display) continue;
+        if (display != wdata->display) continue;
 
         if (_ecore_evas_wl_common_evas_device_find(ee->evas, ev->identifier)) continue;
         seat = _ecore_evas_wl_common_default_seat_get(ee->evas);
@@ -1567,11 +1571,15 @@ _ecore_evas_wl_common_cb_tizen_device_add(void *data EINA_UNUSED, int type EINA_
 static Eina_Bool
 _ecore_evas_wl_common_cb_tizen_device_del(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
-   Ecore_Wl2_Event_Tizen_Device_Info *ev;
+   Ecore_Event_Device_Info *ev;
+   Ecore_Wl2_Window *win = NULL;
+   Ecore_Wl2_Display *display = NULL;
    Ecore_Evas *ee;
    Eina_List *list, *l, *ll, *ll_next;
 
    ev = event;
+   if (ev->window) win = ecore_wl2_window_find(ev->window);
+   if (win) display = ecore_wl2_window_display_get(win);
 
    EINA_LIST_FOREACH(ee_list, l, ee)
      {
@@ -1579,7 +1587,7 @@ _ecore_evas_wl_common_cb_tizen_device_del(void *data EINA_UNUSED, int type EINA_
         Evas_Device *device;
 
         wdata = ee->engine.data;
-        if (ev->display != wdata->display) continue;
+        if (display != wdata->display) continue;
 
         list = (Eina_List *)evas_device_list(ee->evas, NULL);
         EINA_LIST_FOREACH_SAFE(list, ll, ll_next, device)
@@ -1709,11 +1717,11 @@ _ecore_evas_wl_common_init(void)
    //
    // TIZEN_ONLY(20171109): support a tizen_input_device_manager interface
    h =
-     ecore_event_handler_add(ECORE_WL2_EVENT_TIZEN_DEVICE_ADD,
+     ecore_event_handler_add(ECORE_EVENT_DEVICE_ADD,
                              _ecore_evas_wl_common_cb_tizen_device_add, NULL);
    eina_array_push(_ecore_evas_wl_event_hdls, h);
    h =
-     ecore_event_handler_add(ECORE_WL2_EVENT_TIZEN_DEVICE_DEL,
+     ecore_event_handler_add(ECORE_EVENT_DEVICE_DEL,
                              _ecore_evas_wl_common_cb_tizen_device_del, NULL);
    eina_array_push(_ecore_evas_wl_event_hdls, h);
    //