Change keygrab logic : add ecore timer -> check global added & keymap update flags 15/79115/6 accepted/tizen/common/20160713.145004 accepted/tizen/mobile/20160713.094421 accepted/tizen/wearable/20160713.094404 submit/tizen/20160713.072203
authorgs86.lee <gs86.lee@samsung.com>
Fri, 8 Jul 2016 08:10:11 +0000 (17:10 +0900)
committergs86.lee <gs86.lee@samsung.com>
Wed, 13 Jul 2016 07:16:54 +0000 (16:16 +0900)
Change-Id: I0514140be01403cd6f3b294392e8e1909368ae33

src/mobile/hw_key.c

index 03f3771..faad5c6 100644 (file)
@@ -562,23 +562,32 @@ const char *key_name[KEY_NAME_MAX] = {
 static struct {
        Ecore_Event_Handler *key_up;
        Ecore_Event_Handler *key_down;
+       Ecore_Event_Handler *global_added;
+       Ecore_Event_Handler *keymap_update;
        Ecore_Timer *home_long_press_timer;
        Ecore_Timer *home_multi_press_timer;
-       Ecore_Timer *keygrab_timer;
        Eina_Bool cancel;
+       Eina_Bool keymap_update_flag;
+       Eina_Bool global_added_flag;
        int homekey_count;
 } key_info = {
        .key_up = NULL,
        .key_down = NULL,
+       .global_added = NULL,
+       .keymap_update = NULL,
        .home_long_press_timer = NULL,
        .home_multi_press_timer = NULL,
-       .keygrab_timer = NULL,
        .cancel = EINA_FALSE,
+       .keymap_update_flag = EINA_FALSE,
+       .global_added_flag = EINA_FALSE,
        .homekey_count = 0,
 };
 
 
 
+static void _destroy_precondition_handlers_for_keygrab(void);
+
+
 
 static void _cancel_key_events(void)
 {
@@ -880,11 +889,18 @@ static Eina_Bool _key_press_cb(void *data, int type, void *event)
 
 
 
-static Eina_Bool __keygrab_timer_cb(void *data)
+static void _set_keygrab(void)
 {
        int i = 0;
        int ret = 0;
 
+       if (key_info.keymap_update_flag != EINA_TRUE || key_info.global_added_flag != EINA_TRUE) {
+               _E("keygrab is not ready");
+               return;
+       }
+
+       _destroy_precondition_handlers_for_keygrab();
+
        for (i = 0; i < KEY_NAME_MAX; i++) {
                ret = ecore_wl_window_keygrab_set(NULL, key_name[i], 0, 0, 0, ECORE_WL_WINDOW_KEYGRAB_SHARED);
                _D("key grab : %s / ret : %d", key_name[i], ret);
@@ -899,40 +915,114 @@ static Eina_Bool __keygrab_timer_cb(void *data)
        if (!key_info.key_down) {
                _E("Failed to register a key down event handler");
        }
+}
 
-       return ECORE_CALLBACK_CANCEL;
+
+
+static void _unset_keygrab(void)
+{
+       int i = 0;
+
+       if (key_info.keymap_update_flag == EINA_TRUE && key_info.global_added_flag == EINA_TRUE) {
+               for (i = 0; i < KEY_NAME_MAX; i++) {
+                       ecore_wl_window_keygrab_unset(NULL, key_name[i], 0, 0);
+               }
+
+               key_info.keymap_update_flag = EINA_FALSE;
+               key_info.global_added_flag = EINA_FALSE;
+       }
 }
 
 
 
-void hw_key_create_window(void)
+static Eina_Bool _global_added_cb(void *data, int type, void *event)
 {
-       if (key_info.keygrab_timer) {
-               ecore_timer_del(key_info.keygrab_timer);
-               key_info.keygrab_timer = NULL;
+       Ecore_Wl_Event_Global *ev = NULL;
+
+       ev = (Ecore_Wl_Event_Global *) event;
+       if (!ev) {
+               _E("Failed to get global added event");
+               return ECORE_CALLBACK_CANCEL;
        }
 
-       key_info.keygrab_timer = ecore_timer_add(1.0f, __keygrab_timer_cb, NULL);
-       if (!key_info.keygrab_timer) {
-               _E("Failed to add timer for keygrab");
+       if (ev->interface && !strncmp(ev->interface, "tizen_keyrouter", strlen(ev->interface))) {
+               key_info.global_added_flag = EINA_TRUE;
+               _set_keygrab();
        }
+
+       return ECORE_CALLBACK_PASS_ON;
 }
 
 
 
-void hw_key_destroy_window(void)
+static Eina_Bool _keymap_update_cb(void *data, int type, void *event)
 {
-       int i = 0;
+       Ecore_Wl_Event_Keymap_Update *ev = NULL;
+       Ecore_Wl_Input *input = NULL;
+       struct xkb_keymap *keymap = NULL;
 
-       for (i = 0; i < KEY_NAME_MAX; i++) {
-               ecore_wl_window_keygrab_unset(NULL, key_name[i], 0, 0);
+       ev = (Ecore_Wl_Event_Keymap_Update *) event;
+       if (!ev) {
+               _E("Failed to get keymap event");
+               return ECORE_CALLBACK_CANCEL;
+       }
+
+       input = ecore_wl_input_get();
+       if (!input) {
+               _E("Failed to get wl input");
+               return ECORE_CALLBACK_CANCEL;
+       }
+
+       keymap = ecore_wl_input_keymap_get(input);
+       if (ev->keymap && keymap) {
+               key_info.keymap_update_flag = EINA_TRUE;
+               _set_keygrab();
+       }
+
+       return ECORE_CALLBACK_PASS_ON;
+}
+
+
+
+static void _create_precondition_handlers_for_keygrab(void)
+{
+       key_info.global_added = ecore_event_handler_add(ECORE_WL_EVENT_GLOBAL_ADDED, _global_added_cb, NULL);
+       if (!key_info.global_added) {
+               _E("Failed to add handler for global added");
+       }
+
+       key_info.keymap_update = ecore_event_handler_add(ECORE_WL_EVENT_KEYMAP_UPDATE, _keymap_update_cb, NULL);
+       if (!key_info.keymap_update) {
+               _E("Failed to add handler for keymap update");
+       }
+}
+
+
+
+static void _destroy_precondition_handlers_for_keygrab(void)
+{
+       if (key_info.global_added) {
+               ecore_event_handler_del(key_info.global_added);
+               key_info.global_added = NULL;
        }
 
-       if (key_info.keygrab_timer) {
-               ecore_timer_del(key_info.keygrab_timer);
-               key_info.keygrab_timer = NULL;
+       if (key_info.keymap_update) {
+               ecore_event_handler_del(key_info.keymap_update);
+               key_info.keymap_update = NULL;
        }
+}
+
+
+
+void hw_key_create_window(void)
+{
+       _create_precondition_handlers_for_keygrab();
+}
+
+
 
+void hw_key_destroy_window(void)
+{
        if (key_info.key_up) {
                ecore_event_handler_del(key_info.key_up);
                key_info.key_up = NULL;
@@ -942,6 +1032,9 @@ void hw_key_destroy_window(void)
                ecore_event_handler_del(key_info.key_down);
                key_info.key_down = NULL;
        }
+
+       _destroy_precondition_handlers_for_keygrab();
+       _unset_keygrab();
 }
 
 #endif