Flesh out wayland backend somewhat, add example

This commit is contained in:
Drew DeVault 2017-04-25 15:06:58 -04:00
parent 52e6ed54cb
commit de01e654ce
17 changed files with 447 additions and 24 deletions

View file

@ -1,13 +1,49 @@
#include <stdlib.h>
#include <stdint.h>
#include <wayland-server.h>
#include <assert.h>
#include "backend/wayland.h"
#include "common/log.h"
struct wlr_wayland_backend *wayland_backend_init(struct wl_display *display,
size_t outputs) {
struct wlr_wayland_backend *backend = calloc(
sizeof(struct wlr_wayland_backend), 1);
backend->local_display = display;
// TODO: obtain reference to remote display
return backend;
void wlr_wl_backend_free(struct wlr_wl_backend *backend) {
if (!backend) {
return;
}
// TODO: free more shit
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;
}
if (!(backend->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->remote_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);
return backend;
error:
wlr_wl_backend_free(backend);
return NULL;
}