Will Fancher f8929b7381 nixos/lemurs: TTYVTDisallocate to clear VT
Otherwise, when on VT1, the systemd status is still visible.
2025-07-28 14:46:39 -04:00

129 lines
3.7 KiB
Nix

{
config,
lib,
pkgs,
...
}:
let
cfg = config.services.displayManager.lemurs;
settingsFormat = pkgs.formats.toml { };
in
{
options.services.displayManager.lemurs = {
enable = lib.mkEnableOption "" // {
description = ''
Whether to enable lemurs, a customizable TUI display/login manager.
::: {.note}
For Wayland compositors, your user must be in the "seat" group.
:::
'';
};
package = lib.mkPackageOption pkgs "lemurs" { };
settings = lib.mkOption {
type = settingsFormat.type;
default = { };
example = lib.literalExpression ''
{
do_log = true;
}
'';
description = ''
Configuration for lemurs, provided as a Nix attribute set and automatically
serialized to TOML.
See [lemurs configuration documentation](https://github.com/coastalwhite/lemurs/blob/main/extra/config.toml) for available options.
'';
};
vt = lib.mkOption {
type = lib.types.ints.positive;
default = 2;
description = ''
The virtual console (tty) that lemurs should use.
'';
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = !config.services.displayManager.autoLogin.enable;
message = ''
lemurs doesn't support auto login.
'';
}
];
security.pam.services.lemurs = {
unixAuth = true;
startSession = true;
# See https://github.com/coastalwhite/lemurs/issues/166
setLoginUid = false;
enableGnomeKeyring = lib.mkDefault config.services.gnome.gnome-keyring.enable;
};
environment.systemPackages = [ cfg.package ];
services = {
dbus.packages = [ cfg.package ];
# Required for wayland with setLoginUid = false;
seatd.enable = true;
xserver = {
# To enable user switching, allow lemurs to allocate displays dynamically.
display = null;
};
displayManager = {
enable = true;
execCmd = "exec ${lib.getExe cfg.package} --config ${settingsFormat.generate "config.toml" cfg.settings}";
# set default settings
lemurs.settings =
let
desktops = config.services.displayManager.sessionData.desktops;
in
{
tty = lib.mkDefault cfg.vt;
system_shell = lib.mkDefault "${pkgs.bash}/bin/bash";
initial_path = lib.mkDefault "/run/current-system/sw/bin";
x11 = {
xauth_path = lib.mkDefault "${pkgs.xorg.xauth}/bin/xauth";
xserver_path = lib.mkDefault "${pkgs.xorg.xorgserver}/bin/X";
xsessions_path = lib.mkDefault "${desktops}/share/xsessions";
xsetup_path = lib.mkDefault config.services.displayManager.sessionData.wrapper;
};
wayland.wayland_sessions_path = lib.mkDefault "${desktops}/share/wayland-sessions";
};
};
};
systemd.services.display-manager = {
unitConfig = {
Wants = [ "systemd-user-sessions.service" ];
After = [
"systemd-user-sessions.service"
"getty@tty${toString cfg.vt}.service"
"plymouth-quit-wait.service"
];
Conflicts = [ "getty@tty${toString cfg.vt}.service" ];
};
serviceConfig = {
Type = "idle";
# Defaults from lemurs upstream configuration
StandardInput = "tty";
TTYPath = "/dev/tty${toString cfg.vt}";
TTYReset = "yes";
TTYVHangup = "yes";
# Clear the console before starting
TTYVTDisallocate = true;
};
# Don't kill a user session when using nixos-rebuild
restartIfChanged = false;
};
};
meta.maintainers = with lib.maintainers; [
nullcube
stunkymonkey
];
}