xsession: add option importedVariables

This option lists the environment variables to be imported into the
systemd user session.

Also add a basic test of the xsession module.
This commit is contained in:
Robert Helgesson 2019-06-23 14:06:29 +02:00
parent f83c49baa3
commit 95d55b8da1
No known key found for this signature in database
GPG key ID: 36BDAA14C2797E89
8 changed files with 96 additions and 9 deletions

View file

@ -65,8 +65,7 @@ in
then [ pkgs.qgnomeplatform ] then [ pkgs.qgnomeplatform ]
else [ pkgs.libsForQt5.qtstyleplugins ]; else [ pkgs.libsForQt5.qtstyleplugins ];
xsession.profileExtra = xsession.importedVariables = [ "QT_QPA_PLATFORMTHEME" ];
"systemctl --user import-environment QT_QPA_PLATFORMTHEME";
# Enable GTK+ style for Qt4 in either case. # Enable GTK+ style for Qt4 in either case.
# It doesnt support the platform theme packages. # It doesnt support the platform theme packages.

View file

@ -42,5 +42,7 @@ in
WantedBy = [ "graphical-session.target" ]; WantedBy = [ "graphical-session.target" ];
}; };
}; };
xsession.importedVariables = [ "GDK_PIXBUF_MODULE_FILE" ];
}; };
} }

View file

@ -62,10 +62,31 @@ in
default = ""; default = "";
description = "Extra shell commands to run during initialization."; description = "Extra shell commands to run during initialization.";
}; };
importedVariables = mkOption {
type = types.listOf (types.strMatching "[a-zA-Z_][a-zA-Z0-9_]*");
example = [ "GDK_PIXBUF_ICON_LOADER" ];
visible = false;
description = ''
Environment variables to import into the user systemd
session. The will be available for use by graphical
services.
'';
};
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
xsession.importedVariables = [
"DBUS_SESSION_BUS_ADDRESS"
"DISPLAY"
"SSH_AUTH_SOCK"
"XAUTHORITY"
"XDG_DATA_DIRS"
"XDG_RUNTIME_DIR"
"XDG_SESSION_ID"
];
systemd.user = { systemd.user = {
services = mkIf (config.home.keyboard != null) { services = mkIf (config.home.keyboard != null) {
setxkbmap = { setxkbmap = {
@ -118,13 +139,10 @@ in
# script starts up graphical-session.target. # script starts up graphical-session.target.
systemctl --user stop graphical-session.target graphical-session-pre.target systemctl --user stop graphical-session.target graphical-session-pre.target
systemctl --user import-environment DBUS_SESSION_BUS_ADDRESS ${optionalString (cfg.importedVariables != []) (
systemctl --user import-environment DISPLAY "systemctl --user import-environment "
systemctl --user import-environment SSH_AUTH_SOCK + toString (unique cfg.importedVariables)
systemctl --user import-environment XAUTHORITY )}
systemctl --user import-environment XDG_DATA_DIRS
systemctl --user import-environment XDG_RUNTIME_DIR
systemctl --user import-environment XDG_SESSION_ID
${cfg.profileExtra} ${cfg.profileExtra}

View file

@ -33,6 +33,7 @@ import nmt {
i3-keybindings = ./modules/services/window-managers/i3-keybindings.nix; i3-keybindings = ./modules/services/window-managers/i3-keybindings.nix;
} }
// import ./modules/misc/pam // import ./modules/misc/pam
// import ./modules/misc/xsession
// import ./modules/systemd // import ./modules/systemd
) )
// import ./modules/home-environment // import ./modules/home-environment

View file

@ -0,0 +1,16 @@
. "/test-home/.nix-profile/etc/profile.d/hm-session-vars.sh"
if [[ -e "$HOME/.profile" ]]; then
. "$HOME/.profile"
fi
# If there are any running services from a previous session.
# Need to run this in xprofile because the NixOS xsession
# script starts up graphical-session.target.
systemctl --user stop graphical-session.target graphical-session-pre.target
systemctl --user import-environment DBUS_SESSION_BUS_ADDRESS DISPLAY SSH_AUTH_SOCK XAUTHORITY XDG_DATA_DIRS XDG_RUNTIME_DIR XDG_SESSION_ID EXTRA_IMPORTED_VARIABLE
profile extra commands
export HM_XPROFILE_SOURCED=1

View file

@ -0,0 +1,18 @@
if [[ ! -v HM_XPROFILE_SOURCED ]]; then
. ~/.xprofile
fi
unset HM_XPROFILE_SOURCED
systemctl --user start hm-graphical-session.target
init extra commands
window manager command
systemctl --user stop graphical-session.target
systemctl --user stop graphical-session-pre.target
# Wait until the units actually stop.
while [[ -n "$(systemctl --user --no-legend --state=deactivating list-units)" ]]; do
sleep 0.5
done

View file

@ -0,0 +1,30 @@
{ config, lib, ... }:
with lib;
{
config = {
home.homeDirectory = "/test-home";
xsession = {
enable = true;
windowManager.command = "window manager command";
importedVariables = [ "EXTRA_IMPORTED_VARIABLE" ];
initExtra = "init extra commands";
profileExtra = "profile extra commands";
};
nmt.script = ''
assertFileExists home-files/.xprofile
assertFileContent \
home-files/.xprofile \
${./basic-xprofile-expected.txt}
assertFileExists home-files/.xsession
assertFileContent \
home-files/.xsession \
${./basic-xsession-expected.txt}
'';
};
}

View file

@ -0,0 +1,3 @@
{
xsession-basic = ./basic.nix;
}