From: duna.oh Date: Fri, 9 Dec 2022 05:42:46 +0000 (+0900) Subject: e_devicemgr: handle init_generator_with_sync request X-Git-Tag: accepted/tizen/unified/20230215.155617^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=93e6a6b6e5a663eaf46baaec5388ec088a28456d;p=platform%2Fupstream%2Fenlightenment.git e_devicemgr: handle init_generator_with_sync request 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 --- diff --git a/src/bin/e_devicemgr_input.c b/src/bin/e_devicemgr_input.c index 316f243..6c0b51a 100644 --- a/src/bin/e_devicemgr_input.c +++ b/src/bin/e_devicemgr_input.c @@ -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); diff --git a/src/bin/e_devicemgr_inputgen.c b/src/bin/e_devicemgr_inputgen.c index 64ad2b7..af51c6a 100644 --- a/src/bin/e_devicemgr_inputgen.c +++ b/src/bin/e_devicemgr_inputgen.c @@ -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; diff --git a/src/bin/e_devicemgr_private.h b/src/bin/e_devicemgr_private.h index 5297150..0acd77a 100644 --- a/src/bin/e_devicemgr_private.h +++ b/src/bin/e_devicemgr_private.h @@ -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); diff --git a/src/bin/e_devicemgr_wl.c b/src/bin/e_devicemgr_wl.c index bbef393..f8d8a59 100644 --- a/src/bin/e_devicemgr_wl.c +++ b/src/bin/e_devicemgr_wl.c @@ -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) {