services: xorg: Run the window manager from a login shell.

This is a followup to 1d18d87, which fixes <http://bugs.gnu.org/19119>.

* gnu/services/xorg.scm (xinitrc)[builder]: Add 'exec-from-login-shell'
  procedure.  Use it instead of 'execl' when launching XSESSION, WMAKER,
  or RATPOISON.
This commit is contained in:
Ludovic Courtès 2014-12-13 16:17:23 +01:00
parent a8a086e392
commit b2bd7c253a

View File

@ -143,28 +143,31 @@ EndSection
#~(begin
(use-modules (ice-9 match))
(let* ((home (getenv "HOME"))
(profile (string-append home "/.guix-profile/bin"))
(PATH (or (getenv "PATH") ""))
(xsession (string-append home "/.xsession")))
;; Make sure the user's profile is visible.
(setenv "PATH"
(string-append profile
(if (string-null? PATH) "" ":")
PATH))
(define (exec-from-login-shell command . args)
;; Run COMMAND from a login shell so that it gets to see the same
;; environment variables that one gets when logging in on a tty, for
;; instance.
(let* ((pw (getpw (getuid)))
(shell (passwd:shell pw))
(st (stat command #f)))
(when (and st (not (zero? (logand (stat:mode st) #o100))))
;; The '--login' option is supported at least by Bash and zsh.
(execl shell shell "--login" "-c"
(string-join (cons command args))))))
;; First, try to run ~/.xsession.
(false-if-exception (execl xsession xsession)))
;; First, try to run ~/.xsession.
(let* ((home (getenv "HOME"))
(xsession (string-append home "/.xsession")))
(exec-from-login-shell xsession))
;; Then try a pre-configured session type.
(let ((ratpoison (string-append #$ratpoison "/bin/ratpoison"))
(wmaker (string-append #$windowmaker "/bin/wmaker")))
(match (command-line)
((_ "ratpoison")
(execl ratpoison ratpoison))
(exec-from-login-shell ratpoison))
(_
;; 'wmaker' does execvp(argv[0]), so we really can't mess up.
(execl wmaker wmaker))))))
(exec-from-login-shell wmaker))))))
(gexp->script "xinitrc" builder))