diff options
| author | Arnaud Daby-Seesaram <ds-ac@nanein.fr> | 2025-09-08 15:13:22 +0200 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2025-09-14 18:13:07 +0200 |
| commit | 0b0f8702ea89de6fa0dd2e4ef18717001b395c1b (patch) | |
| tree | 631a31c34f0c9a949f143d543af516a6e5487767 /gnu | |
| parent | b05fc57386d37c592d56bd9f52b66f4c57f472f5 (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.scm | 84 |
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 |
