inputgen: bind tizen_input_device_manager, wl_seat only when inputgen APIs is invoked 53/317953/1
authorduna.oh <duna.oh@samsung.com>
Fri, 10 Jan 2025 01:56:16 +0000 (10:56 +0900)
committerduna.oh <duna.oh@samsung.com>
Fri, 10 Jan 2025 05:09:20 +0000 (14:09 +0900)
Separates the input-related interfaces (tizen_input_device_manager, wl_seat) from
other interfaces since these are solely required for inputgen APIs and sends
their events (e.g.,device_add/remove & capabilities) necessitating dispatching.

The 'tizen_input_device_manager' interface provides events to clients binding 'wl_seat'.
Therefore, the efl-util input generator needs to bind 'wl_seat'.
For instance, efl-util may not receive max_touch_count events, leading to
inability to generate touch events.

Change-Id: I3a66d057d5906e1e20d140ef95b0d8756682f514

src/efl_util.c

index a4a6ae5d4f30cab81698c3329fc096554b1748e6..b44384a366ef14ecdc64fc82b1ce95aab1e29720 100644 (file)
@@ -157,11 +157,10 @@ typedef struct _Efl_Util_Data
       } shot;
       struct
       {
+         struct wl_event_queue *queue;
+         struct wl_seat *seat;
          struct tizen_input_device_manager *devicemgr;
          int request_notified;
-         Eina_List *devices;
-         Eina_List *wait_devices;
-         struct wl_event_source *wait_timer;
          int max_touch_count;
          int request_touch_count;
       } devmgr;
@@ -221,7 +220,7 @@ static Efl_Util_Data _eflutil =
       NULL, NULL, NULL,
       { 0, NULL, NULL, NULL }, /* tizen_policy protocol */
       { NULL, NULL, NULL, NULL, 0 }, /* screenshooter protocol */
-      { NULL, -1, NULL, NULL, NULL, 0, 0 }, /* tizen_input_device_manager protocol */
+      { NULL, NULL, NULL, -1, 0, 0 }, /* tizen_input_device_manager protocol */
       { 0, NULL, NULL } /* display_policy protocol */
    },
 };
@@ -244,6 +243,8 @@ static void                    _cb_wl_default_queue_reg_global(void *data, struc
 static void                    _cb_wl_default_queue_reg_global_remove(void *data, struct wl_registry *reg, unsigned int name);
 static void                    _cb_wl_reg_screenshooter_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
 static void                    _cb_wl_reg_screenshooter_global_remove(void *data, struct wl_registry *reg, unsigned int name);
+static void                    _cb_wl_reg_devicemgr_global(void *data, struct wl_registry *reg, unsigned int name, const char *interface, unsigned int version);
+static void                    _cb_wl_reg_devicemgr_global_remove(void *data, struct wl_registry *reg, unsigned int name);
 static void                    _cb_wl_tz_policy_conformant(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t is_conformant);
 static void                    _cb_wl_tz_policy_conformant_area(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, uint32_t conformant_part, uint32_t state, int32_t x, int32_t y, int32_t w, int32_t h);
 static void                    _cb_wl_tz_policy_notification_done(void *data, struct tizen_policy *tizen_policy, struct wl_surface *surface, int32_t level, uint32_t state);
@@ -300,6 +301,11 @@ struct tizen_policy_listener _wl_tz_policy_listener =
    _cb_wl_conformant_region,
 };
 
+struct tizen_display_policy_listener _wl_tz_display_policy_listener =
+{
+   _cb_wl_tz_display_policy_brightness_done,
+};
+
 struct tizen_input_device_manager_listener _wl_tz_devmgr_listener =
 {
    _cb_device_add,
@@ -309,9 +315,10 @@ struct tizen_input_device_manager_listener _wl_tz_devmgr_listener =
    _cb_max_touch_count
 };
 
-struct tizen_display_policy_listener _wl_tz_display_policy_listener =
+static const struct wl_registry_listener _wl_reg_devicemgr_listener =
 {
-   _cb_wl_tz_display_policy_brightness_done,
+   _cb_wl_reg_devicemgr_global,
+   _cb_wl_reg_devicemgr_global_remove
 };
 
 static const struct wl_registry_listener _wl_default_queue_reg_listener =
@@ -518,11 +525,6 @@ _cb_wl_reg_global(void *data,
         output->output = wl_registry_bind(reg, id, &wl_output_interface, version);
         wl_output_add_listener(output->output, &output_listener, output);
      }
