unsigned int data_length;
} E_Input_Thread_Request_Data;
+typedef struct
+{
+ struct wl_client *client;
+ struct wl_resource *resource;
+ struct wl_resource *surface;
+ uint32_t key;
+ uint32_t mode;
+} E_Input_Thread_Request_Keygrab_Data;
+
struct _E_Input_Seat
{
const char *name;
}
static void
-_e_keyrouter_keygrab_print(void *data, const char *log_path)
+_e_keyrouter_input_thread_keygrab_print(void *data)
{
+ char *log_path = (char *)data;
Eina_List *l;
E_Keyrouter_Key_List_NodePtr kdata;
E_Client *ec_focus;
char *cmd_focus, *cmd, *keyname;
FILE *log_fl;
- (void) data;
-
log_fl = fopen(log_path, "a");
if (!log_fl)
{
fprintf(log_fl, " ----- End -----\n\n");
fprintf(log_fl, " ----- Grabbed keys Info -----\n\n");
- g_rec_mutex_lock(&krt->grab_key_mutex);
for (i = 8; i <= krt->max_tizen_hwkeys; i++)
{
if (!krt->HardKeys[i].keycode) continue;
fprintf(log_fl, "\n");
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
-
fprintf(log_fl, " ----- End -----\n\n");
fclose(log_fl);
log_fl = NULL;
}
+static void
+_e_keyrouter_keygrab_print(void *data EINA_UNUSED, const char *log_path)
+{
+ e_input_thread_safe_call(_e_keyrouter_input_thread_keygrab_print, (void *)log_path, strlen(log_path)+1);
+}
+
static Eina_Bool
_e_keyrouter_cb_key_down(void *data, int type, void *event)
{
krt->HardKeys = E_NEW(E_Keyrouter_Grabbed_Key, kconf->max_keycode + 1);
EINA_SAFETY_ON_NULL_RETURN_VAL(krt->HardKeys, EINA_FALSE);
- g_rec_mutex_lock(&krt->grab_key_mutex);
-
krt->numTizenHWKeys = kconf->num_keycode;
krt->max_tizen_hwkeys = kconf->max_keycode;
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
-
if (e_comp_wl_input_keymap_cache_file_use_get() == EINA_FALSE)
{
KLINF("Server create a new cache file: %s", e_comp_wl_input_keymap_path_get(names));
krt = E_NEW(E_Keyrouter, 1);
EINA_SAFETY_ON_NULL_GOTO(krt, err);
- g_rec_mutex_init(&krt->grab_key_mutex);
-
kconfig = E_NEW(E_Keyrouter_Config_Data, 1);
EINA_SAFETY_ON_NULL_GOTO(kconfig, err);
_e_keyrouter_deinit_handlers();
- g_rec_mutex_lock(&krt->grab_key_mutex);
for (i = 0; i <= krt->max_tizen_hwkeys; i++)
{
if (krt->HardKeys[i].keyname)
E_FREE(keycode_data);
}
E_FREE(krt->HardKeys);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
EINA_LIST_FREE(krt->ignore_list, keycode_data)
E_FREE(keycode_data);
krt->longkey.timer = 0;
}
- g_rec_mutex_clear(&krt->grab_key_mutex);
-
e_keyrouter_wl_shutdown();
E_FREE(krt);
void e_keyrouter_keygrab_list_lock()
{
- g_rec_mutex_lock(&krt->grab_key_mutex);
}
void e_keyrouter_keygrab_list_unlock()
{
- g_rec_mutex_unlock(&krt->grab_key_mutex);
}
static Eina_Bool
_e_keyrouter_is_key_grabbed(int key)
{
- g_rec_mutex_lock(&krt->grab_key_mutex);
-
if (!krt->HardKeys[key].keycode)
{
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return EINA_FALSE;
}
if (krt->HardKeys[key].excl_ptr ||
krt->HardKeys[key].top_ptr ||
krt->HardKeys[key].shared_ptr)
{
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return EINA_TRUE;
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
-
return EINA_FALSE;
}
return EINA_FALSE;
}
- g_rec_mutex_lock(&krt->grab_key_mutex);
-
if (!krt->HardKeys[ev->keycode].keycode)
{
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return EINA_FALSE;
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
-
return EINA_TRUE;
}
E_FREE(keyname);
EINA_SAFETY_ON_NULL_GOTO(key_release, failed);
- g_rec_mutex_lock(&krt->grab_key_mutex);
press_ptr_list = krt->HardKeys[keycode].press_ptr;
EINA_LIST_FREE(press_ptr_list, key_node_data)
{
}
krt->HardKeys[keycode].press_ptr = NULL;
- g_rec_mutex_unlock(&krt->grab_key_mutex);
_e_keyrouter_key_free(key_cancel);
_e_keyrouter_key_free(key_release);
if (krt->isPictureOffEnabled == 1)
{
- g_rec_mutex_lock(&krt->grab_key_mutex);
Eina_List *pic_off_ptr_list = krt->HardKeys[keycode].pic_off_ptr;
EINA_LIST_FOREACH(pic_off_ptr_list, l, key_node_data)
{
if(cmd) E_FREE(cmd);
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return;
}
E_Keyrouter_Event_Data *key_data = NULL;
/* Deliver release clean up pressed key list */
- g_rec_mutex_lock(&krt->grab_key_mutex);
Eina_List *press_ptr_list = krt->HardKeys[ev->keycode].press_ptr;
EINA_LIST_FREE(press_ptr_list, key_node_data)
{
E_FREE(key_node_data);
}
krt->HardKeys[ev->keycode].press_ptr = NULL;
- g_rec_mutex_unlock(&krt->grab_key_mutex);
}
static void
return;
}
- g_rec_mutex_lock(&krt->grab_key_mutex);
Eina_List *excl_ptr_list = krt->HardKeys[keycode].excl_ptr;
EINA_LIST_FOREACH(excl_ptr_list, l, key_node_data)
{
key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
if(pname) E_FREE(pname);
if(cmd) E_FREE(cmd);
- 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 = krt->HardKeys[keycode].or_excl_ptr;
EINA_LIST_FOREACH(or_excl_ptr, l, key_node_data)
{
key_node_data->surface, key_node_data->wc, pid, pname ?: "Unknown");
if(pname) E_FREE(pname);
if(cmd) E_FREE(cmd);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return;
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
// Top position grab must need a focus surface.
if (surface_focus)
{
- g_rec_mutex_lock(&krt->grab_key_mutex);
Eina_List *top_ptr_list = krt->HardKeys[keycode].top_ptr;
EINA_LIST_FOREACH(top_ptr_list, l, key_node_data)
{
if(pname) E_FREE(pname);
if(cmd) E_FREE(cmd);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return;
}
krt->isWindowStackChanged = EINA_FALSE;
if(pname) E_FREE(pname);
if(cmd) E_FREE(cmd);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return;
}
break;
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
goto need_shared;
}
- g_rec_mutex_lock(&krt->grab_key_mutex);
shared_ptr_list = krt->HardKeys[keycode].shared_ptr;
- g_rec_mutex_unlock(&krt->grab_key_mutex);
-
if (shared_ptr_list)
{
need_shared:
}
if (res)
{
- g_rec_mutex_lock(&krt->grab_key_mutex);
shared_ptr_list = krt->HardKeys[keycode].shared_ptr;
EINA_LIST_FOREACH(shared_ptr_list, l, key_node_data)
{
}
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
}
}
}
}
/* TODO: Check this client is located inside a display boundary */
- g_rec_mutex_lock(&krt->grab_key_mutex);
Eina_List *top_ptr_list = krt->HardKeys[arr_idx].top_ptr;
EINA_LIST_FOREACH_SAFE(top_ptr_list, l, l_next, key_node_data)
{
krt->HardKeys[arr_idx].top_ptr = eina_list_promote_list(krt->HardKeys[arr_idx].top_ptr, l);
KLDBG("Move a client(e_client: %p, wl_surface: %p) to first index of list(key: %d)",
ec_top, key_node_data->surface, arr_idx);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return EINA_TRUE;
}
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
-
if (ec_top == ec_focus)
{
KLDBG("The e_client(%p) is a focus client", ec_top);
if (mode == TIZEN_KEYROUTER_MODE_EXCLUSIVE)
{
- g_rec_mutex_lock(&krt->grab_key_mutex);
if (krt->HardKeys[key].excl_ptr != NULL)
{
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return TIZEN_KEYROUTER_ERROR_GRABBED_ALREADY;
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
}
if (mode == TIZEN_KEYROUTER_MODE_TOPMOST)
Eina_List *keylist_ptr = NULL, *l = NULL;
E_Keyrouter_Key_List_NodePtr key_node_data = NULL;
- g_rec_mutex_lock(&krt->grab_key_mutex);
switch(mode)
{
case TIZEN_KEYROUTER_MODE_EXCLUSIVE:
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return TIZEN_KEYROUTER_ERROR_NONE;
case TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE:
break;
default:
KLWRN("Unknown key(%d) and grab mode(%d)", key, mode);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return TIZEN_KEYROUTER_ERROR_INVALID_MODE;
}
{
KLDBG("The key(%d) is already grabbed same mode(%s) on the same wl_surface %p",
key, e_keyrouter_mode_to_string(mode), surface);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return TIZEN_KEYROUTER_ERROR_GRABBED_ALREADY;
}
}
{
KLDBG("The key(%d) is already grabbed same mode(%s) on the same wl_client %p",
key, e_keyrouter_mode_to_string(mode), wc);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return TIZEN_KEYROUTER_ERROR_GRABBED_ALREADY;
}
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return TIZEN_KEYROUTER_ERROR_NONE;
}
EINA_SAFETY_ON_TRUE_RETURN_VAL(((!surface) && (!wc)), EINA_FALSE);
- g_rec_mutex_lock(&krt->grab_key_mutex);
list = _e_keyrouter_get_list(mode, key);
if (!list)
{
}
end:
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return ret;
}
new_keyptr->focused = focused;
new_keyptr->status = E_KRT_CSTAT_ALIVE;
- g_rec_mutex_lock(&krt->grab_key_mutex);
-
switch(mode)
{
case TIZEN_KEYROUTER_MODE_EXCLUSIVE:
default:
KLWRN("Unknown key(%d) and grab mode(%d)", key, mode);
E_FREE(new_keyptr);
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return TIZEN_KEYROUTER_ERROR_INVALID_MODE;
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
if (TIZEN_KEYROUTER_MODE_PRESSED != mode)
{
Eina_List *l = NULL, *l_next = NULL;
E_Keyrouter_Key_List_NodePtr key_node_data = NULL;
- g_rec_mutex_lock(&krt->grab_key_mutex);
list = _e_keyrouter_get_list(mode, key);
if (!list)
{
- g_rec_mutex_unlock(&krt->grab_key_mutex);
return;
}
KLDBG("Remove a %s Mode Grabbed key(%d) by wc(%p)", e_keyrouter_mode_to_string(mode), key, wc);
}
}
-
- g_rec_mutex_unlock(&krt->grab_key_mutex);
}
void
EINA_SAFETY_ON_TRUE_RETURN(((!surface) && (!wc)));
- g_rec_mutex_lock(&krt->grab_key_mutex);
-
for (i = 0; i <= krt->max_tizen_hwkeys; i++)
{
if (0 == krt->HardKeys[i].keycode) continue;
}
}
}
-
- g_rec_mutex_unlock(&krt->grab_key_mutex);
}
int
EINA_SAFETY_ON_NULL_RETURN(wc);
- g_rec_mutex_lock(&krt->grab_key_mutex);
press_ptr_list = krt->HardKeys[key].press_ptr;
EINA_LIST_FOREACH(press_ptr_list, l, data)
{
}
}
}
- g_rec_mutex_unlock(&krt->grab_key_mutex);
}
static int
return count;
}
-/* tizen_keyrouter_set_keygrab request handler */
static void
-_e_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, uint32_t key, uint32_t mode)
+_e_keyrouter_input_thread_keygrab_set(void *data)
{
int res = 0;
+ E_Input_Thread_Request_Keygrab_Data keygrab_data;
+ memcpy(&keygrab_data, data, sizeof(E_Input_Thread_Request_Keygrab_Data));
+
TRACE_INPUT_BEGIN(_e_keyrouter_cb_keygrab_set);
- res = e_keyrouter_keygrab_set(client, surface, key, mode);
+ res = e_keyrouter_keygrab_set(keygrab_data.client, keygrab_data.surface, keygrab_data.key, keygrab_data.mode);
TRACE_INPUT_END();
if (res == TIZEN_KEYROUTER_ERROR_NONE)
{
- if (mode == TIZEN_KEYROUTER_MODE_EXCLUSIVE)
+ if (keygrab_data.mode == TIZEN_KEYROUTER_MODE_EXCLUSIVE)
{
- KLINF("Success to %d key %s grab request (wl_client: %p, wl_surface: %p, pid: %d)", key, e_keyrouter_mode_to_string(mode),
- client, surface, e_keyrouter_util_get_pid(client, surface));
+ KLINF("Success to %d key %s grab request (wl_client: %p, wl_surface: %p, pid: %d)", keygrab_data.key, e_keyrouter_mode_to_string(keygrab_data.mode),
+ keygrab_data.client, keygrab_data.surface, e_keyrouter_util_get_pid(keygrab_data.client, keygrab_data.surface));
}
else
{
- KLDBG("Success to %d key %s grab request (wl_client: %p, wl_surface: %p, pid: %d)", key, e_keyrouter_mode_to_string(mode),
- client, surface, e_keyrouter_util_get_pid(client, surface));
+ KLDBG("Success to %d key %s grab request (wl_client: %p, wl_surface: %p, pid: %d)", keygrab_data.key, e_keyrouter_mode_to_string(keygrab_data.mode),
+ keygrab_data.client, keygrab_data.surface, e_keyrouter_util_get_pid(keygrab_data.client, keygrab_data.surface));
}
}
else
- KLINF("Failed to %d key %s grab request (wl_client: %p, wl_surface: %p, pid: %d): res: %d", key, e_keyrouter_mode_to_string(mode),
- client, surface, e_keyrouter_util_get_pid(client, surface), res);
- tizen_keyrouter_send_keygrab_notify(resource, surface, key, mode, res);
+ KLINF("Failed to %d key %s grab request (wl_client: %p, wl_surface: %p, pid: %d): res: %d", keygrab_data.key, e_keyrouter_mode_to_string(keygrab_data.mode),
+ keygrab_data.client, keygrab_data.surface, e_keyrouter_util_get_pid(keygrab_data.client, keygrab_data.surface), res);
+
+ tizen_keyrouter_send_keygrab_notify(keygrab_data.resource, keygrab_data.surface, keygrab_data.key, keygrab_data.mode, res);
}
-/* tizen_keyrouter unset_keygrab request handler */
+/* tizen_keyrouter_set_keygrab request handler */
static void
-_e_keyrouter_cb_keygrab_unset(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, uint32_t key)
+_e_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, uint32_t key, uint32_t mode)
{
- int res = 0;
+ TRACE_INPUT_BEGIN(_e_keyrouter_cb_keygrab_set);
- TRACE_INPUT_BEGIN(_e_keyrouter_cb_keygrab_unset);
+ E_Input_Thread_Request_Keygrab_Data keygrab_data;
+
+ keygrab_data.resource = resource;
+ keygrab_data.surface = surface;
+ keygrab_data.client = client;
+ keygrab_data.key = key;
+ keygrab_data.mode = mode;
+
+ INF("client: %p, surface: %p, key: %d, mode: %d\n", keygrab_data.client, keygrab_data.surface, keygrab_data.key, keygrab_data.mode);
+ e_input_thread_safe_call(_e_keyrouter_input_thread_keygrab_set, &keygrab_data, sizeof(E_Input_Thread_Request_Keygrab_Data));
+}
- res = e_keyrouter_keygrab_unset(client, surface, key);
+static void
+_e_keyrouter_input_thread_keygrab_unset(void *data)
+{
+ int res = 0;
+ E_Input_Thread_Request_Keygrab_Data keygrab_data;
+ memcpy(&keygrab_data, data, sizeof(E_Input_Thread_Request_Keygrab_Data));
+
+ res = e_keyrouter_keygrab_unset(keygrab_data.client, keygrab_data.surface, keygrab_data.key);
TRACE_INPUT_END();
if (res == TIZEN_KEYROUTER_ERROR_NONE)
- KLDBG("Success to %d key ungrab request (wl_client: %p, wl_surface: %p, pid: %d)", key, client, surface,
- e_keyrouter_util_get_pid(client, surface));
+ KLDBG("Success to %d key ungrab request (wl_client: %p, wl_surface: %p, pid: %d)", keygrab_data.key, keygrab_data.client, keygrab_data.surface,
+ e_keyrouter_util_get_pid(keygrab_data.client, keygrab_data.surface));
else
- KLINF("Failed to %d key ungrab request (wl_client: %p, wl_surface: %p, pid: %d): res: %d", key, client, surface,
- e_keyrouter_util_get_pid(client, surface), res);
- tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, res);
+ KLINF("Failed to %d key ungrab request (wl_client: %p, wl_surface: %p, pid: %d): res: %d", keygrab_data.key, keygrab_data.client, keygrab_data.surface,
+ e_keyrouter_util_get_pid(keygrab_data.client, keygrab_data.surface), res);
+
+ tizen_keyrouter_send_keygrab_notify(keygrab_data.resource, keygrab_data.surface, keygrab_data.key, TIZEN_KEYROUTER_MODE_NONE, res);
+}
+
+/* tizen_keyrouter unset_keygrab request handler */
+static void
+_e_keyrouter_cb_keygrab_unset(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, uint32_t key)
+{
+ TRACE_INPUT_BEGIN(_e_keyrouter_cb_keygrab_unset);
+
+ E_Input_Thread_Request_Keygrab_Data keygrab_data;
+
+ keygrab_data.resource = resource;
+ keygrab_data.surface = surface;
+ keygrab_data.client = client;
+ keygrab_data.key = key;
+
+ INF("client: %p, surface: %p, key: %d, mode: %d\n", keygrab_data.client, keygrab_data.surface, keygrab_data.key, keygrab_data.mode);
+ e_input_thread_safe_call(_e_keyrouter_input_thread_keygrab_unset, &keygrab_data, sizeof(E_Input_Thread_Request_Keygrab_Data));
}
/* tizen_keyrouter get_keygrab_status request handler */
client, surface, e_keyrouter_util_get_pid(client, surface), grab_request->err);
}
-
TRACE_INPUT_END();
tizen_keyrouter_send_keygrab_notify_list(resource, surface, grab_list);
}
E_Input_Event_Handler *_key_down_handler;
E_Input_Event_Handler *_key_up_handler;
EINA_DEPRECATED GMutex event_handler_mutex;
- GRecMutex grab_key_mutex;
+ EINA_DEPRECATED GRecMutex grab_key_mutex;
};
struct _E_Keyrouter_Grab_Request {