summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorArnaud Daby-Seesaram <ds-ac@nanein.fr>2025-09-08 15:13:22 +0200
committerLudovic Courtès <ludo@gnu.org>2025-09-14 18:13:07 +0200
commit0b0f8702ea89de6fa0dd2e4ef18717001b395c1b (patch)
tree631a31c34f0c9a949f143d543af516a6e5487767 /gnu
parentb05fc57386d37c592d56bd9f52b66f4c57f472f5 (diff)
home: services: Support options for bindings in sway-service-type.
* gnu/home/services/sway.scm (make-alist-predicate): Add an optional argument. (bindings?): Remove procedure. (keybinding-options?): New procedures. (codebinding-options?): New procedures. (gesture-options?): New procedures. (mouse-bindings?): Allow to pass options to mouse-bindings. (sway-configuration) [keybindings]: Allow to pass options to key-bindings. [gestures]: Allow to pass options to gesture-bindings. (sway-mode) [keybindings]: Allow to pass options to key-bindings. (serialize-binding): Support options. (serialize-mouse-binding): Support options. (serialize-keybinding): Support options. (serialize-gesture): Support options. (serialize-variable): Inline previous definition. * doc/guix.texi (Sway window manager): Document this. Change-Id: Icf210aca4a9b44adc0baead7430637f6fcda17e5 Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'gnu')
-rw-r--r--gnu/home/services/sway.scm84
1 files changed, 62 insertions, 22 deletions
diff --git a/gnu/home/services/sway.scm b/gnu/home/services/sway.scm
index eebc65766ea..4e521091900 100644
--- a/gnu/home/services/sway.scm
+++ b/gnu/home/services/sway.scm
@@ -1,5 +1,5 @@
1;;; GNU Guix --- Functional package management for GNU 1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2024 Arnaud Daby-Seesaram <ds-ac@nanein.fr> 2;;; Copyright © 2024, 2025 Arnaud Daby-Seesaram <ds-ac@nanein.fr>
3;;; 3;;;
4;;; This file is part of GNU Guix. 4;;; This file is part of GNU Guix.
5;;; 5;;;
@@ -98,22 +98,54 @@
98(define (extra-content? extra) 98(define (extra-content? extra)
99 (every string-or-gexp? extra)) 99 (every string-or-gexp? extra))
100 100
101(define (make-alist-predicate key? val?) 101(define* (make-alist-predicate key? val? #:optional (options? (lambda _ #f)))
102 (lambda (lst) 102 (lambda (lst)
103 (every 103 (every
104 (lambda (item) 104 (lambda (item)
105 (match item 105 (match item
106 ((k v . o)
107 (and (key? k)
108 (val? v)
109 (options? o)))
106 ((k . v) 110 ((k . v)
107 (and (key? k) 111 (and (key? k)
108 (val? v))) 112 (val? v)))
109 (_ #f))) 113 (_ #f)))
110 lst))) 114 lst)))
111 115
112(define bindings? 116(define (keybinding-options? lst)
113 (make-alist-predicate symbol? string-or-gexp?)) 117 (every
118 (lambda (e)
119 (or (member e
120 '("no-warn" "whole-window" "border" "exclude-titlebar"
121 "release" "locked" "inhibited" "no-repeat"))
122 (string-prefix? "input-device=" e)))
123 lst))
124
125(define (codebinding-options? lst)
126 (every
127 (lambda (e)
128 (or (member e
129 '("no-warn" "whole-window" "border" "exclude-titlebar"
130 "release" "locked" "to-code" "inhibited" "no-repeat"))
131 (string-prefix? "input-device=" e)))
132 lst))
133
134(define (gesture-options? lst)
135 (every
136 (lambda (e)
137 (or (member e '("exact" "no-warn"))
138 (string-prefix? "input-device=" e)))
139 lst))
140
141(define key-bindings?
142 (make-alist-predicate symbol? string-or-gexp? keybinding-options?))
143
144(define gestures?
145 (make-alist-predicate symbol? string-or-gexp? gesture-options?))
114 146
115(define mouse-bindings? 147(define mouse-bindings?
116 (make-alist-predicate integer? string-or-gexp?)) 148 (make-alist-predicate integer? string-or-gexp? codebinding-options?))
117 149
118(define (variables? lst) 150(define (variables? lst)
119 (make-alist-predicate symbol? string-ish?)) 151 (make-alist-predicate symbol? string-ish?))
@@ -266,7 +298,7 @@
266 (string "default") 298 (string "default")
267 "Name of the mode.") 299 "Name of the mode.")
268 (keybindings 300 (keybindings
269 (bindings '()) 301 (key-bindings '())
270 "Keybindings.") 302 "Keybindings.")
271 (mouse-bindings 303 (mouse-bindings
272 (mouse-bindings '()) 304 (mouse-bindings '())
@@ -277,10 +309,10 @@
277 309
278(define-configuration/no-serialization sway-configuration 310(define-configuration/no-serialization sway-configuration
279 (keybindings 311 (keybindings
280 (bindings %sway-default-keybindings) 312 (key-bindings %sway-default-keybindings)
281 "Keybindings.") 313 "Keybindings.")
282 (gestures 314 (gestures
283 (bindings %sway-default-gestures) 315 (gestures %sway-default-gestures)
284 "Gestures.") 316 "Gestures.")
285 (packages 317 (packages
286 (list-of-packages 318 (list-of-packages
@@ -554,29 +586,37 @@
554(define-inlinable (serialize-boolean-ed b) 586(define-inlinable (serialize-boolean-ed b)
555 (if b "enable" "disable")) 587 (if b "enable" "disable"))
556 588
557(define-inlinable (serialize-binding binder key value) 589(define-inlinable (serialize-binding binder key value options)
558 #~(string-append #$binder #$key " " #$value)) 590 #~(string-append
591 #$binder
592 #$(string-join options " --" 'prefix) " "
593 #$key " " #$value))
559 594
560(define (serialize-mouse-binding var) 595(define (serialize-mouse-binding var)
561 (let* ((ev (car var)) 596 (match var
562 (ev-code (number->string ev)) 597 ((ev command . options)
563 (command (cdr var))) 598 (serialize-binding "bindcode" (number->string ev) command options))
564 (serialize-binding "bindcode " ev-code command))) 599 ((ev . command)
600 (serialize-binding "bindcode" (number->string ev) command '()))))
565 601
566(define (serialize-keybinding var) 602(define (serialize-keybinding var)
567 (let ((name (symbol->string (car var))) 603 (match var
568 (value (cdr var))) 604 ((name value . options)
569 (serialize-binding "bindsym " name value))) 605 (serialize-binding "bindsym" (symbol->string name) value options))
606 ((name . value)
607 (serialize-binding "bindsym" (symbol->string name) value '()))))
570 608
571(define (serialize-gesture var) 609(define (serialize-gesture var)
572 (let ((name (symbol->string (car var))) 610 (match var
573 (value (cdr var))) 611 ((name value . options)
574 (serialize-binding "bindgesture " name value))) 612 (serialize-binding "bindgesture" (symbol->string name) value options))
613 ((name . value)
614 (serialize-binding "bindgesture" (symbol->string name) value '()))))
575 615
576(define (serialize-variable var) 616(define (serialize-variable var)
577 (let ((name (symbol->string (car var))) 617 (let ((name (symbol->string (car var)))
578 (value (cdr var))) 618 (value (cdr var)))
579 (serialize-binding "set $" name value))) 619 #~(string-append "set $" #$name " " #$value)))
580 620
581(define (serialize-exec b) 621(define (serialize-exec b)
582 (if b 622 (if b
@@ -743,7 +783,7 @@
743 (computed-file 783 (computed-file
744 "sway-config" 784 "sway-config"
745 #~(begin 785 #~(begin
746 (use-modules (ice-9 format) (ice-9 match) 786 (use-modules (ice-9 format) (ice-9 match)
747 (srfi srfi-1)) 787 (srfi srfi-1))
748 788
749 (call-with-output-file #$output 789 (call-with-output-file #$output