e_devicemgr: supports input blocking for internal requests 61/220861/1
authorMinJeong Kim <minjjj.kim@samsung.com>
Wed, 18 Dec 2019 01:56:44 +0000 (10:56 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Tue, 24 Dec 2019 05:29:01 +0000 (14:29 +0900)
Change-Id: I95cceacd339d622bc85b9e9bf1018a14ceed5798
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/bin/e_devicemgr.c
src/bin/e_devicemgr.h
src/bin/e_devicemgr_block.c
src/bin/e_devicemgr_private.h

index 3e922139fe18651329eba48582fd0e139cb6e8a6..ed663c25f1b0d2878d6483da0d0816104e0a9faf 100644 (file)
@@ -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);
+}
+
index 74fc448553b2f812e5ae57d7e70f45e7ad7eda2d..a703d73ee983d5e4fb16475a2d53d9f4229aff00 100644 (file)
@@ -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
index fb52f9ad97a4355a952e842f8954a961198577d7..1aa15b901c8bd8c0832df857e154a5c7cc46db5d 100644 (file)
@@ -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;
+}
index 92dc87ea2acee4d89f3a1df510fde6c2d73eb687..bc0a2294cba33e580404e5ee9db7c998572c3901 100644 (file)
@@ -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);