2022-04-14 10:39:25 +02:00
|
|
|
(define-module (oni home services herbstluftwm)
|
|
|
|
#:use-module (gnu services configuration)
|
|
|
|
#:use-module (gnu packages wm)
|
2022-04-15 09:48:15 +02:00
|
|
|
#:use-module (gnu packages shells)
|
2022-04-14 10:39:25 +02:00
|
|
|
#:use-module (gnu home services)
|
|
|
|
#:use-module (gnu home services utils)
|
|
|
|
#:use-module (guix packages)
|
|
|
|
#:use-module (guix gexp)
|
|
|
|
#:use-module (oni home services xsession)
|
2022-04-15 09:48:15 +02:00
|
|
|
#:use-module (srfi srfi-1)
|
2022-04-14 10:39:25 +02:00
|
|
|
|
|
|
|
#:export (home-herbstluftwm-service-type
|
|
|
|
home-herbstluftwm-configuration))
|
|
|
|
|
|
|
|
(define-configuration/no-serialization home-herbstluftwm-configuration
|
|
|
|
(package
|
|
|
|
(package herbstluftwm)
|
2022-04-15 09:48:15 +02:00
|
|
|
"Package use for setting herbstluftwm")
|
|
|
|
(mouse-bindings
|
|
|
|
(alist '())
|
|
|
|
"Mouse bindings")
|
|
|
|
(settings
|
|
|
|
(alist '())
|
|
|
|
"Settings")
|
|
|
|
(tags
|
|
|
|
(list '(1 2 3 4 5 6 7 8 9 0))
|
|
|
|
"Tags")
|
|
|
|
(tag-keys
|
|
|
|
(list '(1 2 3 4 5 6 7 8 9 0))
|
|
|
|
"Keys for the tags")
|
|
|
|
(attributes
|
|
|
|
(alist '())
|
|
|
|
"Attributes to set")
|
|
|
|
(rules
|
|
|
|
(list '())
|
|
|
|
"Rules to apply")
|
|
|
|
(padding
|
|
|
|
(list '(0 0 0 0 0))
|
|
|
|
"Padding to apply to the monitor")
|
|
|
|
(layouts
|
|
|
|
(alist '())
|
|
|
|
"Layouts to load for tags")
|
|
|
|
(extra
|
|
|
|
(list '())
|
|
|
|
"Extra commands"))
|
2022-04-14 10:39:25 +02:00
|
|
|
|
|
|
|
(define (add-herbstluftwm-packages config)
|
|
|
|
(list (home-herbstluftwm-configuration-package config)))
|
|
|
|
|
2022-04-15 09:48:15 +02:00
|
|
|
(define* (mixed-executable-file name #:key guile #:rest text)
|
|
|
|
"Return an object representing store file NAME containing TEXT. TEXT is a
|
|
|
|
sequence of strings and file-like objects, as in:
|
|
|
|
|
|
|
|
(mixed-text-file \"profile\"
|
|
|
|
\"export PATH=\" coreutils \"/bin:\" grep \"/bin\")
|
|
|
|
|
|
|
|
This is the declarative counterpart of 'text-file*'."
|
|
|
|
(define build
|
|
|
|
(let ((text (if guile (drop text 2) text)))
|
|
|
|
(gexp (call-with-output-file (ungexp output "out")
|
|
|
|
(lambda (port)
|
|
|
|
(set-port-encoding! port "UTF-8")
|
|
|
|
(display (string-append (ungexp-splicing text)) port)
|
|
|
|
(chmod port #o555))))))
|
|
|
|
|
|
|
|
(computed-file name build #:guile guile))
|
|
|
|
|
|
|
|
(define (home-herbstluftwm-autostart-file config)
|
|
|
|
(apply mixed-executable-file
|
|
|
|
"autostart"
|
|
|
|
"#!" zsh "/bin/zsh\n"
|
|
|
|
"herbstclient emit_hook reload\n"
|
|
|
|
"herbstclient keyunbind --all\n"
|
|
|
|
(let ((tags (home-herbstluftwm-configuration-tags config)))
|
|
|
|
(append (list "herbstclient mouseunbind --all\n")
|
|
|
|
(map (lambda (binding)
|
|
|
|
(format #f "herbstclient mousebind ~a ~a\n"
|
|
|
|
(car binding) (cdr binding)))
|
|
|
|
(home-herbstluftwm-configuration-mouse-bindings config))
|
|
|
|
(map (lambda (setting)
|
|
|
|
(format #f "herbstclient set ~s ~s\n"
|
|
|
|
(car setting) (cdr setting)))
|
|
|
|
(home-herbstluftwm-configuration-settings config))
|
|
|
|
(map (lambda (tag)
|
|
|
|
(format #f "herbstclient add ~s\n" tag))
|
|
|
|
tags)
|
|
|
|
(map (lambda (key tag)
|
|
|
|
(format #f "herbstclient keybind Mod4-~a use ~s\n" key tag))
|
|
|
|
(take (home-herbstluftwm-configuration-tag-keys config)
|
|
|
|
(length tags))
|
|
|
|
tags)
|
|
|
|
(if (> (length tags) 0)
|
|
|
|
(list "herbstclient merge_tag default\n")
|
|
|
|
'())
|
|
|
|
(map (lambda (attribute-pair)
|
|
|
|
(format #f "herbstclient attr ~a ~s\n"
|
|
|
|
(string-join (map symbol->string (car attribute-pair)) ".")
|
|
|
|
(cdr attribute-pair)))
|
|
|
|
(home-herbstluftwm-configuration-attributes config))
|
|
|
|
(list "herbstclient unrule -F\n")
|
|
|
|
(map (lambda (rule)
|
|
|
|
(format #f "herbstclient rule ~a\n"
|
|
|
|
(string-join rule " ")))
|
|
|
|
(home-herbstluftwm-configuration-rules config))
|
|
|
|
(list "herbstclient unlock\n"
|
|
|
|
(format #f "herbstclient pad ~a\n"
|
|
|
|
(string-join (map number->string (home-herbstluftwm-configuration-padding config)) " ")))
|
|
|
|
(map (lambda (layout-pair)
|
|
|
|
(format #f "herbstclient load ~s '~s'\n"
|
|
|
|
(car layout-pair)
|
|
|
|
(cdr layout-pair)))
|
|
|
|
(home-herbstluftwm-configuration-layouts config))
|
|
|
|
(map (lambda (line)
|
|
|
|
(format #f "herbstclient ~a\n" line))
|
|
|
|
(home-herbstluftwm-configuration-extra config))))))
|
|
|
|
|
2022-04-14 10:39:25 +02:00
|
|
|
(define (add-herbstluftwm-executable config)
|
|
|
|
(home-xsession-extension
|
|
|
|
(wm
|
|
|
|
(list
|
|
|
|
(mixed-text-file
|
|
|
|
"xsession"
|
2022-04-15 09:48:15 +02:00
|
|
|
"exec " herbstluftwm "/bin/herbstluftwm --autostart " (home-herbstluftwm-autostart-file config))))))
|
2022-04-14 10:39:25 +02:00
|
|
|
|
|
|
|
(define home-herbstluftwm-service-type
|
|
|
|
(service-type
|
|
|
|
(name 'home-herbstluftwm)
|
|
|
|
(extensions
|
|
|
|
(list (service-extension
|
|
|
|
home-profile-service-type
|
|
|
|
add-herbstluftwm-packages)
|
|
|
|
(service-extension
|
|
|
|
home-xsession-service-type
|
|
|
|
add-herbstluftwm-executable)))
|
|
|
|
(compose identity)
|
|
|
|
(default-value (home-herbstluftwm-configuration))
|
|
|
|
(description "Install and configure herbstluftwm.")))
|