aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authornyorain <nyorain@gmail.com>2017-06-19 17:46:50 +0200
committernyorain <nyorain@gmail.com>2017-06-19 17:46:50 +0200
commit904739c40596cb4e9e9d48c89b1d864051237441 (patch)
tree1b19731e758a4b0470f5a232ba939ea3ecccff0c /backend
parent325a331425c1771d16fa90d099fa33f3ab8772f3 (diff)
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).
Diffstat (limited to 'backend')
-rw-r--r--backend/CMakeLists.txt8
-rw-r--r--backend/wayland/backend.c100
2 files changed, 67 insertions, 41 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 <stdint.h>
#include <wayland-server.h>
#include <assert.h>
+#include <wlr/backend/interface.h>
#include "backend/wayland.h"
#include "common/log.h"
-void wlr_wl_backend_free(struct wlr_wl_backend *backend) {
- if (!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.
+ */
+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 (!(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; backend->outputs && i < backend->outputs->length; ++i) {
- struct wlr_wl_output *output = backend->outputs->items[i];
+ 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(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);
+
+ 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);
}
-/*
- * 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;
- }
- if (!(backend->outputs = list_create())) {
- wlr_log(L_ERROR, "Could not allocate output list");
- goto error;
+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;
}
- 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;
+
+ struct wlr_backend *backend = wlr_backend_create(&backend_impl, state);
+ if (!backend) {
+ wlr_log(L_ERROR, "Allocation failed: %s", strerror(errno));
+ return NULL;
}
- if (!(backend->registry = wl_display_get_registry(backend->remote_display))) {
- wlr_log(L_ERROR, "Could not obtain reference to remote registry");
+
+ if (!(state->outputs = list_create())) {
+ wlr_log(L_ERROR, "Could not allocate output list");
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;
}