riverguile
Scripting layer for the river Wayland server using Guile Scheme. Send commands to river and install handlers for various events, including layout demands.
The ultimate aim of giverguile is to allow comfortable scripting in the context of desktop operations, including window management.
"So, the UNIX philosophy is nice and all, but I wish I could script my desktop in a way that's a bit more integrated and less hacky."
Do you agree with that statement? Do you like Lisp / Scheme? Do you believe policy over mechanism is the only sane way to design a scripting API? Then riverguile might be what you want!
Riverguile follows river development closely, exposing new functionality as scheme procedures and advocating for even more scripting features. Right now, riverguile is implemented as an interpreter for river init scripts.
#!/bin/env riverguile
!#
(use-modules (riverguile))
;; Lock the screen after five minutes and darken the screen.
(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)))))
;; Replicate rivertile.
(R default-layout riverguile)
(install-handler 'layout-demand (lambda (view-count width height tags output)
(layout:split view-count 0 0 width height)))