}
EINTERN void
-e_keyrouter_keycancel_send(struct wl_client *client, struct wl_resource *surface, unsigned int key)
+e_keyrouter_surface_keycancel_send(struct wl_resource *surface, unsigned int key)
{
Eina_List *l;
- struct wl_resource *resource = NULL;
- struct wl_client *wc = NULL;
+ Eina_List *press_ptr_list;
E_Keyrouter_Key_List_NodePtr data;
- Eina_List *press_ptr_list = NULL;
+ struct wl_resource *resource;
+ struct wl_client *client;
- if (surface) wc = wl_resource_get_client(surface);
- else wc = client;
+ EINA_SAFETY_ON_NULL_RETURN(surface);
- EINA_SAFETY_ON_NULL_RETURN(wc);
+ client = wl_resource_get_client(surface);
g_rec_mutex_lock(&krt->grab_key_mutex);
+
press_ptr_list = krt->HardKeys[key].press_ptr;
EINA_LIST_FOREACH(press_ptr_list, l, data)
{
- if (surface)
+ if (surface != data->surface) continue;
+
+ EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
{
- if (surface == data->surface)
- {
- EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
- {
- if (wl_resource_get_client(resource) != wc) continue;
+ if (wl_resource_get_client(resource) != client) continue;
- tizen_keyrouter_send_key_cancel(resource, key-8);
- }
- }
+ tizen_keyrouter_send_key_cancel(resource, key-8);
}
- else if (client == data->wc)
+ }
+
+ g_rec_mutex_unlock(&krt->grab_key_mutex);
+}
+
+EINTERN void
+e_keyrouter_client_keycancel_send(struct wl_client *client, unsigned int key)
+{
+ Eina_List *l;
+ E_Keyrouter_Key_List_NodePtr data;
+ Eina_List *press_ptr_list;
+ struct wl_resource *resource;
+
+ EINA_SAFETY_ON_NULL_RETURN(client);
+
+ g_rec_mutex_lock(&krt->grab_key_mutex);
+
+ press_ptr_list = krt->HardKeys[key].press_ptr;
+ EINA_LIST_FOREACH(press_ptr_list, l, data)
+ {
+ if (client != data->wc) continue;
+
+ EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
{
- EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
- {
- if (wl_resource_get_client(resource) != wc) continue;
+ if (wl_resource_get_client(resource) != client) continue;
- tizen_keyrouter_send_key_cancel(resource, key-8);
- }
+ tizen_keyrouter_send_key_cancel(resource, key-8);
}
}
+
g_rec_mutex_unlock(&krt->grab_key_mutex);
}
(mode == TIZEN_KEYROUTER_MODE_SHARED)))
return TIZEN_KEYROUTER_ERROR_INVALID_MODE;
+ /* Regarding topmost mode, a client must request to grab a key with a valid surface. */
+ if (!surface && mode == TIZEN_KEYROUTER_MODE_TOPMOST)
+ {
+ KLWRN("Invalid surface for %d grab mode ! (key=%d)", mode, key);
+ return TIZEN_KEYROUTER_ERROR_INVALID_SURFACE;
+ }
+
+ return TIZEN_KEYROUTER_ERROR_NONE;
+}
+
+static int
+_e_keyrouter_keygrab_privilege_available_check(struct wl_client *client, int key, int mode)
+{
#ifdef HAVE_CYNARA
if (!e_keyrouter_wl_util_do_privilege_check(client, mode, key))
{
}
#endif
- /* Regarding topmost mode, a client must request to grab a key with a valid surface. */
- if (!surface && mode == TIZEN_KEYROUTER_MODE_TOPMOST)
- {
- KLWRN("Invalid surface for %d grab mode ! (key=%d)", mode, key);
- return TIZEN_KEYROUTER_ERROR_INVALID_SURFACE;
- }
-
return TIZEN_KEYROUTER_ERROR_NONE;
}
_e_keyrouter_input_thread_keygrab_set(void *data)
{
E_Input_Thread_Request_Keygrab_Data *keygrab_data = data;
- int res = 0;
+ int res = TIZEN_KEYROUTER_ERROR_NONE;
res = _e_keyrouter_keygrab_set_available_check(keygrab_data->client,
keygrab_data->surface, keygrab_data->key, keygrab_data->mode);
if (res != TIZEN_KEYROUTER_ERROR_NONE)
goto failed;
+ res = _e_keyrouter_keygrab_privilege_available_check(keygrab_data->client,
+ keygrab_data->key, keygrab_data->mode);
+ if (res != TIZEN_KEYROUTER_ERROR_NONE)
+ goto failed;
+
res = _e_keyrouter_keygrab_key_available_check(keygrab_data->key);
if (res != TIZEN_KEYROUTER_ERROR_NONE)
goto failed;
static void
_e_keyrouter_input_thread_keygrab_unset(void *data)
{
- int res = 0;
E_Input_Thread_Request_Keygrab_Data *keygrab_data = data;
- EINA_SAFETY_ON_NULL_RETURN(keygrab_data);
+ int res = TIZEN_KEYROUTER_ERROR_NONE;
- res = e_keyrouter_keygrab_unset(keygrab_data->client, keygrab_data->surface, keygrab_data->key);
+ res = _e_keyrouter_keygrab_key_available_check(keygrab_data->key);
+ if (res != TIZEN_KEYROUTER_ERROR_NONE)
+ goto failed;
- TRACE_INPUT_END();
+ res = _e_keyrouter_keygrab_privilege_available_check(keygrab_data->client,
+ keygrab_data->key, TIZEN_KEYROUTER_MODE_NONE);
+ if (res != TIZEN_KEYROUTER_ERROR_NONE)
+ goto cancel;
- if (res == TIZEN_KEYROUTER_ERROR_NONE)
- 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));
+ if (keygrab_data->surface)
+ e_keyrouter_surface_keygrab_unset(keygrab_data->surface, keygrab_data->key);
else
- 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);
+ e_keyrouter_client_keygrab_unset(keygrab_data->client, keygrab_data->key);
+
+ 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));
+
+ tizen_keyrouter_send_keygrab_notify(keygrab_data->resource,
+ keygrab_data->surface, keygrab_data->key, TIZEN_KEYROUTER_MODE_NONE, res);
+
+ return;
- tizen_keyrouter_send_keygrab_notify(keygrab_data->resource, keygrab_data->surface, keygrab_data->key, TIZEN_KEYROUTER_MODE_NONE, res);
+cancel:
+ if (keygrab_data->surface)
+ e_keyrouter_surface_keycancel_send(keygrab_data->surface, keygrab_data->key);
+ else
+ e_keyrouter_client_keycancel_send(keygrab_data->client, keygrab_data->key);
+
+failed:
+ 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 */
keygrab_data.key = key;
keygrab_data.mode = TIZEN_KEYROUTER_MODE_NONE; /* UNUSED */
- INF("client: %p, surface: %p, key: %d\n", keygrab_data.client, keygrab_data.surface, keygrab_data.key);
+ INF("client: %p, surface: %p, key: %d\n", keygrab_data.client,
+ keygrab_data.surface, keygrab_data.key);
+
_e_keyrouter_input_thread_keygrab_unset(&keygrab_data);
+
+ TRACE_INPUT_END();
}
/* tizen_keyrouter get_keygrab_status request handler */
if (res != TIZEN_KEYROUTER_ERROR_NONE)
goto done;
+ res = _e_keyrouter_keygrab_privilege_available_check(client,
+ grab_request->key, grab_request->mode);
+ if (res != TIZEN_KEYROUTER_ERROR_NONE)
+ goto done;
+
res = _e_keyrouter_keygrab_key_available_check(grab_request->key);
if (res != TIZEN_KEYROUTER_ERROR_NONE)
goto done;
if (res != TIZEN_KEYROUTER_ERROR_NONE)
goto done;
- res = e_keyrouter_keygrab_unset(client, surface, ungrab_request->key);
+ res = _e_keyrouter_keygrab_privilege_available_check(client,
+ ungrab_request->key, TIZEN_KEYROUTER_MODE_NONE);
+ if (res != TIZEN_KEYROUTER_ERROR_NONE)
+ goto cancel;
+
+ if (surface)
+ e_keyrouter_client_keygrab_unset(client, ungrab_request->key);
+ else
+ e_keyrouter_surface_keygrab_unset(surface, ungrab_request->key);
+
+cancel:
+ if (surface)
+ e_keyrouter_surface_keycancel_send(surface, ungrab_request->key);
+ else
+ e_keyrouter_client_keycancel_send(client, ungrab_request->key);
done:
ungrab_request->err = res;
if (res == TIZEN_KEYROUTER_ERROR_NONE)
KLDBG("Success to ungrab using list: %d key (wl_client: %p, wl_surface: %p, pid: %d)",
- ungrab_request->key, client, surface, e_keyrouter_util_get_pid(client, surface));
+ ungrab_request->key, client, surface,
+ e_keyrouter_util_get_pid(client, surface));
else
KLINF("Failed to ungrab using list: %d key (wl_client: %p, wl_surface: %p, pid: %d): res: %d",
- ungrab_request->key, client, surface, e_keyrouter_util_get_pid(client, surface), ungrab_request->err);
+ ungrab_request->key, client, surface,
+ e_keyrouter_util_get_pid(client, surface), ungrab_request->err);
}
TRACE_INPUT_END();
+
tizen_keyrouter_send_keygrab_notify_list(resource, surface, ungrab_list);
}
}
#ifdef HAVE_CYNARA
-EINTERN EINTERN Eina_Bool
+EINTERN Eina_Bool
e_keyrouter_wl_util_do_privilege_check(struct wl_client *client, uint32_t mode, uint32_t keycode)
{
Eina_Bool res = EINA_FALSE;