bootloader: Add a 'keyboard-layout' field.

* gnu/bootloader/grub.scm (keyboard-layout-file): New procedure.
(grub-configuration-file)[keyboard-layout-file]: New variable.
[builder]: Use it.
* gnu/bootloader.scm (<bootloader-configuration>)[keyboard-layout]: New
field.
* doc/guix.texi (Bootloader Configuration): Document it.

Co-authored-by: nee <nee-git@hidamari.blue>
This commit is contained in:
Ludovic Courtès 2019-03-17 22:37:53 +01:00
parent db1e2522f6
commit 8d058e7b1b
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
3 changed files with 66 additions and 0 deletions

View File

@ -23654,6 +23654,34 @@ current system.
The number of seconds to wait for keyboard input before booting. Set to The number of seconds to wait for keyboard input before booting. Set to
0 to boot immediately, and to -1 to wait indefinitely. 0 to boot immediately, and to -1 to wait indefinitely.
@cindex keyboard layout, for the bootloader
@item @code{keyboard-layout} (default: @code{#f})
If this is @code{#f}, the bootloader's menu (if any) uses the default keyboard
layout, usually US@tie{}English (``qwerty'').
Otherwise, this must be a @code{keyboard-layout} object. For instance, the
following example defines a standard German keyboard layout:
@example
(keyboard-layout "de")
@end example
@noindent
while the example below designates the bépo layout for French:
@example
(keyboard-layout "fr" "bepo")
@end example
The layout name and variant must match an existing layout in the
@code{xkeyboard-config} package under the @file{share/X11/xkb/symbols}
directory.
@quotation Note
This option is currently ignored by bootloaders other than @code{grub} and
@code{grub-efi}.
@end quotation
@item @code{theme} (default: @var{#f}) @item @code{theme} (default: @var{#f})
The bootloader theme object describing the theme to use. If no theme The bootloader theme object describing the theme to use. If no theme
is provided, some bootloaders might use a default theme, that's true is provided, some bootloaders might use a default theme, that's true

View File

@ -47,6 +47,7 @@
bootloader-configuration-menu-entries bootloader-configuration-menu-entries
bootloader-configuration-default-entry bootloader-configuration-default-entry
bootloader-configuration-timeout bootloader-configuration-timeout
bootloader-configuration-keyboard-layout
bootloader-configuration-theme bootloader-configuration-theme
bootloader-configuration-terminal-outputs bootloader-configuration-terminal-outputs
bootloader-configuration-terminal-inputs bootloader-configuration-terminal-inputs
@ -113,6 +114,8 @@
(default 0)) (default 0))
(timeout bootloader-configuration-timeout ;seconds as integer (timeout bootloader-configuration-timeout ;seconds as integer
(default 5)) (default 5))
(keyboard-layout bootloader-configuration-keyboard-layout ;<keyboard-layout> | #f
(default #f))
(theme bootloader-configuration-theme ;bootloader-specific theme (theme bootloader-configuration-theme ;bootloader-specific theme
(default #f)) (default #f))
(terminal-outputs bootloader-configuration-terminal-outputs ;list of symbols (terminal-outputs bootloader-configuration-terminal-outputs ;list of symbols

View File

@ -27,8 +27,10 @@
#:use-module (gnu bootloader) #:use-module (gnu bootloader)
#:use-module (gnu system uuid) #:use-module (gnu system uuid)
#:use-module (gnu system file-systems) #:use-module (gnu system file-systems)
#:use-module (gnu system keyboard)
#:autoload (gnu packages bootloaders) (grub) #:autoload (gnu packages bootloaders) (grub)
#:autoload (gnu packages gtk) (guile-cairo guile-rsvg) #:autoload (gnu packages gtk) (guile-cairo guile-rsvg)
#:autoload (gnu packages xorg) (xkeyboard-config)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (ice-9 regex) #:use-module (ice-9 regex)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
@ -219,6 +221,26 @@ fi~%"
;;; Configuration file. ;;; Configuration file.
;;; ;;;
(define* (keyboard-layout-file layout
#:key
(grub grub))
"Process the X keyboard layout description LAYOUT, a <keyboard-layout> record,
and return a file in the format for GRUB keymaps. LAYOUT must be present in
the 'share/X11/xkb/symbols/' directory of 'xkeyboard-config'."
(define builder
(with-imported-modules '((guix build utils))
#~(begin
(use-modules (guix build utils))
;; 'grub-kbdcomp' passes all its arguments but '-o' to 'ckbcomp'
;; (from the 'console-setup' package).
(invoke #$(file-append grub "/bin/grub-mklayout")
"-i" #+(keyboard-layout->console-keymap layout)
"-o" #$output))))
(computed-file (string-append "grub-keymap." (keyboard-layout-name layout))
builder))
(define (grub-setup-io config) (define (grub-setup-io config)
"Return GRUB commands to configure the input / output interfaces. The result "Return GRUB commands to configure the input / output interfaces. The result
is a string that can be inserted in grub.cfg." is a string that can be inserted in grub.cfg."
@ -330,6 +352,18 @@ entries corresponding to old generations of the system."
#:system system #:system system
#:port #~port)) #:port #~port))
(define keyboard-layout-config
(let ((layout (bootloader-configuration-keyboard-layout config))
(grub (bootloader-package
(bootloader-configuration-bootloader config))))
#~(let ((keymap #$(and layout
(keyboard-layout-file layout #:grub grub))))
(when keymap
(format port "\
terminal_input at_keyboard
insmod keylayouts
keymap ~a~%" keymap)))))
(define builder (define builder
#~(call-with-output-file #$output #~(call-with-output-file #$output
(lambda (port) (lambda (port)
@ -338,6 +372,7 @@ entries corresponding to old generations of the system."
# will be lost upon reconfiguration. # will be lost upon reconfiguration.
") ")
#$sugar #$sugar
#$keyboard-layout-config
(format port " (format port "
set default=~a set default=~a
set timeout=~a~%" set timeout=~a~%"