2023-09-01 23:59:21 +00:00
|
|
|
# greetd source/docs:
|
|
|
|
# - <https://git.sr.ht/~kennylevinsen/greetd>
|
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
let
|
|
|
|
systemd-cat = "${pkgs.systemd}/bin/systemd-cat";
|
|
|
|
runWithLogger = identifier: cmd: pkgs.writeShellScriptBin identifier ''
|
|
|
|
echo "launching ${identifier}..." | ${systemd-cat} --identifier=${identifier}
|
|
|
|
${cmd} 2>&1 | ${systemd-cat} --identifier=${identifier}
|
|
|
|
'';
|
|
|
|
cfg = config.sane.gui.greetd;
|
|
|
|
in
|
|
|
|
{
|
|
|
|
options = with lib; {
|
|
|
|
sane.gui.greetd.enable = mkOption {
|
|
|
|
default = false;
|
|
|
|
type = types.bool;
|
|
|
|
};
|
|
|
|
sane.gui.greetd.session.command = mkOption {
|
2023-09-02 01:36:11 +00:00
|
|
|
type = types.str;
|
2023-09-02 00:54:05 +00:00
|
|
|
description = ''
|
|
|
|
name to use for the default session in syslog.
|
|
|
|
'';
|
2023-09-01 23:59:21 +00:00
|
|
|
};
|
|
|
|
sane.gui.greetd.session.name = mkOption {
|
|
|
|
default = "greetd-session";
|
2023-09-02 01:36:11 +00:00
|
|
|
type = types.str;
|
2023-09-01 23:59:21 +00:00
|
|
|
description = "name of session to use in logger";
|
|
|
|
};
|
|
|
|
sane.gui.greetd.session.user = mkOption {
|
|
|
|
default = null;
|
2023-09-02 01:36:11 +00:00
|
|
|
type = types.nullOr types.str;
|
2023-09-01 23:59:21 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
# helpers for common things to layer on top of greetd
|
|
|
|
sane.gui.greetd.sway.enable = mkOption {
|
|
|
|
default = false;
|
|
|
|
type = types.bool;
|
|
|
|
description = ''
|
|
|
|
use sway as a wayland compositor in which to host a graphical greeter like gtkgreet, phog, etc.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
sane.gui.greetd.sway.greeterCmd = mkOption {
|
2023-09-02 01:36:11 +00:00
|
|
|
type = types.nullOr types.str;
|
2023-09-01 23:59:21 +00:00
|
|
|
default = null;
|
|
|
|
description = ''
|
|
|
|
command for sway to `exec` that provides the actual graphical greeter.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
sane.gui.greetd.sway.gtkgreet.enable = mkOption {
|
|
|
|
default = false;
|
|
|
|
type = types.bool;
|
|
|
|
description = ''
|
|
|
|
have sway launch gtkgreet instead of directly presenting a desktop.
|
|
|
|
'';
|
|
|
|
};
|
2023-09-02 00:54:05 +00:00
|
|
|
sane.gui.greetd.sway.gtkgreet.session.command = mkOption {
|
2023-09-02 01:36:11 +00:00
|
|
|
type = types.str;
|
2023-09-01 23:59:21 +00:00
|
|
|
description = ''
|
|
|
|
command for gtkgreet to execute on successful authentication.
|
|
|
|
'';
|
|
|
|
};
|
2023-09-02 00:54:05 +00:00
|
|
|
sane.gui.greetd.sway.gtkgreet.session.name = mkOption {
|
2023-09-02 01:36:11 +00:00
|
|
|
type = types.str;
|
2023-09-01 23:59:21 +00:00
|
|
|
description = ''
|
|
|
|
name to use for the default session in syslog and in the gtkgreet menu.
|
|
|
|
note that this `sessionName` will become a binary on the user's PATH.
|
|
|
|
'';
|
|
|
|
};
|
2023-09-02 00:54:05 +00:00
|
|
|
sane.gui.greetd.sway.gtkgreet.session.user = mkOption {
|
2023-09-02 01:36:11 +00:00
|
|
|
type = types.str;
|
2023-09-01 23:59:21 +00:00
|
|
|
default = "colin";
|
|
|
|
description = ''
|
|
|
|
name of user which one expects to login as.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
config = lib.mkIf cfg.enable (lib.mkMerge [
|
|
|
|
(lib.mkIf cfg.sway.enable {
|
|
|
|
sane.gui.greetd.session = if cfg.sway.greeterCmd != null then {
|
|
|
|
name = "sway-as-greeter";
|
|
|
|
command = let
|
|
|
|
swayAsGreeterConfig = pkgs.writeText "sway-as-greeter-config" ''
|
|
|
|
exec ${cfg.sway.greeterCmd}
|
|
|
|
'';
|
2023-09-02 00:49:44 +00:00
|
|
|
in "${pkgs.sway}/bin/sway --debug --config ${swayAsGreeterConfig}";
|
2023-09-01 23:59:21 +00:00
|
|
|
} else {
|
|
|
|
name = "sway";
|
|
|
|
user = lib.mkDefault "colin";
|
2023-09-02 00:49:44 +00:00
|
|
|
command = "${pkgs.sway}/bin/sway --debug";
|
2023-09-01 23:59:21 +00:00
|
|
|
};
|
|
|
|
})
|
|
|
|
(lib.mkIf cfg.sway.gtkgreet.enable (
|
|
|
|
let
|
2023-09-02 00:54:05 +00:00
|
|
|
inherit (cfg.sway.gtkgreet) session;
|
|
|
|
sessionProvider = runWithLogger session.name session.command;
|
2023-09-01 23:59:21 +00:00
|
|
|
in {
|
|
|
|
# gtkgreet shows the --command argument in the UI
|
|
|
|
# - so we want it to look nice (not a /nix/store/... path)
|
|
|
|
# - to do that we put it in the user's PATH.
|
2023-09-02 00:54:05 +00:00
|
|
|
sane.gui.greetd.sway.greeterCmd = "${pkgs.greetd.gtkgreet}/bin/gtkgreet --layer-shell --command ${session.name}";
|
|
|
|
users.users.${session.user}.packages = [ sessionProvider ];
|
2023-09-01 23:59:21 +00:00
|
|
|
}
|
|
|
|
))
|
|
|
|
|
|
|
|
{
|
|
|
|
services.greetd = {
|
|
|
|
enable = true;
|
|
|
|
|
|
|
|
# i could have gtkgreet launch the session directly: but stdout/stderr gets dropped
|
|
|
|
# settings.default_session.command = cfg.session.command;
|
|
|
|
|
|
|
|
# wrapper to launch with stdout/stderr redirected to system journal.
|
|
|
|
settings.default_session.command = let
|
|
|
|
launchWithLogger = runWithLogger cfg.session.name cfg.session.command;
|
|
|
|
in "${launchWithLogger}/bin/${cfg.session.name}";
|
|
|
|
};
|
|
|
|
|
|
|
|
# persisting fontconfig & mesa_shader_cache improves start time by ~5x
|
|
|
|
users.users.greeter.home = "/var/lib/greeter";
|
2023-11-08 15:32:50 +00:00
|
|
|
sane.persist.sys.byStore.plaintext = [
|
2023-09-01 23:59:21 +00:00
|
|
|
{ user = "greeter"; group = "greeter"; path = "/var/lib/greeter/.cache/fontconfig"; }
|
|
|
|
{ user = "greeter"; group = "greeter"; path = "/var/lib/greeter/.cache/mesa_shader_cache"; }
|
|
|
|
];
|
|
|
|
}
|
|
|
|
]);
|
|
|
|
}
|