diff --git a/README.md b/README.md index 60ec180c..b75987c7 100644 --- a/README.md +++ b/README.md @@ -48,9 +48,9 @@ Install dependencies: * GBM (optional, for the GBM allocator) * libinput (optional, for the libinput backend) * xkbcommon -* udev +* udev (optional, for the session) * pixman -* [libseat] +* [libseat] (optional, for the session) * [hwdata] (optional, for the DRM backend) If you choose to enable X11 support: diff --git a/backend/backend.c b/backend/backend.c index de25f347..a0ed834b 100644 --- a/backend/backend.c +++ b/backend/backend.c @@ -9,7 +9,6 @@ #include #include #include -#include #include #include #include @@ -20,6 +19,10 @@ #include "util/env.h" #include "util/time.h" +#if WLR_HAS_SESSION +#include +#endif + #if WLR_HAS_DRM_BACKEND #include #include "backend/drm/monitor.h" @@ -67,6 +70,7 @@ void wlr_backend_destroy(struct wlr_backend *backend) { } } +#if WLR_HAS_SESSION static struct wlr_session *session_create_and_wait(struct wl_display *disp) { struct wlr_session *session = wlr_session_create(disp); @@ -106,6 +110,7 @@ static struct wlr_session *session_create_and_wait(struct wl_display *disp) { return session; } +#endif clockid_t wlr_backend_get_presentation_clock(struct wlr_backend *backend) { if (backend->impl->get_presentation_clock) { @@ -247,7 +252,9 @@ static bool attempt_backend_by_name(struct wl_display *display, } else if (strcmp(name, "drm") == 0 || strcmp(name, "libinput") == 0) { // DRM and libinput need a session if (*session_ptr == NULL) { +#if WLR_HAS_SESSION *session_ptr = session_create_and_wait(display); +#endif if (*session_ptr == NULL) { wlr_log(WLR_ERROR, "failed to start a session"); return false; @@ -343,7 +350,9 @@ struct wlr_backend *wlr_backend_autocreate(struct wl_display *display, #endif // Attempt DRM+libinput +#if WLR_HAS_SESSION session = session_create_and_wait(display); +#endif if (!session) { wlr_log(WLR_ERROR, "Failed to start a DRM session"); goto error; @@ -388,6 +397,8 @@ success: error: wlr_backend_destroy(multi); +#if WLR_HAS_SESSION wlr_session_destroy(session); +#endif return NULL; } diff --git a/backend/drm/meson.build b/backend/drm/meson.build index 7bde50c2..fc4d84d6 100644 --- a/backend/drm/meson.build +++ b/backend/drm/meson.build @@ -1,3 +1,7 @@ +if not features['session'] + subdir_done() +endif + hwdata = dependency('hwdata', required: false, native: true) if hwdata.found() hwdata_dir = hwdata.get_variable(pkgconfig: 'pkgdatadir') diff --git a/backend/libinput/meson.build b/backend/libinput/meson.build index 2f3ccab3..181eb04b 100644 --- a/backend/libinput/meson.build +++ b/backend/libinput/meson.build @@ -10,7 +10,7 @@ libinput = dependency( not_found_message: '\n'.join(msg), ) -if not libinput.found() +if not (libinput.found() and features['session']) subdir_done() endif diff --git a/backend/meson.build b/backend/meson.build index b5b6f7a6..ed977d3b 100644 --- a/backend/meson.build +++ b/backend/meson.build @@ -1,6 +1,3 @@ -udev = dependency('libudev') -wlr_deps += udev - wlr_files += files('backend.c') all_backends = ['drm', 'libinput', 'x11'] @@ -11,6 +8,16 @@ elif 'auto' in backends and get_option('auto_features').disabled() backends = [] endif +session_required = 'drm' in backends or 'libinput' in backends or get_option('session').enabled() +if get_option('session').disabled() + if session_required + error('Session support is required for the DRM or libinput backends') + endif + session_required = disabler() +endif + +subdir('session') + foreach backend : all_backends if backend in backends or 'auto' in backends subdir(backend) @@ -20,5 +27,3 @@ endforeach subdir('multi') subdir('wayland') subdir('headless') - -subdir('session') diff --git a/backend/session/meson.build b/backend/session/meson.build index 9e35ef1e..4c20ee9d 100644 --- a/backend/session/meson.build +++ b/backend/session/meson.build @@ -1,8 +1,17 @@ +msg = 'Required for session support.' +udev = dependency('libudev', required: session_required, not_found_message: msg) libseat = dependency( 'libseat', version: '>=0.2.0', fallback: 'seatd', default_options: ['server=disabled', 'man-pages=disabled', 'examples=disabled'], + required: session_required, + not_found_message: msg, ) +if not (udev.found() and libseat.found()) + subdir_done() +endif + wlr_files += files('session.c') -wlr_deps += libseat +wlr_deps += [udev, libseat] +features += { 'session': true } diff --git a/include/meson.build b/include/meson.build index 3aa5955e..69a6d0e0 100644 --- a/include/meson.build +++ b/include/meson.build @@ -21,6 +21,9 @@ endif if not features.get('vulkan-renderer') exclude_files += 'render/vulkan.h' endif +if not features.get('session') + exclude_files += 'backend/session.h' +endif install_subdir('wlr', install_dir: get_option('includedir'), diff --git a/include/wlr/config.h.in b/include/wlr/config.h.in index 0b612271..6a53d217 100644 --- a/include/wlr/config.h.in +++ b/include/wlr/config.h.in @@ -12,4 +12,6 @@ #mesondefine WLR_HAS_XWAYLAND +#mesondefine WLR_HAS_SESSION + #endif diff --git a/meson.build b/meson.build index a7a69e12..fc3f88af 100644 --- a/meson.build +++ b/meson.build @@ -93,6 +93,7 @@ features = { 'gles2-renderer': false, 'vulkan-renderer': false, 'gbm-allocator': false, + 'session': false, } internal_features = { 'xcb-errors': false, diff --git a/meson_options.txt b/meson_options.txt index 1a439a4d..6977643c 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -6,3 +6,4 @@ option('renderers', type: 'array', choices: ['auto', 'gles2', 'vulkan'], value: option('backends', type: 'array', choices: ['auto', 'drm', 'libinput', 'x11'], value: ['auto'], description: 'Select built-in backends') option('allocators', type: 'array', choices: ['auto', 'gbm'], value: ['auto'], description: 'Select built-in allocators') +option('session', type: 'feature', value: 'auto', description: 'Enable session support')