~ruther/guix-local

ffc3a02b5ac0196d7e84d4ba9cdfbfcaaca21382 — Ludovic Courtès 11 years ago 3bcfe23
services: xorg: Define the <session-type> record type.

* gnu/services/xorg.scm (<session-type>): New record type.
  (%windowmaker-session-type, %ratpoison-session-type): New variables.
  (%default-xsessions): Use them.
  (xsessions-directory): Expect SESSIONS to be a list of <session-type>
  and rewrite accordingly.
  (slim-service): Adjust docstring.
* doc/guix.texi (X Window): Update accordingly.
2 files changed, 64 insertions(+), 27 deletions(-)

M doc/guix.texi
M gnu/services/xorg.scm
M doc/guix.texi => doc/guix.texi +17 -1
@@ 4531,7 4531,8 @@ started by the @dfn{login manager}, currently SLiM.
@deffn {Monadic Procedure} slim-service [#:allow-empty-passwords? #f] @
  [#:auto-login? #f] [#:default-user ""] [#:startx] @
  [#:theme @var{%default-slim-theme}] @
  [#:theme-name @var{%default-slim-theme-name}]
  [#:theme-name @var{%default-slim-theme-name}] @
  [#:sessions @var{%default-sessions}]
Return a service that spawns the SLiM graphical login manager, which in
turn starts the X display server with @var{startx}, a command as returned by
@code{xorg-start-command}.


@@ 4544,8 4545,23 @@ If @var{theme} is @code{#f}, the use the default log-in theme; otherwise
@var{theme} must be a gexp denoting the name of a directory containing the
theme to use.  In that case, @var{theme-name} specifies the name of the
theme.

Last, @var{session} is a list of @code{<session-type>} objects denoting the
available session types that can be chosen from the log-in screen.
@end deffn

@defvr {Scheme Variable} %default-sessions
The list of default session types used by SLiM.
@end defvr

@defvr {Scheme Variable} %ratpoison-session-type
Session type using the Ratpoison window manager.
@end defvr

@defvr {Scheme Variable} %windowmaker-session-type
Session type using the WindowMaker window manager.
@end defvr

@defvr {Scheme Variable} %default-theme
@defvrx {Scheme Variable} %default-theme-name
The G-Expression denoting the default SLiM theme and its name.

M gnu/services/xorg.scm => gnu/services/xorg.scm +47 -26
@@ 33,11 33,18 @@
  #:use-module (guix store)
  #:use-module (guix monads)
  #:use-module (guix derivations)
  #:use-module (guix records)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-26)
  #:use-module (ice-9 match)
  #:export (xorg-start-command
            %default-xsessions
            %ratpoison-session-type
            %windowmaker-session-type

            session-type?
            session-type-name

            %default-slim-theme
            %default-slim-theme-name
            slim-service))


@@ 172,34 179,45 @@ which should be passed to this script as the first argument.  If not, the
;;; SLiM log-in manager.
;;;

(define-record-type* <session-type> session-type make-session-type
  session-type?
  (name         session-type-name)                ;string
  (executable   session-type-executable))         ;string-valued gexp

(define %windowmaker-session-type
  (session-type
   (name "WindowMaker")
   (executable #~(string-append #$windowmaker "/bin/wmaker"))))

(define %ratpoison-session-type
  (session-type
   (name "Ratpoison")
   (executable #~(string-append #$ratpoison "/bin/ratpoison"))))

(define %default-xsessions
  ;; Default xsessions available for log-in manager, representing as a list of
  ;; monadic desktop entries.
  (list (text-file* "wmaker.desktop" "
[Desktop Entry]
Name=Window Maker
Exec=" windowmaker "/bin/wmaker
Type=Application
")
        (text-file* "ratpoison.desktop" "
[Desktop Entry]
Name=Ratpoison
Exec=" ratpoison "/bin/ratpoison
Type=Application
")))
  ;; Default session types available to the log-in manager.
  (list %windowmaker-session-type %ratpoison-session-type))

(define (xsessions-directory sessions)
  "Return a directory containing SESSIONS, which should be a list of monadic
desktop entries."
  (mlet %store-monad ((sessions (sequence %store-monad sessions)))
    (define builder
      #~(begin
          (mkdir #$output)
          (for-each (lambda (session)
                      (symlink session (string-append #$output "/"
                                                      (basename session))))
                    '#$sessions)))
    (gexp->derivation "xsessions-dir" builder)))
  "Return a directory containing SESSIONS, a list of <session-type> objects."
  (define builder
    #~(begin
        (mkdir #$output)
        (chdir #$output)
        (for-each (lambda (name executable)
                    (let ((file (string-append (string-downcase name)
                                               ".desktop")))
                      (call-with-output-file file
                        (lambda (port)
                          (format port "[Desktop Entry]
Name=~a
Exec=~a
Type=Application~%"
                                  name executable)))))
                  '#$(map session-type-name sessions)
                  (list #$@(map session-type-executable sessions)))))

  (gexp->derivation "xsessions-dir" builder))

(define %default-slim-theme
  ;; Theme based on work by Felipe López.


@@ 231,7 249,10 @@ password.  When @var{auto-login?} is true, log in automatically as
If @var{theme} is @code{#f}, the use the default log-in theme; otherwise
@var{theme} must be a gexp denoting the name of a directory containing the
theme to use.  In that case, @var{theme-name} specifies the name of the
theme."
theme.

Last, @var{session} is a list of @code{<session-type>} objects denoting the
available session types that can be chosen from the log-in screen."

  (define (slim.cfg)
    (mlet %store-monad ((startx  (or startx (xorg-start-command)))