From 904739c40596cb4e9e9d48c89b1d864051237441 Mon Sep 17 00:00:00 2001 From: nyorain Date: Mon, 19 Jun 2017 17:46:50 +0200 Subject: [PATCH] Start to fix wayland backend Starts to update the wayland backend to the new backend api. Not yet updated to libinput branch (not yet compiling). --- backend/CMakeLists.txt | 8 +-- backend/wayland/backend.c | 104 +++++++++++++++++++++------------- include/backend/wayland.h | 5 +- include/wlr/backend/wayland.h | 11 ++-- 4 files changed, 76 insertions(+), 52 deletions(-) diff --git a/backend/CMakeLists.txt b/backend/CMakeLists.txt index 91f0f06e..a5669307 100644 --- a/backend/CMakeLists.txt +++ b/backend/CMakeLists.txt @@ -5,10 +5,10 @@ include_directories( ) add_library(wlr-backend - #wayland/backend.c - #wayland/registry.c - #wayland/wl_seat.c - #wayland/wl_output.c + wayland/backend.c + wayland/registry.c + wayland/wl_seat.c + wayland/wl_output.c drm/backend.c drm/drm.c udev.c diff --git a/backend/wayland/backend.c b/backend/wayland/backend.c index 7f73c501..dec559f3 100644 --- a/backend/wayland/backend.c +++ b/backend/wayland/backend.c @@ -2,58 +2,84 @@ #include #include #include +#include #include "backend/wayland.h" #include "common/log.h" -void wlr_wl_backend_free(struct wlr_wl_backend *backend) { - if (!backend) { - return; - } - // TODO: Free surfaces - for (size_t i = 0; backend->outputs && i < backend->outputs->length; ++i) { - struct wlr_wl_output *output = backend->outputs->items[i]; - wlr_wl_output_free(output); - } - list_free(backend->outputs); - if (backend->seat) wlr_wl_seat_free(backend->seat); - if (backend->shm) wl_shm_destroy(backend->shm); - if (backend->shell) wl_shell_destroy(backend->shell); - if (backend->compositor) wl_compositor_destroy(backend->compositor); - if (backend->registry) wl_registry_destroy(backend->registry); - if (backend->remote_display) wl_display_disconnect(backend->remote_display); - free(backend); -} - /* * Initializes the wayland backend. Opens a connection to a remote wayland * compositor and creates surfaces for each output, then registers globals on * the specified display. */ -struct wlr_wl_backend *wlr_wl_backend_init( - struct wl_display *display, size_t outputs) { - assert(display); - struct wlr_wl_backend *backend; - if (!(backend = calloc(sizeof(struct wlr_wl_backend), 1))) { - wlr_log(L_ERROR, "Could not allocate backend"); - goto error; +static bool wlr_wl_backend_init(struct wlr_backend_state* state) { + state->remote_display = wl_display_connect(getenv("_WAYLAND_DISPLAY")); + if (!state->remote_display) { + wlr_log(L_ERROR, "Could not connect to remote display"); + return false; } - if (!(backend->outputs = list_create())) { + + if (!(state->registry = wl_display_get_registry(state->remote_display))) { + wlr_log(L_ERROR, "Could not obtain reference to remote registry"); + return false; + } + + wlr_wlb_registry_poll(state); + return true; +} + +static void wlr_wl_backend_destroy(struct wlr_backend_state *state) { + if (!state) { + return; + } + + // TODO: Free surfaces + for (size_t i = 0; state->outputs && i < state->outputs->length; ++i) { + struct wlr_wl_output *output = state->outputs->items[i]; + wlr_wl_output_free(output); + } + + list_free(state->outputs); + if (state->seat) wlr_wl_seat_free(state->seat); + if (state->shm) wl_shm_destroy(state->shm); + if (state->shell) wl_shell_destroy(state->shell); + if (state->compositor) wl_compositor_destroy(state->compositor); + if (state->registry) wl_registry_destroy(state->registry); + if (state->remote_display) wl_display_disconnect(state->remote_display); + free(state); +} + +static struct wlr_backend_impl backend_impl = { + .init = wlr_wl_backend_init, + .destroy = wlr_wl_backend_destroy +}; + + +struct wlr_backend *wlr_wl_backend_create(struct wl_display *display, + size_t outputs) { + wlr_log(L_INFO, "Initalizing wayland backend"); + + struct wlr_backend_state *state = calloc(1, sizeof(struct wlr_backend_state)); + if (!state) { + wlr_log(L_ERROR, "Allocation failed: %s", strerror(errno)); + return NULL; + } + + struct wlr_backend *backend = wlr_backend_create(&backend_impl, state); + if (!backend) { + wlr_log(L_ERROR, "Allocation failed: %s", strerror(errno)); + return NULL; + } + + if (!(state->outputs = list_create())) { wlr_log(L_ERROR, "Could not allocate output list"); goto error; } - backend->local_display = display; - backend->remote_display = wl_display_connect(getenv("_WAYLAND_DISPLAY")); - if (!backend->remote_display) { - wlr_log(L_ERROR, "Could not connect to remote display"); - goto error; - } - if (!(backend->registry = wl_display_get_registry(backend->remote_display))) { - wlr_log(L_ERROR, "Could not obtain reference to remote registry"); - goto error; - } - wlr_wlb_registry_poll(backend); + state->local_display = display; + return backend; + error: - wlr_wl_backend_free(backend); + free(state); + free(backend); return NULL; } diff --git a/include/backend/wayland.h b/include/backend/wayland.h index 94aa0962..b576e564 100644 --- a/include/backend/wayland.h +++ b/include/backend/wayland.h @@ -5,8 +5,9 @@ #include #include #include +#include -struct wlr_wl_backend { +struct wlr_backend_state { /* local state */ struct wl_display *local_display; /* remote state */ @@ -19,7 +20,7 @@ struct wlr_wl_backend { list_t *outputs; }; -void wlr_wlb_registry_poll(struct wlr_wl_backend *backend); +void wlr_wlb_registry_poll(struct wlr_backend_state *backend); extern const struct wl_seat_listener seat_listener; extern const struct wl_output_listener output_listener; diff --git a/include/wlr/backend/wayland.h b/include/wlr/backend/wayland.h index 4318cc26..83b465c1 100644 --- a/include/wlr/backend/wayland.h +++ b/include/wlr/backend/wayland.h @@ -1,14 +1,11 @@ -#ifndef _WLR_BACKEND_WAYLAND_INTERNAL_H -#define _WLR_BACKEND_WAYLAND_INTERNAL_H +#ifndef WLR_BACKEND_WAYLAND_H +#define WLR_BACKEND_WAYLAND_H #include #include -#include +#include -struct wlr_wl_backend; - -void wlr_wl_backend_free(struct wlr_wl_backend *backend); -struct wlr_wl_backend *wlr_wl_backend_init(struct wl_display *display, +struct wlr_backend *wlr_wl_backend_create(struct wl_display *display, size_t outputs); #endif