riverguile
Layout generator for the river Wayland
server which uses Guile Scheme for
layouts. Its layout namespace is riverguile.
Uppon launch, riverguile tries to eval 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
This script must contain the definition of a function
(layout-demand-handler view-count usable-width usable-height) and
may contain any other code the user desires. The function must return
a list containing exactly as many lists as view-count. Each of those
sublists must contains exactly four numerical values, which are the x
and y coordinates of the window as well as its width and height.
Window positions and dimensions get applied to rivers
window list top to bottom.
Example of valid output:
scheme@(guile-user)> (display (layout-demand-handler 3 1080 1920))
((0 0 594.0 1920) (594.0 0 486.0 960) (594.0 960 486.0 960))
Note that the numerical values do not need to be exact, riverguile takes care of rounding and casting for you.
You can send riverguile layout-commands, which it will try to eval as scheme code.
riverctl map normal Super U send-layout-cmd riverguile "(define gaps 20)"
Here is an example layout.scm file replicating rivertiles behavior of having
a main window and a stack of windows aside:
(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)))))
(define (layout-demand-handler view-count width height)
(layout:split view-count 0 0 width height))