This makes the logic of installing idle handlers and layout handlers a bit cleaner and allows us to send wayland request from the script in the future.
54 lines
2.1 KiB
Markdown
54 lines
2.1 KiB
Markdown
# riverguile
|
|
|
|
Scripting layer for the [river](https://github.com/riverwm/river) Wayland
|
|
server using [Guile Scheme](https://www.gnu.org/software/guile/).
|
|
|
|
Send commands to river and install handlers for various events, inclusing
|
|
layout events.
|
|
|
|
Uppon launch, riverguile tries to load a scheme script and checks the following
|
|
paths for it in the given order:
|
|
|
|
* `layout.scm`
|
|
* `$XDG_CONFIG_HOME/river/layout.scm`
|
|
* `$HOME/.config/river/layout.scm`
|
|
* `/etc/riverguile/layout.scm`
|
|
|
|
In the context of this script, a special procedure `(install-handler key proc)`
|
|
is available, which can be used to install handlers to certain events.
|
|
Check the man page for more information.
|
|
|
|
Here is an example `layout.scm` file replicating rivertiles behavior of having
|
|
a main window and a stack of windows aside while also automatically locking
|
|
the screen after five minutes of inactivity.
|
|
|
|
```scheme
|
|
(install-handler 'idle:300 (lambda (event)
|
|
(cond ((eq? event 'idle) (system "swaylock &")
|
|
(system "backlight.sh set-to 40"))
|
|
((eq? event 'resume) (system "backlight.sh set-to 100")))))
|
|
|
|
(define split 0.55)
|
|
|
|
(define (layout:rows n x y w h)
|
|
(letrec ((height (/ h n))
|
|
(rows (lambda (n)
|
|
(if (eq? n 0)
|
|
'()
|
|
(let ((Y (- (+ y h) (* n height))))
|
|
(append (list (list x Y w height))
|
|
(rows (- n 1))))))))
|
|
(rows n)))
|
|
|
|
(define (layout:split n x y w h)
|
|
(if (eq? n 1)
|
|
(list (list x y w h))
|
|
(letrec* ((left (* split w))
|
|
(right (- w left)))
|
|
(append (list (list x y left h))
|
|
(layout:rows (- n 1) (+ x left) y right h)))))
|
|
|
|
(install-handler 'layout-demand (lambda (view-count width height tags output)
|
|
(layout:split view-count 0 0 width height)))
|
|
```
|