mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 07:26:13 -05:00
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>
This commit is contained in:
parent
97a759769d
commit
511ae8325d
2 changed files with 98 additions and 0 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ (define-module (gnu home services desktop)
|
|||
#: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 @@ (define home-unclutter-service-type
|
|||
(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.")))
|
||||
|
|
Loading…
Reference in a new issue