summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/guix.texi87
-rw-r--r--gnu/services/base.scm431
-rw-r--r--gnu/tests/desktop.scm14
3 files changed, 374 insertions, 158 deletions
diff --git a/doc/guix.texi b/doc/guix.texi
index 4fcddb98cb..00d3dba316 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -20512,13 +20512,21 @@ Here is an example of switching from @code{mingetty-service-type} to
(terminal-vt "2")
(default-session-command
(greetd-agreety-session
- (extra-env '(("MY_VAR" . "1")))
- (xdg-env? #f))))
+ (command
+ (greetd-user-session
+ (extra-env '(("MY_VAR" . "1")))
+ (xdg-env? #f))))))
;; we can use different shell instead of default bash
(greetd-terminal-configuration
(terminal-vt "3")
(default-session-command
- (greetd-agreety-session (command (file-append zsh "/bin/zsh")))))
+ (greetd-agreety-session
+ (command
+ (greetd-user-session
+ (command (file-append zsh "/bin/zsh"))
+ (command-args '("-l"))
+ (extra-env '(("MY_VAR" . "1")))
+ (xdg-env? #f))))))
;; we can use any other executable command as greeter
(greetd-terminal-configuration
(terminal-vt "4")
@@ -20563,6 +20571,12 @@ Configuration record for per terminal greetd daemon service.
@item @code{greetd} (default: @code{greetd})
The greetd package to use.
+@item @code{shepherd-requirement} (default: @code{'()})
+This option can be used to provide a list of additional symbols naming
+Shepherd services that this service will depend on, such as
+@code{'seatd} or @code{'elogind} when the terminal session is a
+graphical greeter.
+
@item @code{config-file-name}
Configuration file name to use for greetd daemon. Generally, autogenerated
derivation based on @code{terminal-vt} value.
@@ -20586,21 +20600,24 @@ exist.
The user to use for running the greeter.
@item @code{default-session-command} (default: @code{(greetd-agreety-session)})
-Can be either instance of @code{greetd-agreety-session} configuration or
+Can be either @code{greetd-agreety-session}, @code{greetd-wlgreet-sway-session} or
@code{gexp->script} like object to use as greeter.
@end table
@end deftp
-@deftp {Data Type} greetd-agreety-session
-Configuration record for the agreety greetd greeter.
+@deftp {Data Type} greetd-user-session
+Configuration record for the user session command. Greeters require the
+user command to be specified in some or another way.
+@code{greetd-user-session} provides a common command for that. Users
+should prefer POSIX shell commands like @command{bash}, which can start
+an actual user terminal shell, window manager or desktop environment
+with their own mechanism, for example via @file{~/.bashrc} in the case
+of Bash.
@table @asis
-@item @code{agreety} (default: @code{greetd})
-The package with @command{/bin/agreety} command.
-
@item @code{command} (default: @code{(file-append bash "/bin/bash")})
-Command to be started by @command{/bin/agreety} on successful login.
+Command to be started by @command{agreety} on successful login.
@item @code{command-args} (default: @code{'("-l")})
Command arguments to pass to command.
@@ -20608,27 +20625,37 @@ Command arguments to pass to command.
@item @code{extra-env} (default: @code{'()})
Extra environment variables to set on login.
+@item @code{xdg-session-type} (default: @code{"tty"})
+Specify the value of @code{XDG_SESSION_TYPE}. The user environment may
+adapt depending on its value (normally by using @file{.bashrc} or
+similar).
+
@item @code{xdg-env?} (default: @code{#t})
If true @code{XDG_RUNTIME_DIR} and @code{XDG_SESSION_TYPE} will be set
-before starting command. One should note that, @code{extra-env} variables
+before starting command. One should note that, @code{extra-env} variables
are set right after mentioned variables, so that they can be overridden.
@end table
@end deftp
-@deftp {Data Type} greetd-wlgreet-session
-Generic configuration record for the wlgreet greetd greeter.
+@deftp {Data Type} greetd-agreety-session
+Configuration record for the agreety greetd greeter.
@table @asis
-@item @code{wlgreet} (default: @code{wlgreet})
-The package with the @command{/bin/wlgreet} command.
+@item @code{agreety} (default: @code{greetd})
+The package providing the @command{agreety} command.
-@item @code{command} (default: @code{(file-append sway "/bin/sway")})
-Command to be started by @command{/bin/wlgreet} on successful login.
+@item @code{command} (default: @code{(greetd-user-session)})
+Command to be started by @command{agreety} on successful login, an
+instance of @code{greetd-user-session}.
-@item @code{command-args} (default: @code{'()})
-Command arguments to pass to command.
+@end table
+@end deftp
+@deftp {Data Type} greetd-wlgreet-configuration
+Generic configuration record for the wlgreet greetd greeter.
+
+@table @asis
@item @code{output-mode} (default: @code{"all"})
Option to use for @code{outputMode} in the TOML configuration file.
@@ -20650,9 +20677,6 @@ RGBA list to use as the error colour of the UI popup.
@item @code{border} (default: @code{'(1 1 1 1)})
RGBA list to use as the border colour of the UI popup.
-@item @code{extra-env} (default: @code{'()})
-Extra environment variables to set on login.
-
@end table
@end deftp
@@ -20665,28 +20689,41 @@ A @code{greetd-wlgreet-session} record for generic wlgreet configuration,
on top of the Sway-specific @code{greetd-wlgreet-sway-session}.
@item @code{sway} (default: @code{sway})
-The package providing the @command{/bin/sway} command.
+The package providing the @command{sway} command.
@item @code{sway-configuration} (default: #f)
File-like object providing an additional Sway configuration file to be
prepended to the mandatory part of the configuration.
+@item @code{wlgreet} (default: @code{wlgreet})
+The package providing the @command{wlgreet} command.
+
+@item @code{wlgreet-configuration} (default: @code{(greetd-wlgreet-configuration)})
+Configuration of @code{wlgreet} represented
+by @code{greetd-wlgreet-configuration}.
+
+@item @code{command} (default: @code{(greetd-user-session)})
+Command to be started by @command{wlgreet} on successful login, an
+instance of @code{greetd-user-session}.
+
@end table
Here is an example of a greetd configuration that uses wlgreet and Sway:
@lisp
(greetd-configuration
- ;; We need to give the greeter user these permissions, otherwise
- ;; Sway will crash on launch.
+ ;; The graphical greeter requires additional group membership.
(greeter-supplementary-groups (list "video" "input" "seat"))
(terminals
(list (greetd-terminal-configuration
+ ;; Sway requires seatd service.
+ (extra-shepherd-requirement '(seatd))
(terminal-vt "1")
(terminal-switch #t)
(default-session-command
(greetd-wlgreet-sway-session
(sway-configuration
+ ;; Optional extra sway configuration.
(local-file "sway-greetd.conf"))))))))
@end lisp
@end deftp
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 7331c030d7..fce82094f6 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -16,7 +16,7 @@
;;; Copyright © 2021 qblade <qblade@protonmail.com>
;;; Copyright © 2021 Hui Lu <luhuins@163.com>
;;; Copyright © 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
-;;; Copyright © 2021 muradm <mail@muradm.net>
+;;; Copyright © 2021, 2025 muradm <mail@muradm.net>
;;; Copyright © 2022 Guillaume Le Vaillant <glv@posteo.net>
;;; Copyright © 2022 Justin Veilleux <terramorpha@cock.li>
;;; Copyright © 2022 ( <paren@disroot.org>
@@ -274,8 +274,10 @@
greetd-service-type
greetd-configuration
greetd-terminal-configuration
+ greetd-user-session
greetd-agreety-session
- greetd-wlgreet-session
+ greetd-wlgreet-session ; deprecated
+ greetd-wlgreet-configuration
greetd-wlgreet-sway-session
%base-services))
@@ -3393,87 +3395,220 @@ to handle."
;;; greetd-service-type -- minimal and flexible login manager daemon
;;;
+(define-record-type* <greetd-user-session>
+ greetd-user-session make-greetd-user-session greetd-user-session?
+ (command greetd-user-session-command (default (file-append bash "/bin/bash")))
+ (command-args greetd-user-session-command-args (default '("-l")))
+ (extra-env greetd-user-session-extra-env (default '()))
+ (xdg-session-type greetd-user-session-xdg-session-type (default "tty"))
+ (xdg-env? greetd-user-session-xdg-env? (default #t)))
+
+(define (make-greetd-user-session-command config)
+ (match-record config <greetd-user-session>
+ (command command-args extra-env)
+ (program-file
+ "greetd-user-session-command"
+ #~(begin
+ (use-modules (ice-9 match))
+ (for-each (match-lambda ((var . val) (setenv var val)))
+ (quote (#$@extra-env)))
+ (apply execl #$command #$command
+ (list #$@command-args))))))
+
+(define (make-greetd-xdg-user-session-command config)
+ (match-record config <greetd-user-session>
+ (command command-args extra-env xdg-session-type)
+ (program-file
+ "greetd-xdg-user-session-command"
+ #~(begin
+ (use-modules (ice-9 match))
+ (let* ((username (getenv "USER"))
+ (useruid (passwd:uid (getpwuid username)))
+ (useruid (number->string useruid)))
+ (setenv "XDG_SESSION_TYPE" #$xdg-session-type)
+ (setenv "XDG_RUNTIME_DIR"
+ (string-append "/run/user/" useruid)))
+ (for-each (match-lambda ((var . val) (setenv var val)))
+ (quote (#$@extra-env)))
+ (apply execl #$command #$command
+ (list #$@command-args))))))
+
+(define-gexp-compiler (greetd-user-session-compiler
+ (session <greetd-user-session>)
+ system target)
+ (lower-object
+ ((if (greetd-user-session-xdg-env? session)
+ make-greetd-xdg-user-session-command
+ make-greetd-user-session-command) session)))
+
(define-record-type* <greetd-agreety-session>
- greetd-agreety-session make-greetd-agreety-session
- greetd-agreety-session?
- (agreety greetd-agreety (default greetd))
- (command greetd-agreety-command (default (file-append bash "/bin/bash")))
- (command-args greetd-agreety-command-args (default '("-l")))
- (extra-env greetd-agreety-extra-env (default '()))
- (xdg-env? greetd-agreety-xdg-env? (default #t)))
+ greetd-agreety-session make-greetd-agreety-session greetd-agreety-session?
+ (agreety greetd-agreety-session-agreety (default greetd))
+ (command greetd-agreety-session-command
+ (default (greetd-user-session))
+ (sanitize warn-greetd-agreety-session-command-type))
+ (command-args greetd-agreety-command-args
+ (default #nil)
+ (sanitize warn-deprecated-greetd-agreety-command-args))
+ (extra-env greetd-agreety-extra-env
+ (default #nil)
+ (sanitize warn-deprecated-greetd-agreety-extra-env))
+ (xdg-env? greetd-agreety-xdg-env?
+ (default #nil)
+ (sanitize warn-deprecated-greetd-agreety-xdg-env?)))
-(define (greetd-agreety-tty-session-command config)
- (match-record config <greetd-agreety-session>
- (command command-args extra-env)
- (program-file
- "agreety-tty-session-command"
- #~(begin
- (use-modules (ice-9 match))
- (for-each (match-lambda ((var . val) (setenv var val)))
- (quote (#$@extra-env)))
- (apply execl #$command #$command (list #$@command-args))))))
+(define (warn-deprecated-greetd-agreety-command-args value)
+ (unless (nil? value)
+ (warn-about-deprecation
+ 'command-args #f
+ #:replacement '<greetd-user-seesion>))
+ value)
-(define (greetd-agreety-tty-xdg-session-command config)
- (match-record config <greetd-agreety-session>
- (command command-args extra-env)
- (program-file
- "agreety-tty-xdg-session-command"
- #~(begin
- (use-modules (ice-9 match))
- (let*
- ((username (getenv "USER"))
- (useruid (passwd:uid (getpwuid username)))
- (useruid (number->string useruid)))
- (setenv "XDG_SESSION_TYPE" "tty")
- (setenv "XDG_RUNTIME_DIR" (string-append "/run/user/" useruid)))
- (for-each (match-lambda ((var . val) (setenv var val)))
- (quote (#$@extra-env)))
- (apply execl #$command #$command (list #$@command-args))))))
+(define (warn-deprecated-greetd-agreety-extra-env value)
+ (unless (nil? value)
+ (warn-about-deprecation
+ 'extra-env #f
+ #:replacement '<greetd-user-seesion>))
+ value)
+
+(define (warn-deprecated-greetd-agreety-xdg-env? value)
+ (unless (nil? value)
+ (warn-about-deprecation
+ 'xdg-env? #f
+ #:replacement '<greetd-user-seesion>))
+ value)
+
+(define-deprecated/alias greetd-agreety greetd-agreety-session-agreety)
+(define-deprecated/alias greetd-agreety-command greetd-agreety-session-command)
+
+(define (warn-greetd-agreety-session-command-type value)
+ (unless (greetd-user-session? value)
+ (warn-about-deprecation
+ "arbitrary command" #f
+ #:replacement '<greetd-user-session>))
+ value)
+
+(define (greetd-agreety-session-to-user-session session default-command)
+ (let ((command (greetd-agreety-session-command session))
+ (command-args (or (greetd-agreety-command-args session)
+ (greetd-user-session-command-args default-command)))
+ (extra-env (or (greetd-agreety-extra-env session)
+ (greetd-user-session-extra-env default-command)))
+ (xdg-env? (or (greetd-agreety-xdg-env? session)
+ (greetd-user-session-xdg-env? default-command))))
+ (greetd-user-session
+ (command command)
+ (command-args command-args)
+ (extra-env extra-env)
+ (xdg-env? xdg-env?))))
(define-gexp-compiler (greetd-agreety-session-compiler
(session <greetd-agreety-session>)
system target)
- (let ((agreety (file-append (greetd-agreety session)
- "/bin/agreety"))
- (command ((if (greetd-agreety-xdg-env? session)
- greetd-agreety-tty-xdg-session-command
- greetd-agreety-tty-session-command)
- session)))
+ (let* ((agreety
+ (file-append (greetd-agreety-session-agreety session) "/bin/agreety"))
+ (command
+ (greetd-agreety-session-command session))
+ (command
+ (if (greetd-user-session? command)
+ command
+ (greetd-agreety-session-to-user-session
+ session
+ (greetd-user-session)))))
(lower-object
- (program-file "agreety-command"
- #~(execl #$agreety #$agreety "-c" #$command)))))
+ (program-file
+ "agreety-wrapper"
+ #~(execl #$agreety #$agreety "-c" #$command)))))
+
+(define (make-greetd-sway-greeter-command sway sway-config)
+ (let ((sway-bin (file-append sway "/bin/sway")))
+ (program-file
+ "greeter-sway-command"
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+
+ (let* ((username (getenv "USER"))
+ (user (getpwnam username))
+ (useruid (passwd:uid user))
+ (usergid (passwd:gid user))
+ (useruid-s (number->string useruid))
+ ;; /run/user/<greeter-user-uid> won't exist yet
+ ;; this will contain WAYLAND_DISPLAY socket file
+ ;; and log-file below
+ (user-home-dir "/tmp/.greeter-home")
+ (user-xdg-runtime-dir (string-append user-home-dir "/run"))
+ (user-xdg-cache-dir (string-append user-home-dir "/cache"))
+ (log-file (string-append (number->string (getpid)) ".log"))
+ (log-file (string-append user-home-dir "/" log-file)))
+ (for-each (lambda (d)
+ (mkdir-p d)
+ (chown d useruid usergid) (chmod d #o700))
+ (list user-home-dir
+ user-xdg-runtime-dir
+ user-xdg-cache-dir))
+ (setenv "HOME" user-home-dir)
+ (setenv "XDG_CACHE_DIR" user-xdg-cache-dir)
+ (setenv "XDG_RUNTIME_DIR" user-xdg-runtime-dir)
+ (dup2 (open-fdes log-file
+ (logior O_CREAT O_WRONLY O_APPEND) #o640) 1)
+ (dup2 1 2)
+ (execl #$sway-bin #$sway-bin "-d" "-c" #$sway-config)))))))
-(define-record-type* <greetd-wlgreet-session>
- greetd-wlgreet-session make-greetd-wlgreet-session
- greetd-wlgreet-session?
- (wlgreet greetd-wlgreet (default wlgreet))
+(define-record-type* <greetd-wlgreet-configuration>
+ greetd-wlgreet-configuration make-greetd-wlgreet-configuration
+ greetd-wlgreet-configuration?
+ (output-mode greetd-wlgreet-configuration-output-mode (default "all"))
+ (scale greetd-wlgreet-configuration-scale (default 1))
+ (background greetd-wlgreet-configuration-background (default '(0 0 0 0.9)))
+ (headline greetd-wlgreet-configuration-headline (default '(1 1 1 1)))
+ (prompt greetd-wlgreet-configuration-prompt (default '(1 1 1 1)))
+ (prompt-error greetd-wlgreet-configuration-prompt-error (default '(1 1 1 1)))
+ (border greetd-wlgreet-configuration-border (default '(1 1 1 1)))
+ (wlgreet greetd-wlgreet
+ (default #nil)
+ (sanitize warn-deprecated-greetd-wlgreet))
(command greetd-wlgreet-command
- (default (file-append sway "/bin/sway")))
- (command-args greetd-wlgreet-command-args (default '()))
- (output-mode greetd-wlgreet-output-mode (default "all"))
- (scale greetd-wlgreet-scale (default 1))
- (background greetd-wlgreet-background (default '(0 0 0 0.9)))
- (headline greetd-wlgreet-headline (default '(1 1 1 1)))
- (prompt greetd-wlgreet-prompt (default '(1 1 1 1)))
- (prompt-error greetd-wlgreet-prompt-error (default '(1 1 1 1)))
- (border greetd-wlgreet-border (default '(1 1 1 1)))
- (extra-env greetd-wlgreet-extra-env (default '())))
+ (default #nil)
+ (sanitize warn-deprecated-greetd-wlgreet-command))
+ (command-args greetd-wlgreet-command-args
+ (default #nil)
+ (sanitize warn-deprecated-greetd-wlgreet-command-args))
+ (extra-env greetd-wlgreet-extra-env
+ (default #nil)
+ (sanitize warn-deprecated-greetd-wlgreet-extra-env)))
+
+(define-deprecated/alias greetd-wlgreet-session greetd-wlgreet-configuration)
+
+(define (warn-deprecated-greetd-wlgreet value)
+ (unless (nil? value)
+ (warn-about-deprecation
+ 'wlgreet #f
+ #:replacement '<greetd-wlgreet-sway-session>))
+ value)
+
+(define (warn-deprecated-greetd-wlgreet-command value)
+ (unless (nil? value)
+ (warn-about-deprecation
+ 'command #f
+ #:replacement '<greetd-wlgreet-sway-session>))
+ value)
+
+(define (warn-deprecated-greetd-wlgreet-command-args value)
+ (unless (nil? value)
+ (warn-about-deprecation
+ 'command-args #f
+ #:replacement '<greetd-wlgreet-sway-session>))
+ value)
-(define (greetd-wlgreet-wayland-session-command session)
- (program-file "wlgreet-session-command"
- #~(let* ((username (getenv "USER"))
- (useruid (number->string
- (passwd:uid (getpwuid username))))
- (command #$(greetd-wlgreet-command session)))
- (use-modules (ice-9 match))
- (setenv "XDG_SESSION_TYPE" "wayland")
- (setenv "XDG_RUNTIME_DIR" (string-append "/run/user/" useruid))
- (for-each (lambda (env) (setenv (car env) (cdr env)))
- '(#$@(greetd-wlgreet-extra-env session)))
- (apply execl command command
- (list #$@(greetd-wlgreet-command-args session))))))
+(define (warn-deprecated-greetd-wlgreet-extra-env value)
+ (unless (nil? value)
+ (warn-about-deprecation
+ 'extra-env #f
+ #:replacement '<greetd-wlgreet-sway-session>))
+ value)
-(define (make-wlgreet-config-color section-name color)
+(define (make-greetd-wlgreet-config-color section-name color)
(match color
((red green blue opacity)
(string-append
@@ -3483,76 +3618,103 @@ to handle."
"blue = " (number->string blue) "\n"
"opacity = " (number->string opacity) "\n"))))
-(define (make-wlgreet-configuration-file session)
- (let ((command (greetd-wlgreet-wayland-session-command session))
- (output-mode (greetd-wlgreet-output-mode session))
- (scale (greetd-wlgreet-scale session))
- (background (greetd-wlgreet-background session))
- (headline (greetd-wlgreet-headline session))
- (prompt (greetd-wlgreet-prompt session))
- (prompt-error (greetd-wlgreet-prompt-error session))
- (border (greetd-wlgreet-border session)))
- (mixed-text-file "wlgreet.toml"
- "command = \"" command "\"\n"
- "outputMode = \"" output-mode "\"\n"
- "scale = " (number->string scale) "\n"
- (apply string-append
- (map (match-lambda
- ((section-name . color)
- (make-wlgreet-config-color section-name color)))
- `(("background" . ,background)
- ("headline" . ,headline)
- ("prompt" . ,prompt)
- ("prompt-error" . ,prompt-error)
- ("border" . ,border)))))))
+(define (make-greetd-wlgreet-config command color)
+ (match-record color <greetd-wlgreet-configuration>
+ (output-mode scale background headline prompt prompt-error border)
+ (mixed-text-file
+ "wlgreet.toml"
+ "command = \"" command "\"\n"
+ "outputMode = \"" output-mode "\"\n"
+ "scale = " (number->string scale) "\n"
+ (apply string-append
+ (map (match-lambda
+ ((section-name . color)
+ (make-greetd-wlgreet-config-color section-name color)))
+ `(("background" . ,background)
+ ("headline" . ,headline)
+ ("prompt" . ,prompt)
+ ("prompt-error" . ,prompt-error)
+ ("border" . ,border)))))))
(define-record-type* <greetd-wlgreet-sway-session>
greetd-wlgreet-sway-session make-greetd-wlgreet-sway-session
greetd-wlgreet-sway-session?
- (wlgreet-session greetd-wlgreet-sway-session-wlgreet-session ;<greetd-wlgreet-session>
- (default (greetd-wlgreet-session)))
- (sway greetd-wlgreet-sway-session-sway (default sway)) ;<package>
- (sway-configuration greetd-wlgreet-sway-session-sway-configuration ;file-like
- (default (plain-file "wlgreet-sway-config" ""))))
+ (sway greetd-wlgreet-sway-session-sway (default sway))
+ (sway-configuration greetd-wlgreet-sway-session-sway-configuration
+ (default #f))
+ (wlgreet greetd-wlgreet-sway-session-wlgreet (default wlgreet))
+ (wlgreet-configuration greetd-wlgreet-sway-session-wlgreet-configuration
+ (default (greetd-wlgreet-configuration)))
+ (command greetd-wlgreet-sway-session-command (default (greetd-user-session)))
+ (wlgreet-session
+ greetd-wlgreet-sway-session-wlgreet-session
+ (default #nil)
+ (sanitize warn-deprecated-greetd-wlgreet-sway-session-wlgreet-session)))
+
+(define (warn-deprecated-greetd-wlgreet-sway-session-wlgreet-session value)
+ (unless (nil? value)
+ (warn-about-deprecation
+ 'wlgreet-session #f
+ #:replacement 'wlgreet-configuration))
+ value)
+
+(define (make-greetd-wlgreet-sway-session-sway-config session)
+ (match-record session <greetd-wlgreet-sway-session>
+ (sway sway-configuration wlgreet wlgreet-configuration command)
+ (let ((wlgreet-bin (file-append wlgreet "/bin/wlgreet"))
+ (wlgreet-config-file
+ (make-greetd-wlgreet-config command wlgreet-configuration))
+ (swaymsg-bin (file-append sway "/bin/swaymsg")))
+ (mixed-text-file
+ "wlgreet-sway-config"
+ (if sway-configuration
+ #~(string-append "include " #$sway-configuration "\n")
+ "")
+ "xwayland disable\n"
+ "exec \"" wlgreet-bin " --config " wlgreet-config-file
+ "; " swaymsg-bin " exit\"\n"))))
-(define (make-wlgreet-sway-configuration-file session)
- (let* ((wlgreet-session (greetd-wlgreet-sway-session-wlgreet-session session))
- (wlgreet-config (make-wlgreet-configuration-file wlgreet-session))
- (wlgreet (file-append (greetd-wlgreet wlgreet-session) "/bin/wlgreet"))
- (sway-config (greetd-wlgreet-sway-session-sway-configuration session))
- (swaymsg (file-append (greetd-wlgreet-sway-session-sway session)
- "/bin/swaymsg")))
- (mixed-text-file "wlgreet-sway.conf"
- "include " sway-config "\n"
- "xwayland disable\n"
- "exec \"" wlgreet " --config " wlgreet-config "; "
- swaymsg " exit\"\n")))
+(define (greetd-wlgreet-session-to-config session config)
+ (let* ((wlgreet (or (greetd-wlgreet config)
+ (greetd-wlgreet-sway-session-wlgreet session)))
+ (default-command (greetd-wlgreet-sway-session-command session))
+ (command (or (greetd-wlgreet-command config)
+ (greetd-user-session-command default-command)))
+ (command-args (or (greetd-wlgreet-command-args config)
+ (greetd-user-session-command-args default-command)))
+ (extra-env (or (greetd-wlgreet-extra-env config)
+ (greetd-user-session-extra-env default-command))))
+ (greetd-wlgreet-sway-session
+ (sway (greetd-wlgreet-sway-session-sway session))
+ (sway-configuration
+ (greetd-wlgreet-sway-session-sway-configuration session))
+ (wlgreet wlgreet)
+ (wlgreet-configuration config)
+ (command
+ (greetd-user-session
+ (command command)
+ (command-args command-args)
+ (extra-env extra-env))))))
(define-gexp-compiler (greetd-wlgreet-sway-session-compiler
(session <greetd-wlgreet-sway-session>)
system target)
- (let ((sway (file-append (greetd-wlgreet-sway-session-sway session)
- "/bin/sway"))
- (config (make-wlgreet-sway-configuration-file session)))
- (lower-object
- (program-file "wlgreet-sway-session-command"
- #~(let* ((log-file (open-output-file
- (string-append "/tmp/sway-greeter."
- (number->string (getpid))
- ".log")))
- (username (getenv "USER"))
- (useruid (number->string (passwd:uid (getpwuid username)))))
- ;; redirect stdout/err to log-file
- (dup2 (fileno log-file) 1)
- (dup2 1 2)
- (sleep 1) ;give seatd/logind some time to start up
- (setenv "XDG_RUNTIME_DIR" (string-append "/run/user/" useruid))
- (execl #$sway #$sway "-d" "-c" #$config))))))
+ (let ((s (if (nil? (greetd-wlgreet-sway-session-wlgreet-session session))
+ session
+ (greetd-wlgreet-session-to-config
+ session
+ (greetd-wlgreet-sway-session-wlgreet-session session)))))
+ (match-record s <greetd-wlgreet-sway-session> (sway)
+ (lower-object
+ (make-greetd-sway-greeter-command
+ sway
+ (make-greetd-wlgreet-sway-session-sway-config s))))))
(define-record-type* <greetd-terminal-configuration>
greetd-terminal-configuration make-greetd-terminal-configuration
greetd-terminal-configuration?
(greetd greetd-package (default greetd))
+ (shepherd-requirement greetd-shepherd-requirement (default '()))
(config-file-name greetd-config-file-name (thunked)
(default (default-config-file-name this-record)))
(log-file-name greetd-log-file-name (thunked)
@@ -3625,7 +3787,8 @@ to handle."
(name "greeter")
(group "greeter")
(supplementary-groups (greetd-greeter-supplementary-groups config))
- (system? #t))))
+ (system? #t)
+ (create-home-directory? #f))))
(define (make-greetd-pam-mount-conf-file config)
(computed-file
@@ -3675,6 +3838,11 @@ to handle."
(list optional-pam-mount))))
pam))))))
+(define (greetd-run-user-activation config)
+ #~(let ((d "/run/user"))
+ (mkdir d #o755)
+ (chmod d #o755)))
+
(define (greetd-shepherd-services config)
(map
(lambda (tc)
@@ -3682,10 +3850,12 @@ to handle."
((greetd-bin (file-append (greetd-package tc) "/sbin/greetd"))
(greetd-conf (make-greetd-terminal-configuration-file tc))
(greetd-log (greetd-log-file-name tc))
- (greetd-vt (greetd-terminal-vt tc)))
+ (greetd-vt (greetd-terminal-vt tc))
+ (greetd-requirement (greetd-shepherd-requirement tc)))
(shepherd-service
(documentation "Minimal and flexible login manager daemon")
- (requirement '(pam user-processes host-name udev virtual-terminal))
+ (requirement `(pam user-processes host-name udev virtual-terminal
+ ,@greetd-requirement))
(provision (list (symbol-append
'term-tty
(string->symbol (greetd-terminal-vt tc)))))
@@ -3706,6 +3876,7 @@ login manager daemon.")
(list
(service-extension account-service-type greetd-accounts)
(service-extension file-system-service-type (const %greetd-file-systems))
+ (service-extension activation-service-type greetd-run-user-activation)
(service-extension etc-service-type greetd-etc-service)
(service-extension pam-root-service-type greetd-pam-service)
(service-extension shepherd-root-service-type greetd-shepherd-services)))
diff --git a/gnu/tests/desktop.scm b/gnu/tests/desktop.scm
index 1c32076ccb..3f861b253b 100644
--- a/gnu/tests/desktop.scm
+++ b/gnu/tests/desktop.scm
@@ -141,13 +141,21 @@
(terminal-vt "2")
(default-session-command
(greetd-agreety-session
- (extra-env '(("MY_VAR" . "1")))
- (xdg-env? #f))))
+ (command
+ (greetd-user-session
+ (extra-env '(("MY_VAR" . "1")))
+ (xdg-env? #f))))))
;; we can use different shell instead of default bash
(greetd-terminal-configuration
(terminal-vt "3")
(default-session-command
- (greetd-agreety-session (command (file-append zsh "/bin/zsh")))))
+ (greetd-agreety-session
+ (command
+ (greetd-user-session
+ (command (file-append zsh "/bin/zsh"))
+ (command-args '("-l"))
+ (extra-env '(("MY_VAR" . "1")))
+ (xdg-env? #f))))))
;; we can use any other executable command as greeter
(greetd-terminal-configuration
(terminal-vt "4")