Eina_List *grab_surface_list;
Eina_List *grab_client_list;
+
+ GRecMutex resource_list_mutex;
};
EINTERN void
wc = wl_resource_get_client(surface);
EINA_SAFETY_ON_NULL_RETURN(wc);
+ g_rec_mutex_lock(&g_tizen_keyrouter->resource_list_mutex);
EINA_LIST_FOREACH(g_tizen_keyrouter->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(&g_tizen_keyrouter->resource_list_mutex);
}
static void
{
if (surface == data->surface)
{
+ g_rec_mutex_lock(&g_tizen_keyrouter->resource_list_mutex);
EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
{
if (wl_resource_get_client(resource) != wc) continue;
tizen_keyrouter_send_key_cancel(resource, key-8);
}
+ g_rec_mutex_unlock(&g_tizen_keyrouter->resource_list_mutex);
}
}
else if (client == data->wc)
{
+ g_rec_mutex_lock(&g_tizen_keyrouter->resource_list_mutex);
EINA_LIST_FOREACH(g_tizen_keyrouter->resources, l, resource)
{
if (wl_resource_get_client(resource) != wc) continue;
tizen_keyrouter_send_key_cancel(resource, key-8);
}
+ g_rec_mutex_unlock(&g_tizen_keyrouter->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(&g_tizen_keyrouter->resource_list_mutex);
g_tizen_keyrouter->resources = eina_list_remove(g_tizen_keyrouter->resources, resource);
+ g_rec_mutex_unlock(&g_tizen_keyrouter->resource_list_mutex);
+}
+
+static enum wl_iterator_result
+_e_keyrouter_get_resource(struct wl_resource *resource, void *data)
+{
+ g_rec_mutex_lock(&g_tizen_keyrouter->resource_list_mutex);
+ g_tizen_keyrouter->resources = eina_list_remove(g_tizen_keyrouter->resources, resource);
+ g_rec_mutex_unlock(&g_tizen_keyrouter->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_keyrouter_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
{
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;
}
g_tizen_keyrouter->resources = eina_list_append(g_tizen_keyrouter->resources, resource);
wl_resource_set_implementation(resource, &_e_keyrouter_implementation, NULL, _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
&tizen_keyrouter_interface, 2, NULL, _e_keyrouter_cb_bind);
EINA_SAFETY_ON_NULL_RETURN_VAL(g_tizen_keyrouter->global, NULL);
+ g_rec_mutex_init(&g_tizen_keyrouter->resource_list_mutex);
+
return g_tizen_keyrouter;
}
wl_global_destroy(g_tizen_keyrouter->global);
+ g_rec_mutex_clear(&g_tizen_keyrouter->resource_list_mutex);
+
E_FREE(g_tizen_keyrouter);
}