| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 | |
| 11 | |
| 12 | |
| 13 | |
| 14 | |
| 15 | |
| 16 | |
| 17 | |
| 18 |
|
| 19 | |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | |
| 25 | |
| 26 |
|
| 27 | (define-module (gnu system keyboard)
|
| 28 | #:use-module (guix gexp)
|
| 29 | #:use-module ((gnu packages xorg)
|
| 30 | #:select (xkeyboard-config console-setup))
|
| 31 | #:use-module (srfi srfi-9 gnu)
|
| 32 | #:use-module (ice-9 match)
|
| 33 | #:export (keyboard-layout?
|
| 34 | keyboard-layout
|
| 35 | keyboard-layout-name
|
| 36 | keyboard-layout-variant
|
| 37 | keyboard-layout-model
|
| 38 | keyboard-layout-options
|
| 39 |
|
| 40 | keyboard-layout->console-keymap))
|
| 41 |
|
| 42 | (define-immutable-record-type <keyboard-layout>
|
| 43 | (%keyboard-layout name variant model options)
|
| 44 | keyboard-layout?
|
| 45 | (name keyboard-layout-name) |
| 46 | (variant keyboard-layout-variant) |
| 47 | (model keyboard-layout-model) |
| 48 | (options keyboard-layout-options)) |
| 49 |
|
| 50 | (define* (keyboard-layout name #:optional variant
|
| 51 | #:key model (options '()))
|
| 52 | "Return a new keyboard layout with the given NAME and VARIANT.
|
| 53 |
|
| 54 | NAME must be a string such as \"fr\"; VARIANT must be a string such as
|
| 55 | \"bepo\" or \"nodeadkeys\". See the 'xkeyboard-config' package for valid
|
| 56 | options."
|
| 57 | (%keyboard-layout name variant model options))
|
| 58 |
|
| 59 | (define* (keyboard-layout->console-keymap layout
|
| 60 | #:key
|
| 61 | (xkeyboard-config xkeyboard-config))
|
| 62 | "Return a Linux console keymap file for LAYOUT, a <keyboard-layout> record.
|
| 63 | Layout information is taken from the XKEYBOARD-CONFIG package."
|
| 64 | (define build
|
| 65 | (with-imported-modules '((guix build utils))
|
| 66 | #~(begin
|
| 67 | (use-modules (guix build utils)
|
| 68 | (ice-9 popen)
|
| 69 | (ice-9 match))
|
| 70 |
|
| 71 | (define pipe
|
| 72 | (open-pipe* OPEN_READ
|
| 73 | #+(file-append console-setup "/bin/ckbcomp")
|
| 74 | (string-append "-I"
|
| 75 | #+(file-append xkeyboard-config
|
| 76 | "/share/X11/xkb"))
|
| 77 | "-rules" "base"
|
| 78 | #$@(match (keyboard-layout-model layout)
|
| 79 | (#f '())
|
| 80 | (model `("-model" ,model)))
|
| 81 | #$(keyboard-layout-name layout)
|
| 82 | #$(or (keyboard-layout-variant layout)
|
| 83 | "")
|
| 84 | #$(string-join (keyboard-layout-options layout) ",")))
|
| 85 |
|
| 86 | (call-with-output-file #$output
|
| 87 | (lambda (output)
|
| 88 | (dump-port pipe output)))
|
| 89 |
|
| 90 | |
| 91 | |
| 92 | (unless (zero? (close-pipe pipe))
|
| 93 | (error "failed to create console keymap for keyboard layout"
|
| 94 | #$(keyboard-layout-name layout))))))
|
| 95 |
|
| 96 | (computed-file (string-append "console-keymap."
|
| 97 | (string-map (match-lambda
|
| 98 | (#\, #\-)
|
| 99 | (chr chr))
|
| 100 | (keyboard-layout-name layout)))
|
| 101 | build))
|