-   else if (strcmp(interface, "tizen_input_device_manager") == 0)
-     {
-        _eflutil.wl.devmgr.devicemgr = wl_registry_bind(reg, id, &tizen_input_device_manager_interface, version);
-        tizen_input_device_manager_add_listener(_eflutil.wl.devmgr.devicemgr, &_wl_tz_devmgr_listener, NULL);
-     }
    else if (!strcmp(interface, "tizen_display_policy"))
      {
         _eflutil.wl.display_policy.proto = wl_registry_bind(reg, id, &tizen_display_policy_interface, version);
@@ -561,6 +563,33 @@ _cb_wl_reg_global_remove(void *data,
 }
 /* LCOV_EXCL_STOP */
 
+static void
+_cb_wl_reg_devicemgr_global(void *data,
+                           struct wl_registry *reg,
+                           unsigned int id,
+                           const char *interface,
+                           unsigned int version)
+{
+   if (strcmp(interface, "tizen_input_device_manager") == 0)
+     {
+        _eflutil.wl.devmgr.devicemgr = wl_registry_bind(reg, id, &tizen_input_device_manager_interface, version);
+        tizen_input_device_manager_add_listener(_eflutil.wl.devmgr.devicemgr, &_wl_tz_devmgr_listener, NULL);
+     }
+   else if (strcmp(interface, "wl_seat") == 0)
+     {
+        _eflutil.wl.devmgr.seat = wl_registry_bind(reg, id, &wl_seat_interface, version);
+     }
+}
+
+/* LCOV_EXCL_START */
+static void
+_cb_wl_reg_devicemgr_global_remove(void *data,
+                                  struct wl_registry *reg,
+                                  unsigned int id)
+{
+}
+/* LCOV_EXCL_STOP */
+
 static void
 _cb_wl_default_queue_reg_global(void *data,
                                 struct wl_registry *reg,
@@ -1277,6 +1306,51 @@ _efl_util_input_convert_input_generator_error(int ret)
      }
 }
 
