services: xorg: Define an <xorg-configuration> record type.

* gnu/services/xorg.scm (<xorg-configuration>): New record type.
(xorg-configuration-file): Remove.
(xorg-wrapper): Remove #:modules, #:configuration-file, and
 #:xorg-server; add optional 'config' parameter instead.  Adjust
accordingly.
(xorg-start-command): Likewise.
* doc/guix.texi (X Window): Document 'xorg-configuration'.  Update
'xorg-start-command' documentation.  Remove 'xorg-configuration-file'
documentation.
This commit is contained in:
Ludovic Courtès 2019-03-18 22:56:13 +01:00
parent 956607e340
commit b2e564515a
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 99 additions and 146 deletions

View file

@ -13352,98 +13352,52 @@ type @code{<sddm-configuration>}.
@end example @end example
@end deffn @end deffn
@deffn {Scheme Procedure} xorg-start-command @ @cindex Xorg, configuration
[#:modules %default-xorg-modules] @ @deftp {Data Type} xorg-configuration
[#:fonts %default-xorg-fonts] @ This data type represents the configuration of the Xorg graphical display
[#:configuration-file (xorg-configuration-file @dots{})] @ server. Note that there is not Xorg service; instead, the X server is started
[#:xorg-server @var{xorg-server}] by a ``display manager'' such as GDM, SDDM, and SLiM. Thus, the configuration
[#:xserver-arguments '("-nolisten" "tcp")] of these display managers aggregates an @code{xorg-configuration} record.
Return a @code{startx} script in which @var{modules}, a list of X module
packages, and @var{fonts}, a list of X font directories, are available. See @table @asis
@code{xorg-wrapper} for more details on the arguments. The result should be @item @code{modules} (default: @code{%default-xorg-modules})
used in place of @code{startx}. This is a list of @dfn{module packages} loaded by the Xorg
server---e.g., @code{xf86-video-vesa}, @code{xf86-input-keyboard}, and so on.
@item @code{fonts} (default: @code{%default-xorg-fonts})
This is a list of font directories to add to the server's @dfn{font path}.
@item @code{drivers} (default: @code{'()})
This must be either the empty list, in which case Xorg chooses a graphics
driver automatically, or a list of driver names that will be tried in this
order---e.g., @code{("modesetting" "vesa")}.
@item @code{resolutions} (default: @code{'()})
When @code{resolutions} is the empty list, Xorg chooses an appropriate screen
resolution. Otherwise, it must be a list of resolutions---e.g., @code{((1024
768) (640 480))}.
@item @code{extra-config} (default: @code{'()})
This is a list of strings or objects appended to the configuration file. It
is used to pass extra text to be added verbatim to the configuration file.
@item @code{server} (default: @code{xorg-server})
This is the package providing the Xorg server.
@item @code{server-arguments} (default: @code{%default-xorg-server-arguments})
This is the list of command-line arguments to pass to the X server. The
default is @code{-nolisten tcp}.
@end table
@end deftp
@deffn {Scheme Procedure} xorg-start-command [@var{config}]
Return a @code{startx} script in which the modules, fonts, etc. specified
in @var{config}, are available. The result should be used in place of
@code{startx}.
Usually the X server is started by a login manager. Usually the X server is started by a login manager.
@end deffn @end deffn
@cindex @code{-listen tcp}, for X11.
This procedure is useful to override command line options for the X server,
such as having it listen to over TCP:
@example
(operating-system
...
(services
(modify-services %desktop-services
(slim-service-type config =>
(slim-configuration
(inherit config)
(startx (xorg-start-command
#:xserver-arguments '("-listen" "tcp"))))))))
@end example
@deffn {Scheme Procedure} xorg-configuration-file @
[#:modules %default-xorg-modules] @
[#:fonts %default-xorg-fonts] @
[#:drivers '()] [#:resolutions '()] [#:extra-config '()]
Return a configuration file for the Xorg server containing search paths for
all the common drivers.
@var{modules} must be a list of @dfn{module packages} loaded by the Xorg
server---e.g., @code{xf86-video-vesa}, @code{xf86-input-keyboard}, and so on.
@var{fonts} must be a list of font directories to add to the server's
@dfn{font path}.
@var{drivers} must be either the empty list, in which case Xorg chooses a
graphics driver automatically, or a list of driver names that will be tried in
this order---e.g., @code{("modesetting" "vesa")}.
Likewise, when @var{resolutions} is the empty list, Xorg chooses an
appropriate screen resolution; otherwise, it must be a list of
resolutions---e.g., @code{((1024 768) (640 480))}.
Last, @var{extra-config} is a list of strings or objects appended to the
configuration file. It is used to pass extra text to be
added verbatim to the configuration file.
@cindex keymap
@cindex keyboard layout
This procedure is especially useful to configure a different keyboard layout
than the default US keymap. For instance, to use the ``bépo'' keymap by
default on the display manager:
@example
(define bepo-evdev
"Section \"InputClass\"
Identifier \"evdev keyboard catchall\"
Driver \"evdev\"
MatchIsKeyboard \"on\"
Option \"xkb_layout\" \"fr\"
Option \"xkb_variant\" \"bepo\"
EndSection")
(operating-system
...
(services
(modify-services %desktop-services
(slim-service-type config =>
(slim-configuration
(inherit config)
(startx (xorg-start-command
#:configuration-file
(xorg-configuration-file
#:extra-config
(list bepo-evdev)))))))))
@end example
The @code{MatchIsKeyboard} line specifies that we only apply the configuration
to keyboards. Without this line, other devices such as touchpad may not work
correctly because they will be attached to the wrong driver. In this example,
the user typically used @code{setxkbmap fr bepo} to set their favorite keymap
once logged in. The first argument corresponds to the layout, while the second
argument corresponds to the variant. The @code{xkb_variant} line can be omitted
to select the default variant.
@end deffn
@deffn {Scheme Procedure} screen-locker-service @var{package} [@var{program}] @deffn {Scheme Procedure} screen-locker-service @var{package} [@var{program}]
Add @var{package}, a package for a screen locker or screen saver whose Add @var{package}, a package for a screen locker or screen saver whose

View file

@ -48,7 +48,16 @@ (define-module (gnu services xorg)
#:use-module (srfi srfi-9) #:use-module (srfi srfi-9)
#:use-module (srfi srfi-26) #:use-module (srfi srfi-26)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:export (xorg-configuration-file #:export (xorg-configuration
xorg-configuration?
xorg-configuration-modules
xorg-configuration-fonts
xorg-configuration-drivers
xorg-configuration-resolutions
xorg-configuration-extra-config
xorg-configuration-server
xorg-configuration-server-arguments
%default-xorg-modules %default-xorg-modules
%default-xorg-fonts %default-xorg-fonts
xorg-wrapper xorg-wrapper
@ -122,33 +131,36 @@ (define %default-xorg-fonts
"/share/fonts/X11/misc") "/share/fonts/X11/misc")
(file-append font-adobe75dpi "/share/fonts/X11/75dpi"))) (file-append font-adobe75dpi "/share/fonts/X11/75dpi")))
(define* (xorg-configuration-file #:key (define %default-xorg-server-arguments
(modules %default-xorg-modules) ;; Default command-line arguments for X.
(fonts %default-xorg-fonts) '("-nolisten" "tcp"))
(drivers '()) (resolutions '())
(extra-config '()))
"Return a configuration file for the Xorg server containing search paths for
all the common drivers.
@var{modules} must be a list of @dfn{module packages} loaded by the Xorg ;; Configuration of an Xorg server.
server---e.g., @code{xf86-video-vesa}, @code{xf86-input-keyboard}, and so on. (define-record-type* <xorg-configuration>
@var{fonts} must be a list of font directories to add to the server's xorg-configuration make-xorg-configuration
@dfn{font path}. xorg-configuration?
(modules xorg-configuration-modules ;list of packages
(default %default-xorg-modules))
(fonts xorg-configuration-fonts ;list of packges
(default %default-xorg-fonts))
(drivers xorg-configuration-drivers ;list of strings
(default '()))
(resolutions xorg-configuration-resolutions ;list of tuples
(default '()))
(extra-config xorg-configuration-extra-config ;list of strings
(default '()))
(server xorg-configuration-server ;package
(default xorg-server))
(server-arguments xorg-configuration-server-arguments ;list of strings
(default %default-xorg-server-arguments)))
@var{drivers} must be either the empty list, in which case Xorg chooses a (define (xorg-configuration->file config)
graphics driver automatically, or a list of driver names that will be tried in "Compute an Xorg configuration file corresponding to CONFIG, an
this order---e.g., @code{(\"modesetting\" \"vesa\")}. <xorg-configuration> record."
Likewise, when @var{resolutions} is the empty list, Xorg chooses an
appropriate screen resolution; otherwise, it must be a list of
resolutions---e.g., @code{((1024 768) (640 480))}.
Last, @var{extra-config} is a list of strings or objects appended to the
configuration file. It is used to pass extra text to be
added verbatim to the configuration file."
(define all-modules (define all-modules
;; 'xorg-server' provides 'fbdevhw.so' etc. ;; 'xorg-server' provides 'fbdevhw.so' etc.
(append modules (list xorg-server))) (append (xorg-configuration-modules config)
(list xorg-server)))
(define build (define build
#~(begin #~(begin
@ -159,7 +171,7 @@ (define build
(call-with-output-file #$output (call-with-output-file #$output
(lambda (port) (lambda (port)
(define drivers (define drivers
'#$drivers) '#$(xorg-configuration-drivers config))
(define (device-section driver) (define (device-section driver)
(string-append " (string-append "
@ -201,7 +213,7 @@ (define (expand modules)
(display "Section \"Files\"\n" port) (display "Section \"Files\"\n" port)
(for-each (lambda (font) (for-each (lambda (font)
(format port " FontPath \"~a\"~%" font)) (format port " FontPath \"~a\"~%" font))
'#$fonts) '#$(xorg-configuration-fonts config))
(for-each (lambda (module) (for-each (lambda (module)
(format port (format port
" ModulePath \"~a\"~%" " ModulePath \"~a\"~%"
@ -221,7 +233,8 @@ (define (expand modules)
port) port)
(newline port) (newline port)
(display (string-join (display (string-join
(map (cut screen-section <> '#$resolutions) (map (cut screen-section <>
'#$(xorg-configuration-resolutions config))
drivers) drivers)
"\n") "\n")
port) port)
@ -229,11 +242,10 @@ (define (expand modules)
(for-each (lambda (config) (for-each (lambda (config)
(display config port)) (display config port))
'#$extra-config))))) '#$(xorg-configuration-extra-config config))))))
(computed-file "xserver.conf" build)) (computed-file "xserver.conf" build))
(define (xorg-configuration-directory modules) (define (xorg-configuration-directory modules)
"Return a directory that contains the @code{.conf} files for X.org that "Return a directory that contains the @code{.conf} files for X.org that
includes the @code{share/X11/xorg.conf.d} directories of each package listed includes the @code{share/X11/xorg.conf.d} directories of each package listed
@ -260,51 +272,38 @@ (define files
files) files)
#t)))) #t))))
(define* (xorg-wrapper #:key (define* (xorg-wrapper #:optional (config (xorg-configuration)))
(modules %default-xorg-modules) "Return a derivation that builds a script to start the X server with the
(configuration-file (xorg-configuration-file given @var{config}. The resulting script should be used in place of
#:modules modules)) @code{/usr/bin/X}."
(xorg-server xorg-server))
"Return a derivation that builds a @var{guile} script to start the X server
from @var{xorg-server}. @var{configuration-file} is the server configuration
file or a derivation that builds it; when omitted, the result of
@code{xorg-configuration-file} is used. The resulting script should be used
in place of @code{/usr/bin/X}."
(define exp (define exp
;; Write a small wrapper around the X server. ;; Write a small wrapper around the X server.
#~(begin #~(begin
(setenv "XORG_DRI_DRIVER_PATH" (string-append #$mesa "/lib/dri")) (setenv "XORG_DRI_DRIVER_PATH" (string-append #$mesa "/lib/dri"))
(setenv "XKB_BINDIR" (string-append #$xkbcomp "/bin")) (setenv "XKB_BINDIR" (string-append #$xkbcomp "/bin"))
(let ((X (string-append #$xorg-server "/bin/X"))) (let ((X (string-append #$(xorg-configuration-server config) "/bin/X")))
(apply execl X X (apply execl X X
"-xkbdir" (string-append #$xkeyboard-config "/share/X11/xkb") "-xkbdir" (string-append #$xkeyboard-config "/share/X11/xkb")
"-config" #$configuration-file "-config" #$(xorg-configuration->file config)
"-configdir" #$(xorg-configuration-directory modules) "-configdir" #$(xorg-configuration-directory
(xorg-configuration-modules config))
(cdr (command-line)))))) (cdr (command-line))))))
(program-file "X-wrapper" exp)) (program-file "X-wrapper" exp))
(define* (xorg-start-command #:key (define* (xorg-start-command #:optional (config (xorg-configuration)))
(modules %default-xorg-modules) "Return a @code{startx} script in which the modules, fonts, etc. specified
(fonts %default-xorg-fonts) in @var{config}, are available. The result should be used in place of
(configuration-file @code{startx}."
(xorg-configuration-file #:modules modules
#:fonts fonts))
(xorg-server xorg-server)
(xserver-arguments '("-nolisten" "tcp")))
"Return a @code{startx} script in which @var{modules}, a list of X module
packages, and @var{fonts}, a list of X font directories, are available. See
@code{xorg-wrapper} for more details on the arguments. The result should be
used in place of @code{startx}."
(define X (define X
(xorg-wrapper #:configuration-file configuration-file (xorg-wrapper config))
#:modules modules
#:xorg-server xorg-server))
(define exp (define exp
;; Write a small wrapper around the X server. ;; Write a small wrapper around the X server.
#~(apply execl #$X #$X ;; Second #$X is for argv[0]. #~(apply execl #$X #$X ;; Second #$X is for argv[0].
"-logverbose" "-verbose" "-terminate" #$@xserver-arguments "-logverbose" "-verbose" "-terminate"
#$@(xorg-configuration-server-arguments config)
(cdr (command-line)))) (cdr (command-line))))
(program-file "startx" exp)) (program-file "startx" exp))