~ruther/guix-local

511ae8325db0dfc7803d7b98d7e4d8f76774e8c5 — conses 3 years ago 97a7597
home: services: Add home-xmodmap-service-type.

* gnu/home/services/desktop.scm (home-xmodmap-service-type)
(home-xmodmap-configuration): New variables;
(serialize-xmodmap-configuration)
(xmodmap-shepherd-service): New procedures;
* doc/guix.texi (Desktop Services): Document it.

Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2 files changed, 98 insertions(+), 0 deletions(-)

M doc/guix.texi
M gnu/home/services/desktop.scm
M doc/guix.texi => doc/guix.texi +41 -0
@@ 42626,6 42626,47 @@ A timeout in seconds after which to hide cursor.

@end deftp

@defvar home-xmodmap-service-type
This is the service type for the
@uref{https://gitlab.freedesktop.org/xorg/app/xmodmap,xmodmap} utility
to modify keymaps and pointer button mappings under the Xorg display
server.  Its associated value must be a
@code{home-xmodmap-configuration} record, as shown below.

The @code{key-map} field takes a list of objects, each of which is
either a @dfn{statement} (a string) or an @dfn{assignment} (a pair of
strings).  As an example, the snippet below swaps around the
@kbd{Caps_Lock} and the @kbd{Control_L} keys, by first removing the
keysyms (on the right-hand side) from the corresponding modifier maps
(on the left-hand side), re-assigning them by swapping each other out,
and finally adding back the keysyms to the modifier maps.

@lisp
(service home-xmodmap-service-type
         (home-xmodmap-configuration
          (key-map '(("remove Lock" . "Caps_Lock")
                     ("remove Control" . "Control_L")
                     ("keysym Control_L" . "Caps_Lock")
                     ("keysym Caps_Lock" . "Control_L")
                     ("add Lock" . "Caps_Lock")
                     ("add Control" . "Control_L")))))
@end lisp
@end defvar

@deftp {Data Type} home-xmodmap-configuration
The configuration record for @code{home-xmodmap-service-type}.  Its
available fields are:

@table @asis
@item @code{xmodmap} (default: @code{xmodmap}) (type: file-like)
The @code{xmodmap} package to use.

@item @code{key-map} (default: @code{'()}) (type: list)
The list of expressions to be read by @code{xmodmap} on service startup.

@end table
@end deftp

@node Guix Home Services
@subsection Guix Home Services


M gnu/home/services/desktop.scm => gnu/home/services/desktop.scm +57 -0
@@ 24,6 24,7 @@
  #:use-module (gnu services configuration)
  #:autoload   (gnu packages glib)    (dbus)
  #:autoload   (gnu packages xdisorg) (redshift unclutter)
  #:autoload   (gnu packages xorg) (setxkbmap xmodmap)
  #:use-module (guix records)
  #:use-module (guix gexp)
  #:use-module (srfi srfi-1)


@@ 275,3 276,59 @@ according to time of day.")))
   (description "Run the @code{unclutter} daemon, which, on systems using the
Xorg graphical display server, automatically hides the cursor after a
user-defined timeout has expired.")))


;;;
;;; Xmodmap.
;;;

(define-configuration/no-serialization home-xmodmap-configuration
  (xmodmap
   (file-like xmodmap)
   "The @code{xmodmap} package to use.")
  (key-map
   (list '())
   "List of expressions to be read by @code{xmodmap} on service startup."))

(define (serialize-xmodmap-configuration field-name val)
  (define serialize-field
    (match-lambda
      ((key . value)
       (format #f "~a = ~a" key value))
      (e e)))

  #~(string-append
     #$@(interpose (map serialize-field val) "\n" 'suffix)))

(define (xmodmap-shepherd-service config)
  (define config-file
    (mixed-text-file
     "config"
     (serialize-xmodmap-configuration
      #f (home-xmodmap-configuration-key-map config))))

  (list
   (shepherd-service
    (provision '(xmodmap))
    (start #~(make-system-constructor
              (string-join
               (list #$(file-append
                        (home-xmodmap-configuration-xmodmap config)
                        "/bin/xmodmap")
                     #$config-file))))
    (stop #~(make-system-constructor
             #$(file-append setxkbmap "/bin/setxkbmap")))
    (documentation "On startup, run @code{xmodmap} and read the expressions in
the configuration file.  On stop, reset all the mappings back to the
defaults."))))

(define home-xmodmap-service-type
  (service-type
   (name 'home-xmodmap)
   (extensions
    (list
     (service-extension home-shepherd-service-type
                        xmodmap-shepherd-service)))
   (default-value (home-xmodmap-configuration))
   (description "Run the @code{xmodmap} utility to modify keymaps and pointer
buttons under the Xorg display server via user-defined expressions.")))