e_devicemgr: handle init_generator_with_sync request 68/288268/1 accepted/tizen/unified/20230215.155617
authorduna.oh <duna.oh@samsung.com>
Fri, 9 Dec 2022 05:42:46 +0000 (14:42 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 14 Feb 2023 08:49:38 +0000 (17:49 +0900)
init_generator_with_sync req. is available since tizen_input_devie_manager v.5
e_devicemgr handles this request by sending error_none event when device
is added in E20 and ready to generate input events.
If device is not ready in timer's duration (1 sec), e_devicemgr sends errors.

Change-Id: Ia8412114af58c1f71839c8a111d00fa639f2be9c

src/bin/e_devicemgr_input.c
src/bin/e_devicemgr_inputgen.c
src/bin/e_devicemgr_private.h
src/bin/e_devicemgr_wl.c

index 316f243..6c0b51a 100644 (file)
@@ -242,6 +242,7 @@ _e_devicemgr_input_device_add(const char *name, const char *identifier, const ch
    if (!e_devicemgr->last_device_kbd && dev->clas == ECORE_DEVICE_CLASS_KEYBOARD)
      e_devicemgr->last_device_kbd = dev;
 
+   e_devicemgr_inputgen_device_ready_send(dev);
    e_devicemgr_wl_device_add(dev);
    e_devicemgr_inputgen_get_device_info(dev);
    _e_devicemgr_detent_set_info(dev);
index 64ad2b7..af51c6a 100644 (file)
@@ -599,6 +599,7 @@ _e_devicemgr_inputgen_client_cb_destroy(struct wl_listener *l, void *data)
           {
              e_devicemgr->inputgen.resource_list =
                eina_list_remove_list(e_devicemgr->inputgen.resource_list, list);
+             E_FREE_FUNC(rdata->sync_timer, ecore_timer_del);
              E_FREE(rdata);
           }
      }
@@ -689,7 +690,7 @@ _e_devicemgr_inputgen_client_del(struct wl_client *client, unsigned int clas)
      }
 }
 
-static void
+static E_Devicemgr_Inputgen_Resource_Data *
 _e_devicemgr_inputgen_resource_add(struct wl_resource *resource, const char *name)
 {
    E_Devicemgr_Inputgen_Resource_Data *rdata;
@@ -697,17 +698,19 @@ _e_devicemgr_inputgen_resource_add(struct wl_resource *resource, const char *nam
 
    EINA_LIST_FOREACH(e_devicemgr->inputgen.resource_list, l, rdata)
      {
-        if (rdata->resource == resource) return;
+        if (rdata->resource == resource) return rdata;
      }
 
    rdata = NULL;
    rdata = E_NEW(E_Devicemgr_Inputgen_Resource_Data, 1);
-   EINA_SAFETY_ON_NULL_RETURN(rdata);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(rdata, NULL);
 
    rdata->resource = resource;
    strncpy(rdata->name, name, UINPUT_MAX_NAME_SIZE - 1);
 
    e_devicemgr->inputgen.resource_list = eina_list_append(e_devicemgr->inputgen.resource_list, rdata);
+
+   return rdata;
 }
 
 static void
@@ -722,6 +725,7 @@ _e_devicemgr_inputgen_resource_del(struct wl_resource *resource)
           {
              e_devicemgr->inputgen.resource_list =
                eina_list_remove_list(e_devicemgr->inputgen.resource_list, l);
+             E_FREE_FUNC(rdata->sync_timer, ecore_timer_del);
              E_FREE(rdata);
           }
      }
@@ -892,6 +896,67 @@ e_devicemgr_inputgen_add(struct wl_client *client, struct wl_resource *resource,
 }
 
 void
