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 +1,14 @@
add_subdirectory(wayland)
include_directories(
${PROTOCOLS_INCLUDE_DIRS}
${WAYLAND_INCLUDE_DIR}
)
add_library(wlr-backend
wayland/backend.c
wayland/registry.c
)
target_link_libraries(wlr-backend
wlr-common
${WAYLAND_LIBRARIES}
)

View file

@ -1,13 +0,0 @@
include_directories(
${PROTOCOLS_INCLUDE_DIRS}
${WAYLAND_INCLUDE_DIR}
.
)
add_library(wlr-backend-wayland
backend.c
)
target_link_libraries(wlr-backend-wayland
${WAYLAND_LIBRARIES}
)

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;
}

View file

@ -0,0 +1,29 @@
#include <stdio.h>
#include <stdint.h>
#include <wayland-client.h>
#include "backend/wayland.h"
#include "common/log.h"
static void registry_global(void *data, struct wl_registry *registry,
uint32_t name, const char *interface, uint32_t version) {
//struct wlr_wl_backend *backend = data;
wlr_log(L_DEBUG, "Remote wayland global: %s v%d", interface, version);
// TODO
}
static void registry_global_remove(void *data,
struct wl_registry *registry, uint32_t name) {
// TODO
}
static const struct wl_registry_listener registry_listener = {
.global = registry_global,
.global_remove = registry_global_remove
};
void wlr_wlb_registry_poll(struct wlr_wl_backend *backend) {
wl_registry_add_listener(backend->remote_registry,
&registry_listener, backend->remote_registry);
wl_display_dispatch(backend->remote_display);
wl_display_roundtrip(backend->remote_display);
}