return res;
}
-/* Function for sending key events to wl_client(s) */
-static void
-_e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev, E_Device *dev)
+static Eina_Bool
+_e_keyrouter_send_key_event_in_list(int type, Ecore_Event_Key *ev, E_Device *dev, unsigned int keyrouter_list_mode,
+ unsigned int keyrouter_send_mode, const char *mode_str, int key_event_log_type)
{
+ Eina_Bool ret = EINA_FALSE;
+ Eina_List *l = NULL, *ptr_list = NULL;
E_Keyrouter_Key_List_NodePtr key_node_data;
- Eina_List *l = NULL, *pic_off_ptr_list = NULL;
- int keycode = 0;
-
- keycode = ev->keycode;
- if (krt->isPictureOffEnabled == 1)
+ g_rec_mutex_lock(&krt->grab_key_mutex);
+ ptr_list = e_keyrouter_hardkeys_list_get(krt->HardKeys, ev->keycode, keyrouter_list_mode);
+ EINA_LIST_FOREACH(ptr_list, l, key_node_data)
{
- g_rec_mutex_lock(&krt->grab_key_mutex);
- pic_off_ptr_list = e_keyrouter_hardkeys_list_get(krt->HardKeys, keycode, TIZEN_KEYROUTER_MODE_PICTURE_OFF);
- EINA_LIST_FOREACH(pic_off_ptr_list, l, key_node_data)
+ if (key_node_data)
{
- if (key_node_data)
+ _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
+ key_node_data->focused, keyrouter_send_mode);
+
+ _e_keyrouter_log_key_event(key_event_log_type, mode_str,
+ ev->keycode,
+ key_node_data->focused,
+ key_node_data->status,
+ key_node_data->surface,
+ key_node_data->wc);
+
+ if ((keyrouter_list_mode == TIZEN_KEYROUTER_MODE_EXCLUSIVE) ||
+ (keyrouter_list_mode == TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE))
{
- _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev, key_node_data->focused, TIZEN_KEYROUTER_MODE_SHARED);
-
- _e_keyrouter_log_key_event(KEY_EVENT_LOG_TYPE_PICTURE_OFF, "SHARED",
- ev->keycode,
- key_node_data->focused,
- key_node_data->status,
- key_node_data->surface,
- key_node_data->wc);
+ ret = EINA_TRUE;
+ goto end;
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
+ }
+
+end:
+ g_rec_mutex_unlock(&krt->grab_key_mutex);
+
+ return ret;
+}
+
+/* Function for sending key events to wl_client(s) */
+static void
+_e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev, E_Device *dev)
+{
+ if (krt->isPictureOffEnabled == 1)
+ {
+ _e_keyrouter_send_key_event_in_list(type, ev, dev, TIZEN_KEYROUTER_MODE_PICTURE_OFF, TIZEN_KEYROUTER_MODE_SHARED,
+ "SHARED", KEY_EVENT_LOG_TYPE_PICTURE_OFF);
return;
}
else
key_event_log_type = KEY_EVENT_LOG_TYPE_KEY_UP;
- g_rec_mutex_lock(&krt->grab_key_mutex);
- Eina_List *excl_ptr_list = e_keyrouter_hardkeys_list_get(krt->HardKeys, keycode, TIZEN_KEYROUTER_MODE_EXCLUSIVE);
- EINA_LIST_FOREACH(excl_ptr_list, l, key_node_data)
- {
- if (key_node_data)
- {
- _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
- key_node_data->focused, TIZEN_KEYROUTER_MODE_EXCLUSIVE);
-
- _e_keyrouter_log_key_event(key_event_log_type, "EXCLUSIVE",
- ev->keycode,
- key_node_data->focused,
- key_node_data->status,
- key_node_data->surface,
- key_node_data->wc);
-
- g_rec_mutex_unlock(&krt->grab_key_mutex);
-
- return;
- }
- }
- g_rec_mutex_unlock(&krt->grab_key_mutex);
-
- g_rec_mutex_lock(&krt->grab_key_mutex);
- Eina_List *or_excl_ptr = e_keyrouter_hardkeys_list_get(krt->HardKeys, keycode, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE);
- EINA_LIST_FOREACH(or_excl_ptr, l, key_node_data)
- {
- if (key_node_data)
- {
- _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev, dev,
- key_node_data->focused, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE);
-
- _e_keyrouter_log_key_event(key_event_log_type, "OVERRIDABLE_EXCLUSIVE",
- ev->keycode,
- key_node_data->focused,
- key_node_data->status,
- key_node_data->surface,
- key_node_data->wc);
-
- g_rec_mutex_unlock(&krt->grab_key_mutex);
+ if (_e_keyrouter_send_key_event_in_list(type, ev, dev, TIZEN_KEYROUTER_MODE_EXCLUSIVE, TIZEN_KEYROUTER_MODE_EXCLUSIVE,
+ "EXCLUSIVE", key_event_log_type))
+ return;
- return;
- }
- }
- g_rec_mutex_unlock(&krt->grab_key_mutex);
+ if (_e_keyrouter_send_key_event_in_list(type, ev, dev, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE,
+ "OVERRIDABLE_EXCLUSIVE", key_event_log_type))
+ return;
// Top position grab must need a focus client.
if (ec_focus)