mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-25 05:05:59 +01:00
add systemd support (#1253)
* add systemd support motivation for this is is proper ordering of related/bound/required services to Hyprland (e.g. swaybg) that would need to have a compositor ready. this could possibly be a build-time option of course. see also: example/ files for example of services Signed-off-by: Paymon MARANDI <darwinskernel@gmail.com> * nix: add withSystemd flag Signed-off-by: Paymon MARANDI <darwinskernel@gmail.com> Co-authored-by: Mihai Fufezan <fufexan@protonmail.com> Co-authored-by: Vaxerski <vaxry@vaxry.net>
This commit is contained in:
parent
96198dae55
commit
0d14fd9136
10 changed files with 78 additions and 3 deletions
|
@ -74,6 +74,19 @@ ELSE()
|
||||||
target_link_libraries(Hyprland xcb)
|
target_link_libraries(Hyprland xcb)
|
||||||
ENDIF(NO_XWAYLAND MATCHES true)
|
ENDIF(NO_XWAYLAND MATCHES true)
|
||||||
|
|
||||||
|
IF(NO_SYSTEMD MATCHES true)
|
||||||
|
message(STATUS "SYSTEMD support is disabled...")
|
||||||
|
ELSE()
|
||||||
|
message(STATUS "SYSTEMD support is requested (NO_SYSTEMD not defined) checking deps...")
|
||||||
|
pkg_check_modules(LIBSYSTEMD libsystemd)
|
||||||
|
IF(LIBSYSTEMD_FOUND)
|
||||||
|
add_definitions( -DUSES_SYSTEMD )
|
||||||
|
target_link_libraries(Hyprland "${LIBSYSTEMD_LIBRARIES}")
|
||||||
|
ELSE()
|
||||||
|
message(WARNING "Systemd support requested but libsystemd was not found")
|
||||||
|
ENDIF(LIBSYSTEMD_FOUND)
|
||||||
|
ENDIF(NO_SYSTEMD MATCHES true)
|
||||||
|
|
||||||
target_compile_definitions(Hyprland PRIVATE "-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
target_compile_definitions(Hyprland PRIVATE "-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
||||||
target_compile_definitions(Hyprland PRIVATE "-DGIT_BRANCH=\"${GIT_BRANCH}\"")
|
target_compile_definitions(Hyprland PRIVATE "-DGIT_BRANCH=\"${GIT_BRANCH}\"")
|
||||||
target_compile_definitions(Hyprland PRIVATE "-DGIT_COMMIT_MESSAGE=\"${GIT_COMMIT_MESSAGE}\"")
|
target_compile_definitions(Hyprland PRIVATE "-DGIT_COMMIT_MESSAGE=\"${GIT_COMMIT_MESSAGE}\"")
|
||||||
|
|
12
example/hyprland.service
Normal file
12
example/hyprland.service
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
; a primitive systemd --user example
|
||||||
|
[Unit]
|
||||||
|
Description = %p
|
||||||
|
BindsTo = graphical-session.target
|
||||||
|
Upholds = swaybg@333333.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type = notify
|
||||||
|
ExecStart = /usr/bin/Hyprland
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy = default.target
|
13
example/swaybg@.service
Normal file
13
example/swaybg@.service
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
; a primitive systemd --user example
|
||||||
|
; see example/hyprland.service for more details
|
||||||
|
[Unit]
|
||||||
|
Description = %p
|
||||||
|
BindsTo = hyprland.service
|
||||||
|
Wants = hyprland.service
|
||||||
|
After = hyprland.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart = /usr/bin/swaybg --color #%i
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy = default.target
|
10
meson.build
10
meson.build
|
@ -50,6 +50,16 @@ if not have_xwayland
|
||||||
add_project_arguments('-DNO_XWAYLAND', language: 'cpp')
|
add_project_arguments('-DNO_XWAYLAND', language: 'cpp')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
systemd_dep = dependency('libsystemd', required: get_option('systemd'))
|
||||||
|
|
||||||
|
if get_option('systemd').enabled()
|
||||||
|
if systemd_dep.found()
|
||||||
|
add_project_arguments('-DUSES_SYSTEMD', language: 'cpp')
|
||||||
|
else
|
||||||
|
error('Cannot enable systemd in Hyprland: libsystemd was not found')
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
if get_option('buildtype') == 'debug'
|
if get_option('buildtype') == 'debug'
|
||||||
add_project_arguments('-DHYPRLAND_DEBUG', language: 'cpp')
|
add_project_arguments('-DHYPRLAND_DEBUG', language: 'cpp')
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
option('xwayland', type: 'feature', value: 'auto', description: 'Enable support for X11 applications')
|
option('xwayland', type: 'feature', value: 'auto', description: 'Enable support for X11 applications')
|
||||||
|
option('systemd', type: 'feature', value: 'auto', description: 'Enable systemd integration')
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
mesa,
|
mesa,
|
||||||
mount,
|
mount,
|
||||||
pciutils,
|
pciutils,
|
||||||
|
systemd,
|
||||||
wayland,
|
wayland,
|
||||||
wayland-protocols,
|
wayland-protocols,
|
||||||
wayland-scanner,
|
wayland-scanner,
|
||||||
|
@ -27,6 +28,7 @@
|
||||||
hidpiXWayland ? true,
|
hidpiXWayland ? true,
|
||||||
legacyRenderer ? false,
|
legacyRenderer ? false,
|
||||||
nvidiaPatches ? false,
|
nvidiaPatches ? false,
|
||||||
|
withSystemd ? true,
|
||||||
version ? "git",
|
version ? "git",
|
||||||
}: let
|
}: let
|
||||||
assertXWayland = lib.assertMsg (hidpiXWayland -> enableXWayland) ''
|
assertXWayland = lib.assertMsg (hidpiXWayland -> enableXWayland) ''
|
||||||
|
@ -73,7 +75,8 @@ in
|
||||||
pciutils
|
pciutils
|
||||||
(wlroots.override {inherit enableXWayland hidpiXWayland nvidiaPatches;})
|
(wlroots.override {inherit enableXWayland hidpiXWayland nvidiaPatches;})
|
||||||
]
|
]
|
||||||
++ lib.optionals enableXWayland [libxcb xcbutilwm xwayland];
|
++ lib.optionals enableXWayland [libxcb xcbutilwm xwayland]
|
||||||
|
++ lib.optionals withSystemd [systemd];
|
||||||
|
|
||||||
mesonBuildType =
|
mesonBuildType =
|
||||||
if debug
|
if debug
|
||||||
|
@ -83,6 +86,7 @@ in
|
||||||
mesonFlags = builtins.concatLists [
|
mesonFlags = builtins.concatLists [
|
||||||
(lib.optional (!enableXWayland) "-Dxwayland=disabled")
|
(lib.optional (!enableXWayland) "-Dxwayland=disabled")
|
||||||
(lib.optional legacyRenderer "-DLEGACY_RENDERER:STRING=true")
|
(lib.optional legacyRenderer "-DLEGACY_RENDERER:STRING=true")
|
||||||
|
(lib.optional withSystemd "-Dsystemd=enabled")
|
||||||
];
|
];
|
||||||
|
|
||||||
patches = [
|
patches = [
|
||||||
|
@ -90,8 +94,8 @@ in
|
||||||
./meson-build.patch
|
./meson-build.patch
|
||||||
];
|
];
|
||||||
|
|
||||||
# Fix hardcoded paths to /usr installation
|
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
|
# Fix hardcoded paths to /usr installation
|
||||||
sed -i "s#/usr#$out#" src/render/OpenGL.cpp
|
sed -i "s#/usr#$out#" src/render/OpenGL.cpp
|
||||||
|
|
||||||
# for some reason rmdir doesn't work in a dirty tree
|
# for some reason rmdir doesn't work in a dirty tree
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
#include "helpers/Splashes.hpp"
|
#include "helpers/Splashes.hpp"
|
||||||
#include <random>
|
#include <random>
|
||||||
#include "debug/HyprCtl.hpp"
|
#include "debug/HyprCtl.hpp"
|
||||||
|
#ifdef USES_SYSTEMD
|
||||||
|
#include <systemd/sd-daemon.h> // for sd_notify
|
||||||
|
#endif
|
||||||
|
|
||||||
int handleCritSignal(int signo, void* data) {
|
int handleCritSignal(int signo, void* data) {
|
||||||
Debug::log(LOG, "Hyprland received signal %d", signo);
|
Debug::log(LOG, "Hyprland received signal %d", signo);
|
||||||
|
@ -384,6 +387,15 @@ void CCompositor::startCompositor() {
|
||||||
|
|
||||||
wlr_xcursor_manager_set_cursor_image(m_sWLRXCursorMgr, "left_ptr", m_sWLRCursor);
|
wlr_xcursor_manager_set_cursor_image(m_sWLRXCursorMgr, "left_ptr", m_sWLRCursor);
|
||||||
|
|
||||||
|
#ifdef USES_SYSTEMD
|
||||||
|
if (sd_booted() > 0)
|
||||||
|
// tell systemd that we are ready so it can start other bond, following, related units
|
||||||
|
sd_notify(0, "READY=1");
|
||||||
|
else
|
||||||
|
Debug::log(LOG, "systemd integration is baked in but system itself is not booted à la systemd!");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// This blocks until we are done.
|
// This blocks until we are done.
|
||||||
Debug::log(LOG, "Hyprland is ready, running the event loop!");
|
Debug::log(LOG, "Hyprland is ready, running the event loop!");
|
||||||
wl_display_run(m_sWLDisplay);
|
wl_display_run(m_sWLDisplay);
|
||||||
|
|
|
@ -4,6 +4,9 @@
|
||||||
#include "config/ConfigManager.hpp"
|
#include "config/ConfigManager.hpp"
|
||||||
#include "init/initHelpers.hpp"
|
#include "init/initHelpers.hpp"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#ifdef USES_SYSTEMD
|
||||||
|
#include <systemd/sd-daemon.h> // for sd_notify
|
||||||
|
#endif
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
|
||||||
|
@ -66,6 +69,12 @@ int main(int argc, char** argv) {
|
||||||
// If we are here it means we got yote.
|
// If we are here it means we got yote.
|
||||||
Debug::log(LOG, "Hyprland reached the end.");
|
Debug::log(LOG, "Hyprland reached the end.");
|
||||||
|
|
||||||
|
#ifdef USES_SYSTEMD
|
||||||
|
// tell systemd it destroy bound/related units
|
||||||
|
if (sd_booted() > 0)
|
||||||
|
sd_notify(0, "STOPPING=1");
|
||||||
|
#endif
|
||||||
|
|
||||||
wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
|
wl_display_destroy_clients(g_pCompositor->m_sWLDisplay);
|
||||||
|
|
||||||
// kill all clients
|
// kill all clients
|
||||||
|
|
|
@ -14,6 +14,7 @@ executable('Hyprland', src,
|
||||||
dependency('xkbcommon'),
|
dependency('xkbcommon'),
|
||||||
dependency('libinput'),
|
dependency('libinput'),
|
||||||
xcb_dep,
|
xcb_dep,
|
||||||
|
systemd_dep,
|
||||||
|
|
||||||
dependency('pixman-1'),
|
dependency('pixman-1'),
|
||||||
dependency('gl', 'opengl'),
|
dependency('gl', 'opengl'),
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit b28a9afd4b0b86e9a66a40f6b44b69f59947b7d6
|
Subproject commit dc7cc98cf21a8dc19ab8895505500e3700646af0
|
Loading…
Reference in a new issue