[bug#34929,08/12] services: xorg: Add a 'keyboard-layout' field in <xorg-configuration>.

Message ID 20190320230435.25458-8-ludo@gnu.org
State Accepted
Headers show
Series None | expand

Checks

Context Check Description
cbaines/applying patch success Successfully applied
cbaines/applying patch success Successfully applied
cbaines/applying patch success Successfully applied
cbaines/applying patch success Successfully applied
cbaines/applying patch success Successfully applied
cbaines/applying patch success Successfully applied

Commit Message

Ludovic Courtès March 20, 2019, 11:04 p.m. UTC
* gnu/services/xorg.scm (<xorg-configuration>)[keyboard-layout]: New
field.
(xorg-configuration->file)[input-class-section]: New procedure.
Use it.
* doc/guix.texi (X Window): Document 'keyboard-layout' field.

Co-authored-by: nee <nee-git@hidamari.blue>
---
 doc/guix.texi         |  8 ++++++++
 gnu/services/xorg.scm | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 49 insertions(+)

Comments

Julien Lepiller March 24, 2019, 9:50 a.m. UTC | #1
Le Thu, 21 Mar 2019 00:04:31 +0100,
Ludovic Courtès <ludo@gnu.org> a écrit :

> * gnu/services/xorg.scm (<xorg-configuration>)[keyboard-layout]: New
> field.
> (xorg-configuration->file)[input-class-section]: New procedure.
> Use it.
> * doc/guix.texi (X Window): Document 'keyboard-layout' field.
> 
> Co-authored-by: nee <nee-git@hidamari.blue>
> ---
>  doc/guix.texi         |  8 ++++++++
>  gnu/services/xorg.scm | 41 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 49 insertions(+)
> 
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 6b73225697..5fa68d5e5a 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -13332,6 +13332,14 @@ 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))}.
>  
> +@cindex keyboard layout, for Xorg

Maybe add @cindex keymap, for Xorg

> +@item @code{keyboard-layout} (default: @code{#f})
> +If this is @code{#f}, Xorg uses the default keyboard
> layout---usually US +English (``qwerty'') for a 105-key PC keyboard.

Patch

diff --git a/doc/guix.texi b/doc/guix.texi
index 6b73225697..5fa68d5e5a 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -13332,6 +13332,14 @@  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))}.
 
+@cindex keyboard layout, for Xorg
+@item @code{keyboard-layout} (default: @code{#f})
+If this is @code{#f}, Xorg uses the default keyboard layout---usually US
+English (``qwerty'') for a 105-key PC keyboard.
+
+Otherwise this must be a @code{keyboard-layout} object specifying the keyboard
+layout in use when Xorg is running.
+
 @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.
diff --git a/gnu/services/xorg.scm b/gnu/services/xorg.scm
index a3a4d769d7..05465f3bdf 100644
--- a/gnu/services/xorg.scm
+++ b/gnu/services/xorg.scm
@@ -25,6 +25,7 @@ 
   #:use-module (gnu services)
   #:use-module (gnu services shepherd)
   #:use-module (gnu system pam)
+  #:use-module (gnu system keyboard)
   #:use-module (gnu services dbus)
   #:use-module ((gnu packages base) #:select (canonical-package))
   #:use-module (gnu packages guile)
@@ -147,6 +148,8 @@ 
                     (default '()))
   (resolutions      xorg-configuration-resolutions ;list of tuples
                     (default '()))
+  (keyboard-layout  xorg-configuration-keyboard-layout ;#f | <keyboard-layout>
+                    (default #f))
   (extra-config     xorg-configuration-extra-config ;list of strings
                     (default '()))
   (server           xorg-configuration-server     ;package
@@ -195,6 +198,31 @@  Section \"Screen\"
   EndSubSection
 EndSection"))
 
+            (define (input-class-section layout variant model options)
+              (string-append "
+Section \"InputClass\"
+  Identifier \"evdev keyboard catchall\"
+  MatchIsKeyboard \"on\"
+  Option \"XkbLayout\" " (object->string layout)
+  (if variant
+      (string-append "  Option \"XkbVariant\" \""
+                     variant "\"")
+      "")
+  (if model
+      (string-append "  Option \"XkbModel\" \""
+                     model "\"")
+      "")
+  (match options
+    (()
+     "")
+    (_
+     (string-append "  Option \"XkbOptions\" \""
+                    (string-join options ",") "\""))) "
+
+  MatchDevicePath \"/dev/input/event*\"
+  Driver \"evdev\"
+EndSection\n"))
+
             (define (expand modules)
               ;; Append to MODULES the relevant /lib/xorg/modules
               ;; sub-directories.
@@ -240,6 +268,19 @@  EndSection\n" port)
                      port)
             (newline port)
 
+            (let ((layout  #$(and=> (xorg-configuration-keyboard-layout config)
+                                    keyboard-layout-name))
+                  (variant #$(and=> (xorg-configuration-keyboard-layout config)
+                                    keyboard-layout-variant))
+                  (model   #$(and=> (xorg-configuration-keyboard-layout config)
+                                    keyboard-layout-model))
+                  (options '#$(keyboard-layout-options
+                               (xorg-configuration-keyboard-layout config))))
+              (when layout
+                (display (input-class-section layout variant model options)
+                         port)
+                (newline port)))
+
             (for-each (lambda (config)
                         (display config port))
                       '#$(xorg-configuration-extra-config config))))))