(define-module (oni home services xmodmap) #:use-module (gnu services configuration) #:use-module (gnu packages xorg) #:use-module (gnu home services) #:use-module (gnu home services shepherd) #:use-module (gnu home services utils) #:use-module (guix packages) #:use-module (guix gexp) #:export (home-xmodmap-service-type home-xmodmap-configuration)) (define-configuration/no-serialization home-xmodmap-configuration (package (package xmodmap) "Package to use for setting Xmodmap") (auto-start? (boolean #t) "Should xmodmap be started automatically") (pointer (list '()) "List of numbers indicating the order of numbers") (extra (text-config '()) "Any other configuration settings.")) (define (serialize-xmodmap-config config) (let ((pointer (home-xmodmap-configuration-pointer config))) (string-append (if pointer (string-append "pointer = " (string-join (map number->string pointer) " ") "\n\n") "") (string-join (home-xmodmap-configuration-extra config) "\n" 'suffix)))) (define (xmodmap-home-config-file config) (mixed-text-file "Xmodmap" (serialize-xmodmap-config config))) (define (add-xmodmap-packages config) (list (home-xmodmap-configuration-package config))) (define (home-xmodmap-shepherd-service config) (list (shepherd-service (documentation "Start Xmodmap") (provision '(xmodmap)) (auto-start? (home-xmodmap-configuration-auto-start? config)) (one-shot? #t) (start #~(make-forkexec-constructor '(#$(file-append xmodmap "/bin/xmodmap") #$(xmodmap-home-config-file config))))))) (define home-xmodmap-service-type (service-type (name 'home-xmodmap) (extensions (list (service-extension home-profile-service-type add-xmodmap-packages) (service-extension home-shepherd-service-type home-xmodmap-shepherd-service))) (compose identity) (default-value (home-xmodmap-configuration)) (description "Install and configure Xmodmap.")))