backend/session: add noop session

This is the first step towards being able to run via DRM leasing and on render
nodes.

Test with:

    export WLR_BACKENDS=drm
    export WLR_SESSION=noop
    export WLR_DRM_DEVICES=/dev/dri/renderD128
This commit is contained in:
emersion 2019-03-01 22:37:35 +01:00 committed by Drew DeVault
parent 755a1c9138
commit 8efeca528f
3 changed files with 66 additions and 13 deletions

View file

@ -23,6 +23,7 @@ backend_files = files(
'noop/backend.c', 'noop/backend.c',
'noop/output.c', 'noop/output.c',
'session/direct-ipc.c', 'session/direct-ipc.c',
'session/noop.c',
'session/session.c', 'session/session.c',
'wayland/backend.c', 'wayland/backend.c',
'wayland/output.c', 'wayland/output.c',

48
backend/session/noop.c Normal file
View file

@ -0,0 +1,48 @@
#define _POSIX_C_SOURCE 200809L
#include <fcntl.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>
#include <wayland-server.h>
#include <wlr/backend/session/interface.h>
#include <wlr/util/log.h>
#include "util/signal.h"
const struct session_impl session_noop;
static int noop_session_open(struct wlr_session *base, const char *path) {
return open(path, O_RDWR | O_CLOEXEC);
}
static void noop_session_close(struct wlr_session *base, int fd) {
close(fd);
}
static bool noop_change_vt(struct wlr_session *base, unsigned vt) {
return false;
}
static void noop_session_destroy(struct wlr_session *base) {
free(base);
}
static struct wlr_session *noop_session_create(struct wl_display *disp) {
struct wlr_session *session = calloc(1, sizeof(*session));
if (!session) {
wlr_log_errno(WLR_ERROR, "Allocation failed");
return NULL;
}
session->impl = &session_noop;
wlr_log(WLR_INFO, "Successfully initialized noop session");
return session;
}
const struct session_impl session_noop = {
.create = noop_session_create,
.destroy = noop_session_destroy,
.open = noop_session_open,
.close = noop_session_close,
.change_vt = noop_change_vt,
};

View file

@ -17,6 +17,7 @@
extern const struct session_impl session_logind; extern const struct session_impl session_logind;
extern const struct session_impl session_direct; extern const struct session_impl session_direct;
extern const struct session_impl session_noop;
static const struct session_impl *impls[] = { static const struct session_impl *impls[] = {
#if WLR_HAS_SYSTEMD || WLR_HAS_ELOGIND #if WLR_HAS_SYSTEMD || WLR_HAS_ELOGIND
@ -69,16 +70,20 @@ struct wlr_session *wlr_session_create(struct wl_display *disp) {
const char *env_wlr_session = getenv("WLR_SESSION"); const char *env_wlr_session = getenv("WLR_SESSION");
if (env_wlr_session) { if (env_wlr_session) {
if (!strcmp(env_wlr_session, "logind") || !strcmp(env_wlr_session, "systemd")) { if (strcmp(env_wlr_session, "logind") == 0 ||
#if WLR_HAS_SYSTEMD || WLR_HAS_ELOGIND strcmp(env_wlr_session, "systemd") == 0) {
#if WLR_HAS_SYSTEMD || WLR_HAS_ELOGIND
session = session_logind.create(disp); session = session_logind.create(disp);
#else #else
wlr_log(WLR_ERROR, "wlroots is not compiled with logind support"); wlr_log(WLR_ERROR, "wlroots is not compiled with logind support");
#endif #endif
} else if (!strcmp(env_wlr_session, "direct")) { } else if (strcmp(env_wlr_session, "direct") == 0) {
session = session_direct.create(disp); session = session_direct.create(disp);
} else if (strcmp(env_wlr_session, "noop") == 0) {
session = session_noop.create(disp);
} else { } else {
wlr_log(WLR_ERROR, "WLR_SESSION has an invalid value: %s", env_wlr_session); wlr_log(WLR_ERROR, "Unsupported WLR_SESSION: %s",
env_wlr_session);
} }
} else { } else {
const struct session_impl **iter; const struct session_impl **iter;
@ -220,24 +225,23 @@ bool wlr_session_change_vt(struct wlr_session *session, unsigned vt) {
/* Tests if 'path' is KMS compatible by trying to open it. /* Tests if 'path' is KMS compatible by trying to open it.
* It leaves the open device in *fd_out it it succeeds. * It leaves the open device in *fd_out it it succeeds.
*/ */
static int open_if_kms(struct wlr_session *restrict session, const char *restrict path) { static int open_if_kms(struct wlr_session *restrict session,
int fd; const char *restrict path) {
if (!path) { if (!path) {
return -1; return -1;
} }
fd = wlr_session_open_file(session, path); int fd = wlr_session_open_file(session, path);
if (fd < 0) { if (fd < 0) {
return -1; return -1;
} }
drmModeRes *res = drmModeGetResources(fd); drmVersion *ver = drmGetVersion(fd);
if (!res) { if (!ver) {
goto out_fd; goto out_fd;
} }
drmModeFreeResources(res); drmFreeVersion(ver);
return fd; return fd;
out_fd: out_fd: