aboutsummaryrefslogtreecommitdiff
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
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).
-rw-r--r--backend/CMakeLists.txt8
-rw-r--r--backend/wayland/backend.c100
-rw-r--r--include/backend/wayland.h5
-rw-r--r--include/wlr/backend/wayland.h11
4 files changed, 74 insertions, 50 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;
}
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 <wayland-server.h>
#include <wlr/common/list.h>
#include <wlr/wayland.h>
+#include <wlr/backend/wayland.h>
-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 <wayland-client.h>
#include <wayland-server.h>
-#include <wlr/wayland.h>
+#include <wlr/backend.h>
-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