+static Eina_Bool
+_efl_util_wl_inputgen_init()
+{
+   struct wl_display *display_wrapper = NULL;
+   struct wl_registry *registry = NULL;
+   int ret = 0;
+
+   if (_wl_init() == EINA_FALSE)
+     return EINA_FALSE;
+
+   wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+
+   display_wrapper = wl_proxy_create_wrapper(_eflutil.wl.dpy);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(display_wrapper, EINA_FALSE);
+
+   _eflutil.wl.devmgr.queue = wl_display_create_queue(_eflutil.wl.dpy);
+   EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.devmgr.queue, fail_create_queue);
+
+   wl_proxy_set_queue((struct wl_proxy *)display_wrapper, _eflutil.wl.devmgr.queue);
+
+   registry = wl_display_get_registry(display_wrapper);
+   EINA_SAFETY_ON_NULL_GOTO(registry, fail_get_registry);
+
+   wl_registry_add_listener(registry, &_wl_reg_devicemgr_listener, NULL);
+
+   ret = wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
+   EINA_SAFETY_ON_TRUE_GOTO(ret == -1, fail_roundtrip);
+   EINA_SAFETY_ON_NULL_GOTO(_eflutil.wl.devmgr.devicemgr, fail_roundtrip);
+
+   wl_registry_destroy(registry);
+   wl_proxy_wrapper_destroy(display_wrapper);
+
+   return EINA_TRUE;
+
+fail_roundtrip:
+   wl_registry_destroy(registry);
+fail_get_registry:
+   wl_event_queue_destroy(_eflutil.wl.devmgr.queue);
+   _eflutil.wl.devmgr.queue = NULL;
+fail_create_queue:
+   wl_proxy_wrapper_destroy(display_wrapper);
+
+   return EINA_FALSE;
+
+}
 static efl_util_inputgen_h
 _efl_util_input_create_inputgen(unsigned int dev_type, const char *name, int *ret, int with_name)
 {
@@ -1307,11 +1381,13 @@ _efl_util_input_create_inputgen(unsigned int dev_type, const char *name, int *re
         else strncpy(inputgen_h->name, "Input Generator", 31);
      }
 
-   *ret = _wl_init();
-   if (*ret == (int)EINA_FALSE)
+   if (!_eflutil.wl.devmgr.devicemgr)
      {
-        set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
-        goto out;
+        if (_efl_util_wl_inputgen_init() == EINA_FALSE)
+          {
+             set_last_result(EFL_UTIL_ERROR_INVALID_PARAMETER);
+             goto out;
+          }
      }
 
    if (dev_type & EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN)
@@ -1321,9 +1397,6 @@ _efl_util_input_create_inputgen(unsigned int dev_type, const char *name, int *re
    if (dev_type & EFL_UTIL_INPUT_DEVTYPE_POINTER)
      clas |= TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE;
 
-   while (!_eflutil.wl.devmgr.devicemgr && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
-
    if (with_name == 2)
       tizen_input_device_manager_init_generator_with_sync(_eflutil.wl.devmgr.devicemgr, clas, inputgen_h->name);
    else if (with_name == 1)
@@ -1333,7 +1406,7 @@ _efl_util_input_create_inputgen(unsigned int dev_type, const char *name, int *re
 
    ret_dispatch = 0;
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    *ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
@@ -1405,7 +1478,7 @@ efl_util_input_set_touch_count(int max_count)
      }
 
    while (!_eflutil.wl.devmgr.devicemgr && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    if (_eflutil.wl.devmgr.max_touch_count >= max_count)
      return EFL_UTIL_ERROR_NONE;
@@ -1414,7 +1487,7 @@ efl_util_input_set_touch_count(int max_count)
 
    ret_dispatch = 0;
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
@@ -1427,6 +1500,32 @@ efl_util_input_set_touch_count(int max_count)
    return ret;
 }
 
+static void
+_efl_util_wl_inputgen_deinit()
+{
+   if (_eflutil.wl.devmgr.seat)
+     {
+        wl_seat_release(_eflutil.wl.devmgr.seat);
+        _eflutil.wl.devmgr.seat = NULL;
+
+        wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
+     }
+
+   if (_eflutil.wl.devmgr.devicemgr)
+     {
+        tizen_input_device_manager_destroy(_eflutil.wl.devmgr.devicemgr);
+        _eflutil.wl.devmgr.devicemgr = NULL;
+
+        wl_display_roundtrip_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
+     }
+
+   if (_eflutil.wl.devmgr.queue)
+     {
+        wl_event_queue_destroy(_eflutil.wl.devmgr.queue);
+        _eflutil.wl.devmgr.queue = NULL;
+     }
+}
+
 API int
 efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
 {
@@ -1453,11 +1552,13 @@ efl_util_input_deinitialize_generator(efl_util_inputgen_h inputgen_h)
    tizen_input_device_manager_deinit_generator(_eflutil.wl.devmgr.devicemgr, clas);
 
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
 
+   _efl_util_wl_inputgen_deinit();
+
    return ret;
 }
 
@@ -1477,7 +1578,7 @@ efl_util_input_generate_key(efl_util_inputgen_h inputgen_h, const char *key_name
    tizen_input_device_manager_generate_key(_eflutil.wl.devmgr.devicemgr, key_name, pressed);
 
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
@@ -1500,7 +1601,7 @@ efl_util_input_generate_touch(efl_util_inputgen_h inputgen_h, int idx,
 
    if (_eflutil.wl.devmgr.request_touch_count != 0 &&
        _eflutil.wl.devmgr.max_touch_count != _eflutil.wl.devmgr.request_touch_count)
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    if (idx >= _eflutil.wl.devmgr.max_touch_count)
      return EFL_UTIL_ERROR_INVALID_PARAMETER;
@@ -1525,7 +1626,7 @@ efl_util_input_generate_touch(efl_util_inputgen_h inputgen_h, int idx,
    tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
 
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
@@ -1542,7 +1643,7 @@ _efl_util_input_generate_touch_axis_send(unsigned int type, double value)
    tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_double(value));
 
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
@@ -1666,7 +1767,7 @@ efl_util_input_generate_touch_axis(efl_util_inputgen_h inputgen_h, int idx,
    tizen_input_device_manager_generate_touch(_eflutil.wl.devmgr.devicemgr, type, x, y, idx);
 
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
@@ -1707,7 +1808,7 @@ efl_util_input_generate_pointer(efl_util_inputgen_h inputgen_h, int buttons, efl
    tizen_input_device_manager_generate_pointer(_eflutil.wl.devmgr.devicemgr, type, x, y, buttons);
 
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;
@@ -1744,7 +1845,7 @@ efl_util_input_generate_wheel(efl_util_inputgen_h inputgen_h, efl_util_input_poi
    tizen_input_device_manager_generate_axis(_eflutil.wl.devmgr.devicemgr, type, wl_fixed_from_int(value));
 
    while ((_eflutil.wl.devmgr.request_notified == -1) && (ret_dispatch != -1))
-     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.queue);
+     ret_dispatch = wl_display_dispatch_queue(_eflutil.wl.dpy, _eflutil.wl.devmgr.queue);
 
    ret = _efl_util_input_convert_input_generator_error(_eflutil.wl.devmgr.request_notified);
    _eflutil.wl.devmgr.request_notified = -1;