Leon Henrik Plickat 098f15860c replace scm_c_primitive_load() with scm_primitive_load()
The c version does not auto-compile scripts, the other version
however does.
2023-12-29 11:33:00 +01:00
2023-11-24 23:17:18 +01:00
2023-11-25 16:22:09 +01:00
2023-11-25 16:33:19 +01:00
2023-11-24 23:17:18 +01:00
2023-11-25 21:01:53 +01:00

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))
Languages
C 87.2%
Scheme 7.8%
Makefile 3.5%
Nix 1.5%