Exploring dwl-guile: A Wayland Compositor for Guile and Guix

Updates

Let's try dwl-guile!

I've mentioned a few times recently that I've really enjoyed using Wayland via Sway recently. It's the future! However, we haven't really seen many Lisp or Scheme-based compositors yet.

dwl-guile is a fork of the dwl Wayland Compositor (which is a port of dwm).

dwl-guile was developed to be used with GNU Guix! There is a custom Guix channel which also provides a Guix Home service for configuring the window manager:

https://github.com/engstrand-config/home-service-dwl-guile

Today we'll see if we can get dwl-guile up and running and see if it can be a solid addition to our modern, Lisp-based system crafting toolset!

To get things running, I added the home-service-dwl-guile channel to my Guix Channel configuration:

(channel
  (name 'home-service-dwl-guile)
  (url "https://github.com/engstrand-config/home-service-dwl-guile")
  (branch "main")
  (introduction
    (make-channel-introduction
      "314453a87634d67e914cfdf51d357638902dd9fe"
      (openpgp-fingerprint
        "C9BE B8A0 4458 FDDF 1268 1B39 029D 8EB7 7E18 D68C"))))

I then installed dwl-guile and created a configuration file called dwl-config.scm.

I ran it like this:

dwl-guile -c dwl-config.scm

The final configuration

;; Inhibit the defaults so that we can control the keys!
(setq inhibit-defaults? #t)

;; THINGS TO FIGURE OUT:
;; - Setting the background image (swaybg?)
;; - Fixing ctrl:nocaps
;; - Settings desired layouts and switching them
;; - Set up swaylock/swayidle

;; Start the repl, connect via M-x geiser-connect-local RET /tmp/dwl-guile.socket RET
(dwl:start-repl-server)

(set-monitor-rules
 '((name . "HDMI-A-1")
   (x . 0) (y . 0)
   (masters . 1)
   (master-factor . 0.55)
   (width . 2560)
   (height . 1440)
   (scale . 2))

 `((name . "eDP-2")
   (width . 3840)
   (height . 2160)
   (scale . 2)
   (x . 2560) (y . ,(- (/ 2160 2)
                       (/ 1440 2)))))

(set-xkb-rules '((layout . "us")
                 (options . "ctrl:nocaps")))

(setq tags (list "chat" "dev" "web" "media" "misc"))

(dwl:set-tty-keys "C-M")
(dwl:set-tag-keys "s" "s-S")

(set-keys "s-<space>" '(dwl:spawn "fuzzel" "--no-fuzzy")
          ;; (dwl:spawn "fuzzel -w 50 -x 8 -y 8 -r 3 -b 232635ff -t A6Accdff -s A6Accdff -S 232635ff -C c792eacc -m c792eacc -f \"Iosevka Aile:weight=light:size=11\" --no-fuzzy --icon-theme=\"Papirus-Dark\"")
          "s-<return>" '(dwl:spawn "emacsclient" "-c")
          "s-j" '(dwl:focus-stack 1)
          "s-k" '(dwl:focus-stack -1)
          "s-l" '(dwl:change-master-factor 0.05)
          "s-h" '(dwl:change-master-factor -0.05)
          "s-<page-up>" '(dwl:change-masters 1)
          "s-<page-down>" '(dwl:change-masters -1)
          "s-t" '(dwl:cycle-layout 1)
          "s-<left>" '(dwl:focus-monitor 'DIRECTION-LEFT)
          "s-<right>" '(dwl:focus-monitor 'DIRECTION-RIGHT)
          "s-<up>" '(dwl:focus-monitor 'DIRECTION-UP)
          "s-<down>" '(dwl:focus-monitor 'DIRECTION-DOWN)
          "s-S-<left>" '(dwl:tag-monitor 'DIRECTION-LEFT)
          "s-S-<right>" '(dwl:tag-monitor 'DIRECTION-RIGHT)
          "s-S-<up>" '(dwl:tag-monitor 'DIRECTION-UP)
          "s-S-<down>" '(dwl:tag-monitor 'DIRECTION-DOWN)
          "s-q" 'dwl:kill-client
          "s-<tab>" 'dwl:view
          "s-S-0" '(dwl:view 0) ;; 0 will show all tags
          "s-f" 'dwl:toggle-fullscreen
          "S-s-<space>" 'dwl:toggle-floating
          "S-s-q" 'dwl:quit
          "s-<mouse-left>" 'dwl:move
          "s-<mouse-middle>" 'dwl:toggle-floating
          "s-<mouse-right>" 'dwl:resize)

;; Configure gaps
(dwl:change-gaps 5)

;; Launch helpful programs after init
(add-hook! dwl:hook-startup
           (lambda ()
             (dwl:spawn "setxkbmap" "-option" "ctrl:nocaps")
             (dwl:spawn "waybar")
             (dwl:spawn "dunst")
             (dwl:spawn "nm-applet" "--indicator")
             (dwl:spawn "udiskie" "-t")
             (dwl:spawn "emacs")))

Enjoyed this stream? Explore our hands-on courses for deeper, structured learning on Guile Scheme and more.

Get the System Crafters Newsletter
Updates on open source tools, tutorials, and community projects. We'll also occasionally let you know about new courses and resources.
Name (optional)
Email Address