mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-12-24 05:18:07 -05:00
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:
parent
956607e340
commit
b2e564515a
2 changed files with 99 additions and 146 deletions
130
doc/guix.texi
130
doc/guix.texi
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in a new issue