source->ev_filter_list = NULL;
source->data = NULL;
+ g_rec_mutex_init(&source->ev_handler_mutex);
+ g_rec_mutex_init(&source->ev_filter_mutex);
+
return source;
}
g_queue_free(source->ev_queue);
g_source_destroy(&source->gsource);
g_source_unref(&source->gsource);
+
+ g_rec_mutex_clear(&source->ev_handler_mutex);
+ g_rec_mutex_clear(&source->ev_filter_mutex);
}
E_API E_Input_Event_Handler *
eh->func = func;
eh->user_data = user_data;
+ g_rec_mutex_lock(&source->ev_handler_mutex);
source->ev_handler_list = g_list_append(source->ev_handler_list, eh);
+ g_rec_mutex_unlock(&source->ev_handler_mutex);
return eh;
}
eh->func = func;
eh->user_data = user_data;
+ g_rec_mutex_lock(&source->ev_handler_mutex);
source->ev_handler_list = g_list_prepend(source->ev_handler_list, eh);
+ g_rec_mutex_unlock(&source->ev_handler_mutex);
return eh;
}
{
if (!source) return;
+ g_rec_mutex_lock(&source->ev_handler_mutex);
source->ev_handler_list = g_list_remove(source->ev_handler_list, event_handler);
free(event_handler);
+ g_rec_mutex_unlock(&source->ev_handler_mutex);
}
E_API E_Input_Event_Filter *
ef->func = func;
ef->user_data = user_data;
+ g_rec_mutex_lock(&source->ev_filter_mutex);
source->ev_filter_list = g_list_append(source->ev_filter_list, ef);
+ g_rec_mutex_unlock(&source->ev_filter_mutex);
return ef;
}
E_API void
e_input_event_filter_del(E_Input_Event_Source *source, E_Input_Event_Filter *event_filter)
{
- if (source)
- source->ev_filter_list = g_list_remove(source->ev_filter_list, event_filter);
+ if (!source) return;
+ g_rec_mutex_lock(&source->ev_filter_mutex);
+ source->ev_filter_list = g_list_remove(source->ev_filter_list, event_filter);
free(event_filter);
+ g_rec_mutex_unlock(&source->ev_filter_mutex);
}
static gboolean
if (!ev_source || !ev) return TRUE;
+ g_rec_mutex_lock(&ev_source->ev_filter_mutex);
l = ev_source->ev_filter_list;
while (l)
{
if (ef->func)
{
if (ef->func(ef->user_data, ef->event, ev->ev_data) == FALSE)
- return FALSE;
+ {
+ g_rec_mutex_unlock(&ev_source->ev_filter_mutex);
+ return FALSE;
+ }
}
}
l = g_list_next(l);
}
+ g_rec_mutex_unlock(&ev_source->ev_filter_mutex);
return TRUE;
}
if (!ev_source || !ev) return TRUE;
+ g_rec_mutex_lock(&ev_source->ev_handler_mutex);
l = ev_source->ev_handler_list;
while (l)
{
if (eh->func)
{
if (eh->func(eh->user_data, eh->event, ev->ev_data) == FALSE)
- return FALSE;
+ {
+ g_rec_mutex_unlock(&ev_source->ev_handler_mutex);
+ return FALSE;
+ }
}
}
l = g_list_next(l);
}
+ g_rec_mutex_unlock(&ev_source->ev_handler_mutex);
return TRUE;
}