From: duna.oh Date: Fri, 10 Jan 2025 01:56:16 +0000 (+0900) Subject: inputgen: bind tizen_input_device_manager, wl_seat only when inputgen APIs is invoked X-Git-Tag: accepted/tizen/9.0/unified/20250112.180833~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F53%2F317953%2F1;p=platform%2Fcore%2Fapi%2Fefl-util.git inputgen: bind tizen_input_device_manager, wl_seat only when inputgen APIs is invoked 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 --- diff --git a/src/efl_util.c b/src/efl_util.c index a4a6ae5..b44384a 100644 --- a/src/efl_util.c +++ b/src/efl_util.c @@ -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;