#include "config.h"
#endif
-#include "tdm.h"
#include "tdm_private.h"
-#include "tdm_list.h"
-
-#include <wayland-server-core.h>
typedef struct _tdm_event_loop_source_base {
struct wl_event_source *wl_source;
static tdm_error
_tdm_event_loop_main_fd_handler(int fd, tdm_event_loop_mask mask, void *user_data)
{
- tdm_private_display *private_display = (tdm_private_display*)user_data;
- tdm_private_loop *private_loop;
+ tdm_private_module *private_module = (tdm_private_module*)user_data;
tdm_func_display *func_display;
tdm_error ret;
TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
- TDM_RETURN_VAL_IF_FAIL(private_display != NULL, TDM_ERROR_OPERATION_FAILED);
- TDM_RETURN_VAL_IF_FAIL(private_display->private_loop != NULL, TDM_ERROR_OPERATION_FAILED);
-
- private_loop = private_display->private_loop;
+ TDM_RETURN_VAL_IF_FAIL(private_module != NULL, TDM_ERROR_OPERATION_FAILED);
- if (tdm_debug_module & TDM_DEBUG_THREAD)
- TDM_INFO("backend fd(%d) event happens", private_loop->backend_fd);
+ if (tdm_debug_module & TDM_DEBUG_EVENT)
+ TDM_INFO("backend fd(%d) event happens", private_module->fd);
- func_display = &private_display->func_display;
+ func_display = &private_module->func_display;
if (!func_display->display_handle_events)
return TDM_ERROR_NONE;
- ret = func_display->display_handle_events(private_display->bdata);
+ ret = func_display->display_handle_events(private_module->bdata);
return ret;
}
return TDM_ERROR_OUT_OF_MEMORY;
}
- private_loop->backend_fd = -1;
-
private_loop->wl_display = wl_display_create();
if (!private_loop->wl_display) {
TDM_ERR("creating a wayland display failed");
INTERN void
tdm_event_loop_deinit(tdm_private_display *private_display)
{
+ tdm_private_module *private_module = NULL;
+
TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
if (!private_display->private_loop)
tdm_server_deinit(private_display->private_loop);
- if (private_display->private_loop->backend_source)
- tdm_event_loop_source_remove(private_display->private_loop->backend_source);
+ LIST_FOR_EACH_ENTRY(private_module, &private_display->module_list, link) {
+ if (private_module->event_source)
+ tdm_event_loop_source_remove(private_module->event_source);
+ private_module->event_source = NULL;
+ private_module->fd = -1;
+ }
if (private_display->private_loop->wl_display)
wl_display_destroy(private_display->private_loop->wl_display);
tdm_event_loop_create_backend_source(tdm_private_display *private_display)
{
tdm_private_loop *private_loop = private_display->private_loop;
- tdm_func_display *func_display;
+ tdm_private_module *private_module = NULL;
tdm_error ret;
int fd = -1;
TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
TDM_RETURN_IF_FAIL(private_loop != NULL);
- func_display = &private_display->func_display;
- if (!func_display->display_get_fd) {
- TDM_INFO("TDM backend module won't offer a display fd");
- return;
- }
+ LIST_FOR_EACH_ENTRY(private_module, &private_display->module_list, link) {
+ tdm_func_display *func_display = &private_module->func_display;
- ret = func_display->display_get_fd(private_display->bdata, &fd);
- if (fd < 0) {
- TDM_ERR("TDM backend module returns fd(%d)", fd);
- return;
- }
+ if (!func_display->display_get_fd) {
+ TDM_INFO("TDM backend module won't offer a display fd");
+ private_module->event_source = NULL;
+ private_module->fd = -1;
+ continue;
+ }
- if (!func_display->display_handle_events) {
- TDM_ERR("no display_handle_events function");
- return;
- }
+ ret = func_display->display_get_fd(private_module->bdata, &fd);
- private_loop->backend_source =
- tdm_event_loop_add_fd_handler(private_display, fd,
- TDM_EVENT_LOOP_READABLE,
- _tdm_event_loop_main_fd_handler,
- private_display, &ret);
- if (!private_loop->backend_source) {
- TDM_ERR("no backend fd(%d) source", fd);
- return;
- }
+ assert(ret == TDM_ERROR_NONE && fd >= 0);
+ assert(func_display->display_handle_events);
- private_loop->backend_fd = fd;
+ private_module->event_source =
+ tdm_event_loop_add_fd_handler(private_display, fd,
+ TDM_EVENT_LOOP_READABLE,
+ _tdm_event_loop_main_fd_handler,
+ private_module, &ret);
+ if (!private_module->event_source) {
+ TDM_ERR("no backend fd(%d) source", fd);
+ return;
+ }
- TDM_INFO("backend fd(%d) source created", private_loop->backend_fd);
+ private_module->fd = fd;
+
+ TDM_INFO("backend fd(%d) source created", private_module->fd);
+ }
}
INTERN int
TDM_RETURN_VAL_IF_FAIL(private_loop->wl_loop != NULL, TDM_ERROR_OPERATION_FAILED);
- if (tdm_debug_module & TDM_DEBUG_THREAD)
+ if (tdm_debug_module & TDM_DEBUG_EVENT)
TDM_INFO("dispatch");
if (tdm_thread_is_running() &&
free(source);
}
+/* LCOV_EXCL_START */
static void
_trace_cb_client_destroy(struct wl_listener *listener, void *data)
{
return TDM_ERROR_NONE;
}
+/* LCOV_EXCL_STOP */