static Eina_Bool _e_keyrouter_is_key_grabbed(int key);
static Eina_Bool _e_keyrouter_check_top_visible_window(E_Comp *c, E_Client *ec_focus, int arr_idx);
static void _e_keyrouter_query_tizen_key_table(void);
+static int _e_keyrouter_wl_array_length(const struct wl_array *array);
+
static Eina_Bool _e_keyrouter_client_cb_stack(void *data, int type, void *event);
static Eina_Bool _e_keyrouter_client_cb_remove(void *data, int type, void *event);
static void _e_keyrouter_wl_client_cb_destroy(struct wl_listener *l, void *data);
+static int _e_keyrouter_keygrab_set(struct wl_client *client, struct wl_resource *surface, uint32_t key, uint32_t mode);
+static int _e_keyrouter_keygrab_unset(struct wl_client *client, struct wl_resource *surface, uint32_t key);
-/* 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)
+
+static int
+_e_keyrouter_keygrab_set(struct wl_client *client, struct wl_resource *surface, uint32_t key, uint32_t mode)
{
- (void) client;
- (void) resource;
- (void) surface;
- (void) key;
- (void) mode;
int res=0;
if (!surface)
{
KLDBG("Invalid surface for TOPMOST grab mode ! (key=%d, mode=%d)\n", key, mode);
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_INVALID_SURFACE);
+ return TIZEN_KEYROUTER_ERROR_INVALID_SURFACE;
}
else
{
if (0 > key || MAX_HWKEYS < key )
{
KLDBG("Invalid range of key ! (keycode:%d)\n", key);
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_INVALID_KEY);
+ return TIZEN_KEYROUTER_ERROR_INVALID_KEY;
}
/* Check whether the key can be grabbed or not !
if (0 == krt->HardKeys[key].keycode)
{
KLDBG("Invalid key ! Disabled to grab ! (keycode:%d)\n", key);
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_INVALID_KEY);
+ return TIZEN_KEYROUTER_ERROR_INVALID_KEY;
}
/* Check whether the mode is valid or not */
if (TIZEN_KEYROUTER_MODE_NONE > mode || TIZEN_KEYROUTER_MODE_EXCLUSIVE < mode)
{
KLDBG("Invalid range of mode ! (mode:%d)\n", mode);
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_INVALID_MODE);
+ return TIZEN_KEYROUTER_ERROR_INVALID_MODE;
}
/* Check whether the request key can be grabbed or not */
KLDBG("Result of grab check for a key (key:%d, mode:%d, res:%d)\n", key, mode, res);
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, res);
+ return 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)
+static int
+_e_keyrouter_keygrab_unset(struct wl_client *client, struct wl_resource *surface, uint32_t key)
{
- (void) client;
- (void) resource;
- (void) surface;
- (void) key;
-
E_Pixmap *ep = NULL;
E_Client *ec = NULL;
/* SHARED grab */
e_keyrouter_find_and_remove_client_from_list(NULL, client, key, TIZEN_KEYROUTER_MODE_SHARED);
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE);
+ return TIZEN_KEYROUTER_ERROR_NONE;
}
if (!surface || !(ep = wl_resource_get_user_data(surface)))
{
KLDBG("Surface or E_Pixman from the surface is invalid ! Return error !\n");
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_INVALID_SURFACE);
+ return TIZEN_KEYROUTER_ERROR_INVALID_SURFACE;
}
if (!(ec = e_pixmap_client_get(ep)))
{
KLDBG("E_Client pointer from E_Pixman from surface is invalid ! Return error !\n");
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_INVALID_SURFACE);
+ return TIZEN_KEYROUTER_ERROR_INVALID_SURFACE;
}
/* EXCLUSIVE grab */
/* SHARED grab */
e_keyrouter_find_and_remove_client_from_list(ec, NULL, key, TIZEN_KEYROUTER_MODE_SHARED);
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE);
+ return TIZEN_KEYROUTER_ERROR_NONE;
+}
+
+/* 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)
+{
+ int res = 0;
+
+ KLDBG("Key grab request (key:%d, mode:%d)\n", key, mode);
+
+ res = _e_keyrouter_keygrab_set(client, surface, key, mode);
+
+ tizen_keyrouter_send_keygrab_notify(resource, surface, key, mode, 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)
+{
+ int res = 0;
+
+ KLDBG("Key ungrab request (key:%d)\n", key);
+
+ res = _e_keyrouter_keygrab_unset(client, surface, key);
+
+ tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, res);
}
/* tizen_keyrouter get_keygrab_status request handler */
/* TODO : Need to check key grab status for the requesting wl client */
- WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE);
+ tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE);
+}
+
+static void
+_e_keyrouter_cb_keygrab_set_list(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, struct wl_array *grab_list)
+{
+ struct wl_array grab_result_list = {0,};
+ E_Keyrouter_Grab_Result *grab_result = NULL;
+ E_Keyrouter_Grab_Request *grab_request = NULL;
+ int res = TIZEN_KEYROUTER_ERROR_NONE;
+
+ wl_array_init(&grab_result_list);
+
+ if (0 != (_e_keyrouter_wl_array_length(grab_list) % 2))
+ {
+ /* FIX ME: Which way is effectively to notify invalid pair to client */
+ KLDBG("Invalid keycode and grab mode pair. Check arguments in a list\n");
+ grab_result = wl_array_add(&grab_result_list, sizeof(E_Keyrouter_Grab_Result));
+ grab_result->request_data.key = 0;
+ grab_result->request_data.mode = 0;
+ grab_result->err = TIZEN_KEYROUTER_ERROR_INVALID_ARRAY;
+ goto send_notify;
+ }
+
+ wl_array_for_each(grab_request, grab_list)
+ {
+ if (grab_request)
+ {
+ res = _e_keyrouter_keygrab_set(client, surface, grab_request->key, grab_request->mode);
+ KLDBG("Grab request using list [key: %d, mode: %d, res: %d]\n", grab_request->key, grab_request->mode, res);
+ grab_result = wl_array_add(&grab_result_list, sizeof(E_Keyrouter_Grab_Result));
+ grab_result->request_data.key = grab_request->key;
+ grab_result->request_data.mode = grab_request->mode;
+ grab_result->err = res;
+ }
+ }
+
+send_notify:
+ tizen_keyrouter_send_keygrab_notify_list(resource, surface, &grab_result_list);
+ wl_array_release(&grab_result_list);
}
+static void
+_e_keyrouter_cb_keygrab_unset_list(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, struct wl_array *ungrab_list)
+{
+ struct wl_array grab_result_list = {0,};
+ E_Keyrouter_Grab_Result *grab_result = NULL;
+ int *ungrab_request = NULL;
+ int res = TIZEN_KEYROUTER_ERROR_NONE;
+
+ wl_array_init(&grab_result_list);
+
+ wl_array_for_each(ungrab_request, ungrab_list)
+ {
+ if (ungrab_request)
+ {
+ res = _e_keyrouter_keygrab_unset(client, surface, *ungrab_request);
+ KLDBG("Ungrab request using list [key: %d, res: %d]\n", *ungrab_request, res);
+ grab_result = wl_array_add(&grab_result_list, sizeof(E_Keyrouter_Grab_Result));
+ grab_result->request_data.key = *ungrab_request;
+ grab_result->request_data.mode = TIZEN_KEYROUTER_MODE_NONE;
+ grab_result->err = res;
+ }
+ }
+
+ tizen_keyrouter_send_keygrab_notify_list(resource, surface, &grab_result_list);
+ wl_array_release(&grab_result_list);
+}
+
+
/* Function for registering wl_client destroy listener */
int
e_keyrouter_add_client_destroy_listener(struct wl_client *client)
static const struct tizen_keyrouter_interface _e_keyrouter_implementation = {
_e_keyrouter_cb_keygrab_set,
_e_keyrouter_cb_keygrab_unset,
- _e_keyrouter_cb_get_keygrab_status
+ _e_keyrouter_cb_get_keygrab_status,
+ _e_keyrouter_cb_keygrab_set_list,
+ _e_keyrouter_cb_keygrab_unset_list
};
/* tizen_keyrouter global object destroy function */
fclose(fp_key_tables);
}
+static int
+_e_keyrouter_wl_array_length(const struct wl_array *array)
+{
+ int *data = NULL;
+ int count = 0;
+
+ wl_array_for_each(data, array)
+ {
+ if (data) count++;
+ }
+
+ return count;
+}
+
static void
_e_keyrouter_deinit_handlers(void)
{