+static Eina_Bool
+_efl_util_input_check_wait_device_full(void)
+{
+ Eina_List *l, *ll, *l_next;
+ Efl_Util_Device_Info *dev, *wait_dev;
+ int wait_cnt = 0;
+
+ wait_cnt = eina_list_count(_eflutil.wl.devmgr.wait_devices);
+ if (wait_cnt <= 0) return EINA_TRUE;
+
+ EINA_LIST_FOREACH(_eflutil.wl.devmgr.devices, l, dev)
+ {
+ EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.wait_devices, ll, l_next, wait_dev)
+ {
+ if ((dev->clas == wait_dev->clas) &&
+ (!strncmp(dev->name, wait_dev->name, eina_stringshare_strlen(wait_dev->name))))
+ {
+ eina_stringshare_del(wait_dev->name);
+ _eflutil.wl.devmgr.wait_devices = eina_list_remove_list(_eflutil.wl.devmgr.wait_devices, ll);
+ free(wait_dev);
+
+ wait_cnt--;
+ if (wait_cnt <= 0) return EINA_TRUE;
+
+ break;
+ }
+ }
+ }
+
+ return EINA_FALSE;
+}
+
+static Eina_Bool
+_efl_util_input_check_wait_device(const char *name, unsigned int type)
+{
+ Eina_List *l, *l_next;
+ Efl_Util_Device_Info *wait_dev;
+ int wait_cnt = 0;
+
+ wait_cnt = eina_list_count(_eflutil.wl.devmgr.wait_devices);
+ if (wait_cnt <= 0) return EINA_TRUE;
+
+ EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.wait_devices, l, l_next, wait_dev)
+ {
+ if ((type == wait_dev->clas) &&
+ (!strncmp(name, wait_dev->name, eina_stringshare_strlen(wait_dev->name))))
+ {
+ eina_stringshare_del(wait_dev->name);
+ _eflutil.wl.devmgr.wait_devices = eina_list_remove_list(_eflutil.wl.devmgr.wait_devices, l);
+ free(wait_dev);
+
+ wait_cnt--;
+ if (wait_cnt <= 0) return EINA_TRUE;
+
+ break;
+ }
+ }
+
+ return EINA_FALSE;
+}
+
+static void
+_cb_device_info(void *data, struct tizen_input_device *tizen_input_device EINA_UNUSED, const char *name, uint32_t clas, uint32_t subclas EINA_UNUSED, struct wl_array *axes EINA_UNUSED)
+{
+ Efl_Util_Device_Info *dev;
+
+ if (!(dev = data)) return;
+ dev->clas = (Ecore_Device_Class)clas;
+ dev->name = eina_stringshare_add(name);
+
+ if (_eflutil.wl.devmgr.wait_timer &&
+ _efl_util_input_check_wait_device(name, clas))
+ {
+ wl_event_source_remove(_eflutil.wl.devmgr.wait_timer);
+ _eflutil.wl.devmgr.wait_timer = NULL;
+ }
+}
+
+/* LCOV_EXCL_START */
+static void
+_cb_event_device(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, unsigned int serial EINA_UNUSED, const char *name EINA_UNUSED, uint32_t time EINA_UNUSED)
+{
+ ;
+}
+
+static void
+_cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type EINA_UNUSED, wl_fixed_t value EINA_UNUSED)
+{
+ ;
+}
+/* LCOV_EXCL_STOP */
+
+static void
+_cb_device_add(void *data EINA_UNUSED,
+ struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
+ uint32_t serial EINA_UNUSED,
+ const char *identifier EINA_UNUSED,
+ struct tizen_input_device *device,
+ struct wl_seat *seat EINA_UNUSED)
+{
+ Efl_Util_Device_Info *dev;
+
+ EINA_SAFETY_ON_NULL_RETURN(device);
+
+ dev = (Efl_Util_Device_Info *)calloc(1, sizeof(Efl_Util_Device_Info));
+ EINA_SAFETY_ON_NULL_RETURN(dev);
+
+ dev->device = device;
+ tizen_input_device_add_listener(device, &_wl_tz_input_device_listener, dev);
+
+ _eflutil.wl.devmgr.devices = eina_list_append(_eflutil.wl.devmgr.devices, dev);
+}
+
+static void
+_cb_device_remove(void *data EINA_UNUSED,
+ struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
+ uint32_t serial EINA_UNUSED,
+ const char *identifier EINA_UNUSED,
+ struct tizen_input_device *device,
+ struct wl_seat *seat EINA_UNUSED)
+{
+ Eina_List *l, *l_next;
+ Efl_Util_Device_Info *dev;
+
+ EINA_LIST_FOREACH_SAFE(_eflutil.wl.devmgr.devices, l, l_next, dev)
+ {
+ if (dev->device == device)
+ {
+ if (dev->name) eina_stringshare_del(dev->name);
+ tizen_input_device_release(dev->device);
+
+ _eflutil.wl.devmgr.devices = eina_list_remove_list(_eflutil.wl.devmgr.devices, l);
+ free(dev);
+
+ break;
+ }
+ }
+}
+
+static void
+_cb_error(void *data EINA_UNUSED,
+ struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED,
+ uint32_t errorcode)
+{
+ _eflutil.wl.devmgr.request_notified = errorcode;
+}
+
+/* LCOV_EXCL_START */
+static void
+_cb_block_expired(void *data EINA_UNUSED,
+ struct tizen_input_device_manager *tizen_input_device_manager EINA_UNUSED)
+{
+ ;
+}
+/* LCOV_EXCL_STOP */
+
+static efl_util_error_e
+_efl_util_input_convert_input_generator_error(int ret)
+{
+ switch (ret)
+ {
+ case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE:
+ return EFL_UTIL_ERROR_NONE;
+ case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION:
+ return EFL_UTIL_ERROR_PERMISSION_DENIED;
+ case TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES:
+ return EFL_UTIL_ERROR_OUT_OF_MEMORY;
+ case TIZEN_INPUT_DEVICE_MANAGER_ERROR_INVALID_PARAMETER:
+ return EFL_UTIL_ERROR_INVALID_PARAMETER;
+ default :
+ return EFL_UTIL_ERROR_NONE;
+ }
+}
+
+/* LCOV_EXCL_START */
+static int
+_timer_wait(void *data)
+{
+ Efl_Util_Device_Info *dev;
+
+ _eflutil.wl.devmgr.request_notified = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES;
+
+ if (eina_list_count(_eflutil.wl.devmgr.wait_devices) > 0)
+ {
+ EINA_LIST_FREE(_eflutil.wl.devmgr.wait_devices, dev)
+ {
+ eina_stringshare_del(dev->name);
+ dev->name = NULL;
+ }
+ }
+
+ wl_event_source_remove(_eflutil.wl.devmgr.wait_timer);
+ _eflutil.wl.devmgr.wait_timer = NULL;
+
+ return 1;
+}
+/* LCOV_EXCL_STOP */
+
+static void
+_efl_util_input_initialize_wait_device(void)
+{
+ struct wl_event_loop *loop;
+ int ret = -1;
+
+ if (_efl_util_input_check_wait_device_full()) return;
+
+ loop = wl_event_loop_create();
+ _eflutil.wl.devmgr.wait_timer = wl_event_loop_add_timer(loop, _timer_wait, NULL);
+ if (_eflutil.wl.devmgr.wait_timer)
+ {
+ ret = wl_event_source_timer_update(_eflutil.wl.devmgr.wait_timer,
+ EFL_UTIL_INPUT_GENERATOR_DEFAULT_TIME_OUT);
+ if (ret != 0) _timer_wait(NULL);
+ return;
+ }
+
+ while (_eflutil.wl.devmgr.wait_timer)
+ {
+ wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+ ret = wl_event_loop_dispatch(loop, EFL_UTIL_INPUT_GENERATOR_DEFAULT_DISPATCH_TIME_OUT);
+ if (ret != 0) _timer_wait(NULL);
+ }
+}
+
+static void
+_efl_util_input_initialize_append_device(const char *name, Ecore_Device_Class clas)
+{
+ Efl_Util_Device_Info *dev;
+
+ dev = (Efl_Util_Device_Info *)calloc(1, sizeof(Efl_Util_Device_Info));
+ EINA_SAFETY_ON_NULL_RETURN(dev);
+
+ dev->name = eina_stringshare_add(name);
+ dev->clas = clas;
+
+ _eflutil.wl.devmgr.wait_devices = eina_list_append(_eflutil.wl.devmgr.wait_devices, dev);
+}
+
+static void
+_efl_util_input_initialize_add_wait_device(const char *name, unsigned int dev_type)
+{
+ EINA_SAFETY_ON_NULL_RETURN(name);
+
+ if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
+ _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_TOUCH);
+
+ if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
+ _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_KEYBOARD);
+
+ if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
+ _efl_util_input_initialize_append_device(name, ECORE_DEVICE_CLASS_MOUSE);
+}
+
+API efl_util_inputgen_h
+efl_util_input_initialize_generator(unsigned int dev_type)
+{
+ int ret = EFL_UTIL_ERROR_NONE;
+ efl_util_inputgen_h inputgen_h = NULL;
+ unsigned int clas = 0x0;
+
+ if (!dev_type ||
+ dev_type & ~(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN
+ | EFL_UTIL_INPUT_DEVTYPE_KEYBOARD
+ | EFL_UTIL_INPUT_DEVTYPE_POINTER))
+ {
+ set_last_result(EFL_UTIL_ERROR_NO_SUCH_DEVICE);
+ goto out;
+ }
+
+ inputgen_h = (efl_util_inputgen_h)calloc(1, sizeof(struct _efl_util_inputgen_h));
+ if (!inputgen_h)
+ {
+ set_last_result(EFL_UTIL_ERROR_OUT_OF_MEMORY);
+ goto out;
+ }
+
+ inputgen_h->init_type |= dev_type;
+
+ ret = _wl_init();
+ if (ret == (int)EINA_FALSE)
+ {
+ set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
+ goto out;
+ }
+
+ if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
+ clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN;
+ if (dev_type & EFL_UTIL_INPUT_DEVTYPE_KEYBOARD)
+ clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD;
+ if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
+ clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
+
+ while (!_eflutil.wl.devmgr.devicemgr)
+ wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+
+ tizen_input_device_manager_init_generator(_eflutil.wl.devmgr.devicemgr, clas);
+
+ while (_eflutil.wl.devmgr.request_notified == -1)
+ wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);