nixos/xsession: use graphical systemd user target
While systemd suggests using the pre-defined graphical-session user target, I found that this interface is difficult to use. Additionally, no other major distribution, even in their unstable versions, currently use this mechanism. The window or desktop manager is supposed to run in a systemd user service which activates graphical-session.target and the user services that are binding to this target. The issue is that we can't elegantly pass the xsession environment to the window manager session, in particular whereas the PassEnvironment option does work for DISPLAY, it for some mysterious reason won't for PATH. This commit implements a new graphical user target that works just like default.target. Services which should be run in a graphical session just need to declare wantedBy graphical.target. The graphical target will be activated in the xsession before executing the window or display manager. Fixes #17858.
This commit is contained in:
parent
13f2f8673b
commit
1e95e114e5
@ -240,11 +240,14 @@ in {
|
|||||||
};
|
};
|
||||||
systemd.user = {
|
systemd.user = {
|
||||||
services.pulseaudio = {
|
services.pulseaudio = {
|
||||||
|
restartIfChanged = true;
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
RestartSec = "500ms";
|
RestartSec = "500ms";
|
||||||
|
PassEnvironment = "DISPLAY";
|
||||||
};
|
};
|
||||||
environment = { DISPLAY = ":${toString config.services.xserver.display}"; };
|
};
|
||||||
restartIfChanged = true;
|
sockets.pulseaudio = {
|
||||||
|
wantedBy = [ "sockets.target" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
@ -199,9 +199,8 @@ in
|
|||||||
environment.etc."ssh/ssh_known_hosts".text = knownHostsText;
|
environment.etc."ssh/ssh_known_hosts".text = knownHostsText;
|
||||||
|
|
||||||
# FIXME: this should really be socket-activated for über-awesomeness.
|
# FIXME: this should really be socket-activated for über-awesomeness.
|
||||||
systemd.user.services.ssh-agent =
|
systemd.user.services.ssh-agent = mkIf cfg.startAgent
|
||||||
{ enable = cfg.startAgent;
|
{ description = "SSH Agent";
|
||||||
description = "SSH Agent";
|
|
||||||
wantedBy = [ "default.target" ];
|
wantedBy = [ "default.target" ];
|
||||||
serviceConfig =
|
serviceConfig =
|
||||||
{ ExecStartPre = "${pkgs.coreutils}/bin/rm -f %t/ssh-agent";
|
{ ExecStartPre = "${pkgs.coreutils}/bin/rm -f %t/ssh-agent";
|
||||||
|
@ -48,7 +48,8 @@ in {
|
|||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
systemd.user.services.arbtt = {
|
systemd.user.services.arbtt = {
|
||||||
description = "arbtt statistics capture service";
|
description = "arbtt statistics capture service";
|
||||||
wantedBy = [ "default.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
partOf = [ "graphical-session.target" ];
|
||||||
|
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "simple";
|
Type = "simple";
|
||||||
|
@ -208,13 +208,13 @@ in {
|
|||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
systemd.user.services.compton = {
|
systemd.user.services.compton = {
|
||||||
description = "Compton composite manager";
|
description = "Compton composite manager";
|
||||||
wantedBy = [ "default.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
partOf = [ "graphical-session.target" ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${cfg.package}/bin/compton --config ${configFile}";
|
ExecStart = "${cfg.package}/bin/compton --config ${configFile}";
|
||||||
RestartSec = 3;
|
RestartSec = 3;
|
||||||
Restart = "always";
|
Restart = "always";
|
||||||
};
|
};
|
||||||
environment.DISPLAY = ":0";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.systemPackages = [ cfg.package ];
|
environment.systemPackages = [ cfg.package ];
|
||||||
|
@ -122,6 +122,9 @@ let
|
|||||||
source ~/.xprofile
|
source ~/.xprofile
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Start systemd user services for graphical sessions
|
||||||
|
${config.systemd.package}/bin/systemctl --user start graphical-session.target
|
||||||
|
|
||||||
# Allow the user to setup a custom session type.
|
# Allow the user to setup a custom session type.
|
||||||
if test -x ~/.xsession; then
|
if test -x ~/.xsession; then
|
||||||
exec ~/.xsession
|
exec ~/.xsession
|
||||||
@ -164,6 +167,9 @@ let
|
|||||||
''}
|
''}
|
||||||
|
|
||||||
test -n "$waitPID" && wait "$waitPID"
|
test -n "$waitPID" && wait "$waitPID"
|
||||||
|
|
||||||
|
${config.systemd.package}/bin/systemctl --user stop graphical-session.target
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
'';
|
'';
|
||||||
|
|
||||||
@ -325,6 +331,13 @@ in
|
|||||||
|
|
||||||
config = {
|
config = {
|
||||||
services.xserver.displayManager.xserverBin = "${xorg.xorgserver.out}/bin/X";
|
services.xserver.displayManager.xserverBin = "${xorg.xorgserver.out}/bin/X";
|
||||||
|
|
||||||
|
systemd.user.targets.graphical-session = {
|
||||||
|
unitConfig = {
|
||||||
|
RefuseManualStart = false;
|
||||||
|
StopWhenUnneeded = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
|
@ -95,7 +95,8 @@ in {
|
|||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
systemd.user.services.redshift = {
|
systemd.user.services.redshift = {
|
||||||
description = "Redshift colour temperature adjuster";
|
description = "Redshift colour temperature adjuster";
|
||||||
wantedBy = [ "default.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
partOf = [ "graphical-session.target" ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = ''
|
ExecStart = ''
|
||||||
${cfg.package}/bin/redshift \
|
${cfg.package}/bin/redshift \
|
||||||
@ -107,12 +108,6 @@ in {
|
|||||||
RestartSec = 3;
|
RestartSec = 3;
|
||||||
Restart = "always";
|
Restart = "always";
|
||||||
};
|
};
|
||||||
environment = {
|
|
||||||
DISPLAY = ":${toString (
|
|
||||||
let display = config.services.xserver.display;
|
|
||||||
in if display != null then display else 0
|
|
||||||
)}";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -43,7 +43,8 @@ in {
|
|||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
systemd.user.services.unclutter-xfixes = {
|
systemd.user.services.unclutter-xfixes = {
|
||||||
description = "unclutter-xfixes";
|
description = "unclutter-xfixes";
|
||||||
wantedBy = [ "graphical.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
partOf = [ "graphical-session.target" ];
|
||||||
serviceConfig.ExecStart = ''
|
serviceConfig.ExecStart = ''
|
||||||
${cfg.package}/bin/unclutter \
|
${cfg.package}/bin/unclutter \
|
||||||
--timeout ${toString cfg.timeout} \
|
--timeout ${toString cfg.timeout} \
|
||||||
|
@ -56,19 +56,17 @@ in {
|
|||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
systemd.user.services.unclutter = {
|
systemd.user.services.unclutter = {
|
||||||
description = "unclutter";
|
description = "unclutter";
|
||||||
wantedBy = [ "default.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
partOf = [ "graphical-session.target" ];
|
||||||
serviceConfig.ExecStart = ''
|
serviceConfig.ExecStart = ''
|
||||||
${cfg.package}/bin/unclutter \
|
${cfg.package}/bin/unclutter \
|
||||||
-idle ${toString cfg.timeout} \
|
-idle ${toString cfg.timeout} \
|
||||||
-display :${toString (
|
|
||||||
let display = config.services.xserver.display;
|
|
||||||
in if display != null then display else 0
|
|
||||||
)} \
|
|
||||||
-jitter ${toString (cfg.threeshold - 1)} \
|
-jitter ${toString (cfg.threeshold - 1)} \
|
||||||
${optionalString cfg.keystroke "-keystroke"} \
|
${optionalString cfg.keystroke "-keystroke"} \
|
||||||
${concatMapStrings (x: " -"+x) cfg.extraOptions} \
|
${concatMapStrings (x: " -"+x) cfg.extraOptions} \
|
||||||
-not ${concatStringsSep " " cfg.excluded} \
|
-not ${concatStringsSep " " cfg.excluded} \
|
||||||
'';
|
'';
|
||||||
|
serviceConfig.PassEnvironment = "DISPLAY";
|
||||||
serviceConfig.RestartSec = 3;
|
serviceConfig.RestartSec = 3;
|
||||||
serviceConfig.Restart = "always";
|
serviceConfig.Restart = "always";
|
||||||
};
|
};
|
||||||
|
@ -21,9 +21,8 @@ in {
|
|||||||
systemd.user = {
|
systemd.user = {
|
||||||
sockets.urxvtd = {
|
sockets.urxvtd = {
|
||||||
description = "socket for urxvtd, the urxvt terminal daemon";
|
description = "socket for urxvtd, the urxvt terminal daemon";
|
||||||
after = [ "graphical.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
wants = [ "graphical.target" ];
|
partOf = [ "graphical-session.target" ];
|
||||||
wantedBy = [ "sockets.target" ];
|
|
||||||
socketConfig = {
|
socketConfig = {
|
||||||
ListenStream = "%t/urxvtd-socket";
|
ListenStream = "%t/urxvtd-socket";
|
||||||
};
|
};
|
||||||
|
@ -20,7 +20,8 @@ in {
|
|||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
systemd.user.services.xbanish = {
|
systemd.user.services.xbanish = {
|
||||||
description = "xbanish hides the mouse pointer";
|
description = "xbanish hides the mouse pointer";
|
||||||
wantedBy = [ "default.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
partOf = [ "graphical-session.target" ];
|
||||||
serviceConfig.ExecStart = ''
|
serviceConfig.ExecStart = ''
|
||||||
${pkgs.xbanish}/bin/xbanish ${cfg.arguments}
|
${pkgs.xbanish}/bin/xbanish ${cfg.arguments}
|
||||||
'';
|
'';
|
||||||
|
Loading…
Reference in New Issue
Block a user