From: MinJeong Kim Date: Wed, 18 Dec 2019 01:56:44 +0000 (+0900) Subject: e_devicemgr: supports input blocking for internal requests X-Git-Tag: submit/tizen/20200103.060921~12 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=029cd86dda13f928f3b01359cb018bca08f24e5a;p=platform%2Fupstream%2Fenlightenment.git e_devicemgr: supports input blocking for internal requests Change-Id: I8c4dd45f7b7549231b54c3631ac8e2415f3d0f4b Signed-off-by: MinJeong Kim --- diff --git a/src/bin/e_devicemgr.c b/src/bin/e_devicemgr.c index 3e922139fe..ed663c25f1 100644 --- a/src/bin/e_devicemgr.c +++ b/src/bin/e_devicemgr.c @@ -178,3 +178,39 @@ e_devicemgr_shutdown(void) return EINA_TRUE; } +EINTERN Eina_Bool +e_devicemgr_block_internal_add(Ecore_Device_Class clas, Eina_Bool all_class, uint32_t duration, E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data) +{ + unsigned int dev_clas = 0x0; + + if (all_class) + dev_clas = TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD | + TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE | + TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN; + else + { + switch (clas) + { + case ECORE_DEVICE_CLASS_KEYBOARD: + dev_clas = TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD; + break; + case ECORE_DEVICE_CLASS_MOUSE: + dev_clas = TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE; + break; + case ECORE_DEVICE_CLASS_TOUCH: + dev_clas = TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN; + break; + default: + return EINA_FALSE; + } + } + + return e_devicemgr_block_add_internal(dev_clas, duration, cb_func, cb_data); +} + +EINTERN Eina_Bool +e_devicemgr_block_internal_remove(E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data) +{ + return e_devicemgr_block_remove_internal(cb_func, cb_data); +} + diff --git a/src/bin/e_devicemgr.h b/src/bin/e_devicemgr.h index 74fc448553..a703d73ee9 100644 --- a/src/bin/e_devicemgr.h +++ b/src/bin/e_devicemgr.h @@ -32,6 +32,8 @@ typedef struct _E_Devicemgr_Input_Device_Multi typedef struct _E_Devicemgr E_Devicemgr; +typedef void (*E_Devicemgr_Block_Expire_Cb) (void *data); + #else #ifndef E_DEVICEMGR_H #define E_DEVICEMGR_H @@ -56,6 +58,11 @@ struct _E_Devicemgr unsigned int devtype; struct wl_client *client; Ecore_Timer *duration_timer; + + unsigned int internal_devtype; + Ecore_Timer *internal_duration_timer; + E_Devicemgr_Block_Expire_Cb internal_cb_func; + void *internal_cb_data; } block; Eina_List *pressed_keys; @@ -103,6 +110,8 @@ E_API int e_devicemgr_shutdown(void); Eina_Bool e_devicemgr_detent_is_detent(const char *name); +EINTERN Eina_Bool e_devicemgr_block_internal_add(Ecore_Device_Class clas, Eina_Bool all_clas, uint32_t duration, E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data); +EINTERN Eina_Bool e_devicemgr_block_internal_remove(E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data); #endif #endif diff --git a/src/bin/e_devicemgr_block.c b/src/bin/e_devicemgr_block.c index fb52f9ad97..1aa15b901c 100644 --- a/src/bin/e_devicemgr_block.c +++ b/src/bin/e_devicemgr_block.c @@ -10,7 +10,8 @@ e_devicemgr_block_check_keyboard(Ecore_Event_Key *ev, Eina_Bool pressed) EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON); - if (e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD) + if ((e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD) || + (e_devicemgr->block.internal_devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD)) { if (!pressed) { @@ -71,7 +72,8 @@ e_devicemgr_block_check_button(Ecore_Event_Mouse_Button *ev, Eina_Bool pressed) if (ecore_device_class_get(dev) == ECORE_DEVICE_CLASS_MOUSE) { - if (e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE) + if ((e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE) || + (e_devicemgr->block.internal_devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE)) { if (!pressed) { @@ -93,7 +95,8 @@ e_devicemgr_block_check_button(Ecore_Event_Mouse_Button *ev, Eina_Bool pressed) } else if (ecore_device_class_get(dev) == ECORE_DEVICE_CLASS_TOUCH) { - if (e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN) + if ((e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN) || + (e_devicemgr->block.internal_devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN)) { if (!pressed) { @@ -128,14 +131,16 @@ e_devicemgr_block_check_move(Ecore_Event_Mouse_Move *ev) if (ecore_device_class_get(dev) == ECORE_DEVICE_CLASS_MOUSE) { - if (e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE) + if ((e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE) || + (e_devicemgr->block.internal_devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE)) { return ECORE_CALLBACK_DONE; } } else if (ecore_device_class_get(dev) == ECORE_DEVICE_CLASS_TOUCH) { - if (e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN) + if ((e_devicemgr->block.devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN) || + (e_devicemgr->block.internal_devtype & TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN)) { return ECORE_CALLBACK_DONE; } @@ -261,3 +266,62 @@ e_devicemgr_block_remove(struct wl_client *client) return TIZEN_INPUT_DEVICE_MANAGER_ERROR_NONE; } + +static Eina_Bool +_e_devicemgr_block_timer_internal(void *data) +{ + e_devicemgr->block.internal_devtype = 0x0; + e_devicemgr->block.internal_duration_timer = NULL; + + if (!e_devicemgr->block.internal_cb_func) return ECORE_CALLBACK_CANCEL; + + //Call expiration cb for internal block + e_devicemgr->block.internal_cb_func(e_devicemgr->block.internal_cb_data); + + e_devicemgr->block.internal_cb_func = NULL; + e_devicemgr->block.internal_cb_data = NULL; + + return ECORE_CALLBACK_DONE; +} + + + +Eina_Bool +e_devicemgr_block_add_internal(uint32_t clas, uint32_t duration, E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data) +{ + uint32_t all_class = TIZEN_INPUT_DEVICE_MANAGER_CLAS_MOUSE | + TIZEN_INPUT_DEVICE_MANAGER_CLAS_KEYBOARD | + TIZEN_INPUT_DEVICE_MANAGER_CLAS_TOUCHSCREEN; + + if (!(clas & all_class)) return EINA_FALSE; + + if (e_devicemgr->block.internal_duration_timer) + ecore_timer_del(e_devicemgr->block.internal_duration_timer); + e_devicemgr->block.internal_duration_timer = ecore_timer_add(duration / 1000.0, _e_devicemgr_block_timer_internal, NULL); + + e_devicemgr->block.internal_devtype |= clas; + + e_devicemgr->block.internal_cb_func = cb_func; + e_devicemgr->block.internal_cb_data = cb_data; + + return EINA_TRUE; +} + +Eina_Bool +e_devicemgr_block_remove_internal(E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data) +{ + if ((e_devicemgr->block.internal_cb_func != cb_func) || + (e_devicemgr->block.internal_cb_data != cb_data)) return EINA_FALSE; + + e_devicemgr->block.internal_devtype = 0x0; + if (e_devicemgr->block.internal_duration_timer) + { + ecore_timer_del(e_devicemgr->block.internal_duration_timer); + e_devicemgr->block.internal_duration_timer = NULL; + } + + e_devicemgr->block.internal_cb_func = NULL; + e_devicemgr->block.internal_cb_data = NULL; + + return EINA_TRUE; +} diff --git a/src/bin/e_devicemgr_private.h b/src/bin/e_devicemgr_private.h index 92dc87ea2a..bc0a2294cb 100644 --- a/src/bin/e_devicemgr_private.h +++ b/src/bin/e_devicemgr_private.h @@ -159,6 +159,9 @@ void e_devicemgr_wl_block_send_expired(struct wl_resource *resource); int e_devicemgr_block_add(struct wl_client *client, struct wl_resource *resource, uint32_t clas, uint32_t duration); int e_devicemgr_block_remove(struct wl_client *client); +Eina_Bool e_devicemgr_block_add_internal(uint32_t clas, uint32_t duration, E_Devicemgr_Block_Expire_Cb cb_func, void *cb_data); +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_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);