wc = wl_resource_get_client(surface);
EINA_SAFETY_ON_NULL_RETURN(wc);
+ g_rec_mutex_lock(&krt->resource_list_mutex);
EINA_LIST_FOREACH(krt->resources, l, res_data)
{
if (wl_resource_get_client(res_data) != wc) continue;
ELOGF("INPUT", "tizen_keyrouter_send_event_surface|E|", NULL);
}
}
+ g_rec_mutex_unlock(&krt->resource_list_mutex);
}
static void
{
if (surface == data->surface)
{
+ g_rec_mutex_lock(&krt->resource_list_mutex);
EINA_LIST_FOREACH(krt->resources, l, resource)
{
if (wl_resource_get_client(resource) != wc) continue;
tizen_keyrouter_send_key_cancel(resource, key-8);
}
+ g_rec_mutex_unlock(&krt->resource_list_mutex);
}
}
else if (client == data->wc)
{
+ g_rec_mutex_lock(&krt->resource_list_mutex);
EINA_LIST_FOREACH(krt->resources, l, resource)
{
if (wl_resource_get_client(resource) != wc) continue;
tizen_keyrouter_send_key_cancel(resource, key-8);
}
+ g_rec_mutex_unlock(&krt->resource_list_mutex);
}
}
g_rec_mutex_unlock(&krt->grab_key_mutex);
static void
_e_keyrouter_cb_unbind(struct wl_resource *resource)
{
+ g_rec_mutex_lock(&krt->resource_list_mutex);
krt->resources = eina_list_remove(krt->resources, resource);
+ g_rec_mutex_unlock(&krt->resource_list_mutex);
+}
+
+static enum wl_iterator_result
+_e_keyrouter_get_resource(struct wl_resource *resource, void *data)
+{
+ g_rec_mutex_lock(&krt->resource_list_mutex);
+ krt->resources = eina_list_remove(krt->resources, resource);
+ g_rec_mutex_unlock(&krt->resource_list_mutex);
+
+ return WL_ITERATOR_CONTINUE;
+}
+
+static void
+_e_keyrouter_cb_wl_client_destroy(struct wl_listener *l, void *data)
+{
+ struct wl_client *client = data;
+
+ wl_client_for_each_resource(client, _e_keyrouter_get_resource, NULL);
+ wl_list_remove(&l->link);
+ E_FREE(l);
}
/* tizen_keyrouter global object bind function */
{
E_KeyrouterPtr krt_instance = data;
struct wl_resource *resource;
+ struct wl_listener *destroy_listener = NULL;
resource = wl_resource_create(client, &tizen_keyrouter_interface, version, id);
{
KLERR("Failed to create resource ! (version :%d, id:%d)", version, id);
wl_client_post_no_memory(client);
- return;
+ return;
}
krt->resources = eina_list_append(krt->resources, resource);
wl_resource_set_implementation(resource, &_e_keyrouter_implementation, krt_instance, _e_keyrouter_cb_unbind);
+
+ destroy_listener = E_NEW(struct wl_listener, 1);
+ if (!destroy_listener)
+ {
+ KLERR("Failed to allocate memory for wl_client destroy listener !");
+ wl_resource_destroy(resource);
+ return;
+ }
+
+ destroy_listener->notify = _e_keyrouter_cb_wl_client_destroy;
+ wl_client_add_destroy_listener(client, destroy_listener);
}
static void
}
#endif
+ g_rec_mutex_init(&krt->resource_list_mutex);
+
return EINA_TRUE;
}
#ifdef HAVE_CYNARA
if (krt->p_cynara) cynara_finish(krt->p_cynara);
#endif
+
+ g_rec_mutex_clear(&krt->resource_list_mutex);
}