+e_devicemgr_inputgen_device_ready_send(E_Devicemgr_Input_Device *dev)
+{
+   E_Devicemgr_Inputgen_Resource_Data *rdata;
+   Eina_List *l;
+   int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
+
+   EINA_LIST_FOREACH(e_devicemgr->inputgen.resource_list, l, rdata)
+     {
+        if (e_devicemgr_strcmp(rdata->name, dev->name) == EINA_FALSE) continue;
+        if (rdata->sync_timer)
+          {
+             e_devicemgr_wl_generator_with_sync_send_event(rdata->resource, ret);
+
+             ecore_timer_del(rdata->sync_timer);
+             rdata->sync_timer = NULL;
+          }
+     }
+}
+
+Eina_Bool
+_e_devicemgr_inputgen_sync_timer(void *data)
+{
+   E_Devicemgr_Inputgen_Resource_Data *rdata = data;
+   int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_SYSTEM_RESOURCES;
+
+   DMDBG("Init Generator with sync. timer expired!!! dev: %s", rdata->name);
+
+   if (!rdata || !rdata->resource) return ECORE_CALLBACK_CANCEL;
+
+   e_devicemgr_wl_generator_with_sync_send_event(rdata->resource, ret);
+
+   rdata->sync_timer = NULL;
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+void
+e_devicemgr_inputgen_add_with_sync(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name)
+{
+   int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
+   E_Devicemgr_Inputgen_Resource_Data *rdata;
+
+   if (clas & TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD)
+     ret = _e_devicemgr_inputgen_create_device(ECORE_DEVICE_CLASS_KEYBOARD, client, name);
+   if (clas & TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE)
+     ret = _e_devicemgr_inputgen_create_device(ECORE_DEVICE_CLASS_MOUSE, client, name);
+   if (clas & TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN)
+     ret = _e_devicemgr_inputgen_create_device(ECORE_DEVICE_CLASS_TOUCH, client, name);
+
+   if (ret == TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE)
+     {
+        _e_devicemgr_inputgen_client_add(client, clas);
+        rdata = _e_devicemgr_inputgen_resource_add(resource, name);
+        if (!rdata) return;
+        rdata->sync_timer = ecore_timer_add(1.0, _e_devicemgr_inputgen_sync_timer, rdata);
+     }
+
+   return;
+}
+
+void
 e_devicemgr_inputgen_remove(struct wl_client *client, struct wl_resource *resource, uint32_t clas)
 {
    Eina_List *l, *l_next;
index 5297150..0acd77a 100644 (file)
@@ -122,6 +122,7 @@ struct _E_Devicemgr_Inputgen_Resource_Data
 {
    struct wl_resource *resource;
    char name[UINPUT_MAX_NAME_SIZE];
+   Ecore_Timer *sync_timer;
 };
 
 struct _E_Devicemgr_Conf_Edd
@@ -169,6 +170,7 @@ Eina_Bool e_devicemgr_block_add_internal(uint32_t clas, uint32_t duration, E_Dev
 Eina_Bool e_devicemgr_block_remove_internal(E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data);
 
 int e_devicemgr_inputgen_add(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name);
+void e_devicemgr_inputgen_add_with_sync(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name);
 void e_devicemgr_inputgen_remove(struct wl_client *client, struct wl_resource *resource, uint32_t clas);
 int e_devicemgr_inputgen_generate_key(struct wl_client *client, struct wl_resource *resource, const char *keyname, Eina_Bool pressed);
 int e_devicemgr_inputgen_generate_pointer(struct wl_client *client, struct wl_resource *resource, uint32_t type, uint32_t x, uint32_t y, uint32_t button);
@@ -187,4 +189,6 @@ Eina_Bool e_devicemgr_input_init(void);
 void e_devicemgr_input_shutdown(void);
 
 void e_devicemgr_wl_touch_max_count_send(int slot, struct wl_resource *res, struct wl_resource *seat_res);
+void e_devicemgr_wl_generator_with_sync_send_event(struct wl_resource *resource, int error);
+void e_devicemgr_inputgen_device_ready_send(E_Devicemgr_Input_Device *dev);
 
index bbef393..f8d8a59 100644 (file)
@@ -314,6 +314,13 @@ e_devicemgr_wl_touch_max_count_send(int slot, struct wl_resource *res, struct wl
      }
 }
 
+void
+e_devicemgr_wl_generator_with_sync_send_event(struct wl_resource *resource, int result)
+{
+   if (!resource) return;
+   DMDBG("Init Generator with sync. send result: %d", result);
+   tizen_input_device_manager_send_error(resource, result);
+}
 
 static void
 _e_devicemgr_wl_cb_block_events(struct wl_client *client, struct wl_resource *resource, uint32_t serial, uint32_t clas, uint32_t duration)
@@ -392,6 +399,22 @@ _e_devicemgr_wl_cb_init_generator_with_name(struct wl_client *client, struct wl_
 }
 
 static void
+_e_devicemgr_wl_cb_init_generator_with_sync(struct wl_client *client, struct wl_resource *resource, uint32_t clas, const char *name)
+{
+#ifdef HAVE_CYNARA
+   if (EINA_FALSE == _e_devicemgr_util_do_privilege_check(client, wl_client_get_fd(client),
+                                                          "http://tizen.org/privilege/inputgenerator"))
+     {
+        DMERR("_e_devicemgr_wl_cb_init_generator_with_sync request:priv check failed");
+        tizen_input_device_manager_send_error(resource, TIZEN_INPUT_DEVICE_MANAGER_ERROR_NO_PERMISSION);
+        return;
+     }
+#endif
+
+   e_devicemgr_inputgen_add_with_sync(client, resource, clas, name);
+}
+
+static void
 _e_devicemgr_wl_cb_deinit_generator(struct wl_client *client, struct wl_resource *resource, uint32_t clas)
 {
    int ret = TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE;
@@ -549,6 +572,7 @@ static const struct tizen_input_device_manager_interface _e_devicemgr_wl_impleme
    _e_devicemgr_wl_cb_destroy,
    _e_devicemgr_wl_cb_generate_axis,
    _e_devicemgr_wl_cb_set_touch_count,
+   _e_devicemgr_wl_cb_init_generator_with_sync,
 };
 
 static void
@@ -688,7 +712,7 @@ e_devicemgr_wl_init(void)
 
    /* try to add tizen_input_device_manager to wayland globals */
    e_devicemgr->wl_data->global = wl_global_create(e_comp_wl->wl.disp,
-                                                   &tizen_input_device_manager_interface, 4,
+                                                   &tizen_input_device_manager_interface, 5,
                                                    NULL, _e_devicemgr_wl_cb_bind);
    if (!e_devicemgr->wl_data->global)
      {