-#include "e_keyrouter_intern.h"
+#include "e_keyrouter_wl_intern.h"
#include "e_input_intern.h"
#include "e_input_backend_intern.h"
#include "e_comp_wl_input_intern.h"
#include "e_comp_input_intern.h"
#include "e_input_thread_client_intern.h"
#include "e_security.h"
+#include "e_keyrouter_intern.h"
#include <tizen-extension-server-protocol.h>
+#ifdef HAVE_CYNARA
+#include <cynara-client.h>
+#endif
+
+static E_Tizen_Keyrouter *g_tizen_keyrouter = NULL;
+
+struct _E_Tizen_Keyrouter
+{
+ struct wl_global *global;
+
+ Eina_List *resources;
+
+ Eina_List *grab_surface_list;
+ Eina_List *grab_client_list;
+
+#ifdef HAVE_CYNARA
+ cynara *p_cynara;
+#endif
+};
-void
+EINTERN void
e_keyrouter_wl_event_surface_send(struct wl_resource *surface, int key, int mode)
{
Eina_List *l;
struct wl_resource *res_data;
struct wl_client *wc;
- EINA_SAFETY_ON_NULL_RETURN(krt);
EINA_SAFETY_ON_NULL_RETURN(surface);
wc = wl_resource_get_client(surface);
EINA_SAFETY_ON_NULL_RETURN(wc);
- EINA_LIST_FOREACH(krt->resources, l, res_data)
+ EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, res_data)
{
if (wl_resource_get_client(res_data) != wc) continue;
if (wl_resource_get_version(res_data) < 2) continue;
return !!ec;
}
-void
+EINTERN void
e_keyrouter_keycancel_send(struct wl_client *client, struct wl_resource *surface, unsigned int key)
{
Eina_List *l;
{
if (surface == data->surface)
{
- EINA_LIST_FOREACH(krt->resources, l, resource)
+ EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
{
if (wl_resource_get_client(resource) != wc) continue;
}
else if (client == data->wc)
{
- EINA_LIST_FOREACH(krt->resources, l, resource)
+ EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
{
if (wl_resource_get_client(resource) != wc) continue;
static void
_e_keyrouter_cb_unbind(struct wl_resource *resource)
{
- krt->resources = eina_list_remove(krt->resources, resource);
+ g_tizen_keyrouter->resources = eina_list_remove(g_tizen_keyrouter->resources, resource);
}
/* tizen_keyrouter global object bind function */
static void
_e_keyrouter_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
{
- E_KeyrouterPtr krt_instance = data;
struct wl_resource *resource;
resource = wl_resource_create(client, &tizen_keyrouter_interface, version, id);
return;
}
- krt->resources = eina_list_append(krt->resources, resource);
+ g_tizen_keyrouter->resources = eina_list_append(g_tizen_keyrouter->resources, resource);
- wl_resource_set_implementation(resource, &_e_keyrouter_implementation, krt_instance, _e_keyrouter_cb_unbind);
+ wl_resource_set_implementation(resource, &_e_keyrouter_implementation, NULL, _e_keyrouter_cb_unbind);
}
static void
wl_list_remove(&l->link);
E_FREE(l);
- krt->grab_client_list = eina_list_remove(krt->grab_client_list, client);
+ g_tizen_keyrouter->grab_client_list = eina_list_remove(g_tizen_keyrouter->grab_client_list, client);
}
static void
wl_list_remove(&l->link);
E_FREE(l);
- krt->grab_surface_list = eina_list_remove(krt->grab_surface_list, surface);
+ g_tizen_keyrouter->grab_surface_list = eina_list_remove(g_tizen_keyrouter->grab_surface_list, surface);
}
-int
+EINTERN int
e_keyrouter_wl_add_client_destroy_listener(struct wl_client *client)
{
struct wl_listener *destroy_listener = NULL;
if (!client) return TIZEN_KEYROUTER_ERROR_NONE;
- EINA_LIST_FOREACH(krt->grab_client_list, l, wc_data)
+ EINA_LIST_FOREACH(g_tizen_keyrouter->grab_client_list, l, wc_data)
{
if (wc_data)
{
destroy_listener->notify = _e_keyrouter_wl_client_cb_destroy;
wl_client_add_destroy_listener(client, destroy_listener);
- krt->grab_client_list = eina_list_append(krt->grab_client_list, client);
+ g_tizen_keyrouter->grab_client_list = eina_list_append(g_tizen_keyrouter->grab_client_list, client);
return TIZEN_KEYROUTER_ERROR_NONE;
}
/* Function for registering wl_surface destroy listener */
-int
+EINTERN int
e_keyrouter_wl_add_surface_destroy_listener(struct wl_resource *surface)
{
struct wl_listener *destroy_listener = NULL;
if (!surface) return TIZEN_KEYROUTER_ERROR_NONE;
- EINA_LIST_FOREACH(krt->grab_surface_list, l, surface_data)
+ EINA_LIST_FOREACH(g_tizen_keyrouter->grab_surface_list, l, surface_data)
{
if (surface_data)
{
destroy_listener->notify = _e_keyrouter_wl_surface_cb_destroy;
wl_resource_add_destroy_listener(surface, destroy_listener);
- krt->grab_surface_list = eina_list_append(krt->grab_surface_list, surface);
+ g_tizen_keyrouter->grab_surface_list = eina_list_append(g_tizen_keyrouter->grab_surface_list, surface);
return TIZEN_KEYROUTER_ERROR_NONE;
}
KLWRN("%s is failed: %s", func_name, buf);
}
-Eina_Bool
+EINTERN EINTERN Eina_Bool
e_keyrouter_wl_util_do_privilege_check(struct wl_client *client, uint32_t mode, uint32_t keycode)
{
int ret, retry_cnt=0;
if (!client) return EINA_FALSE;
/* If initialize cynara is failed, allow keygrabs regardless of the privilege permission. */
- if (krt->p_cynara == NULL)
+ if (g_tizen_keyrouter->p_cynara == NULL)
{
if (retried == EINA_FALSE)
{
for(retry_cnt = 0; retry_cnt < 5; retry_cnt++)
{
KLDBG("Retry cynara initialize: %d", retry_cnt+1);
- ret = cynara_initialize(&krt->p_cynara, NULL);
+ ret = cynara_initialize(&g_tizen_keyrouter->p_cynara, NULL);
if (EINA_UNLIKELY(CYNARA_API_SUCCESS != ret))
{
_e_keyrouter_wl_util_cynara_log("cynara_initialize", ret);
- krt->p_cynara = NULL;
+ g_tizen_keyrouter->p_cynara = NULL;
}
else
{
return EINA_TRUE;
}
- EINA_LIST_FOREACH(krt->grab_client_list, l, wc_data)
+ EINA_LIST_FOREACH(g_tizen_keyrouter->grab_client_list, l, wc_data)
{
if (wc_data == client)
{
}
#endif
-Eina_Bool
-e_keyrouter_wl_init(void)
+EINTERN E_Tizen_Keyrouter *
+e_keyrouter_wl_init(struct wl_display *display)
{
- int ret;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(display, NULL);
+
+ if (g_tizen_keyrouter) return g_tizen_keyrouter;
- EINA_SAFETY_ON_NULL_RETURN_VAL(krt, EINA_FALSE);
- EINA_SAFETY_ON_NULL_RETURN_VAL(e_comp, EINA_FALSE);
+ g_tizen_keyrouter = E_NEW(E_Tizen_Keyrouter, 1);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(g_tizen_keyrouter, NULL);
- krt->global = wl_global_create(e_comp_wl->wl.disp, &tizen_keyrouter_interface, 2, krt, _e_keyrouter_cb_bind);
- EINA_SAFETY_ON_NULL_RETURN_VAL(krt->global, EINA_FALSE);
+
+ g_tizen_keyrouter->global = wl_global_create(display,
+ &tizen_keyrouter_interface, 2, NULL, _e_keyrouter_cb_bind);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(g_tizen_keyrouter->global, NULL);
#ifdef HAVE_CYNARA
- ret = cynara_initialize(&krt->p_cynara, NULL);
+ int ret;
+
+ ret = cynara_initialize(&g_tizen_keyrouter->p_cynara, NULL);
if (EINA_UNLIKELY(CYNARA_API_SUCCESS != ret))
{
_e_keyrouter_wl_util_cynara_log("cynara_initialize", ret);
- krt->p_cynara = NULL;
+ g_tizen_keyrouter->p_cynara = NULL;
}
#endif
- return EINA_TRUE;
+ return g_tizen_keyrouter;
}
-void
+EINTERN void
e_keyrouter_wl_shutdown(void)
{
Eina_List *l, *l_next;
struct wl_client *client;
struct wl_listener *destroy_listener;
- EINA_SAFETY_ON_NULL_RETURN(krt);
+ if (!g_tizen_keyrouter) return;
- EINA_LIST_FOREACH_SAFE(krt->grab_client_list, l, l_next, client)
+ EINA_LIST_FOREACH_SAFE(g_tizen_keyrouter->grab_client_list, l, l_next, client)
{
destroy_listener = wl_client_get_destroy_listener(client, _e_keyrouter_wl_client_cb_destroy);
if (destroy_listener)
wl_list_remove(&destroy_listener->link);
E_FREE(destroy_listener);
}
- krt->grab_client_list = eina_list_remove(krt->grab_client_list, client);
+ g_tizen_keyrouter->grab_client_list = eina_list_remove(g_tizen_keyrouter->grab_client_list, client);
}
- EINA_LIST_FOREACH_SAFE(krt->grab_surface_list, l, l_next, resource)
+ EINA_LIST_FOREACH_SAFE(g_tizen_keyrouter->grab_surface_list, l, l_next, resource)
{
destroy_listener = wl_resource_get_destroy_listener(resource, _e_keyrouter_wl_surface_cb_destroy);
if (destroy_listener)
wl_list_remove(&destroy_listener->link);
E_FREE(destroy_listener);
}
- krt->grab_surface_list = eina_list_remove(krt->grab_surface_list, client);
+ g_tizen_keyrouter->grab_surface_list = eina_list_remove(g_tizen_keyrouter->grab_surface_list, client);
}
- EINA_LIST_FREE(krt->resources, resource)
+ EINA_LIST_FREE(g_tizen_keyrouter->resources, resource)
wl_resource_destroy(resource);
- if (krt->global) wl_global_destroy(krt->global);
+ if (g_tizen_keyrouter->global)
#ifdef HAVE_CYNARA
- if (krt->p_cynara) cynara_finish(krt->p_cynara);
+ if (g_tizen_keyrouter->p_cynara)
+ cynara_finish(g_tizen_keyrouter->p_cynara);
#endif
+
+ wl_global_destroy(g_tizen_keyrouter->global);
+
+ E_FREE(g_tizen_keyrouter);
}