A Window Manager Toolkit for Guile Scheme
TeX Scheme Shell

README

                         ━━━━━━━━━━━━━━━━━━━━━
                                GUILE-WM


                              Mark Witmer
                          mark@markwitmer.com
                         ━━━━━━━━━━━━━━━━━━━━━


Table of Contents
─────────────────

1 Overview
2 Why?
3 What's Actually Implemented
4 What's Not Implemented
.. 4.1 Wish List
.. 4.2 Even Crazier Wish List
5 Sample
6 Installation and Prerequisites





1 Overview
══════════

  Guile-WM is a framework for creating an X window manager (or any other
  X application, really) and a set of useful modules designed for that
  purpose. Users are encouraged to pick and choose from ones presently
  available and contribute their own as well!

  Guile-WM relies /heavily/ on its user init file. In fact, it won't do
  anything on its own without one. The intention is to provide something
  100% configurable.


2 Why?
══════

  Guile Scheme is just so much fun to work with, I wanted to build my
  house out of it. (Also, StumpWM won't work in my Linux distribution
  right now. And I find LOOP macros unsettling for some reason.)

  I didn't want to build a WM on top of xlib. It's obsolete, or should
  be, anyway. XCB is great, and when I saw that it comes with XML files
  that describe the X protocol so that you can easily implement an X
  client in a different language, I decided to build the whole X client
  stack in Scheme. Why not? So I made Guile XCB. And then, finally, I
  got to work on this.


3 What's Actually Implemented
═════════════════════════════

  • keymaps/minibuffer/user-defined commands: The usual emacs-style
    stuff.
  • A tiling window manager inspired by Stumpwm, as well as a drag/drop
    window manager inspired by tinywm
  • Built-in repl: make changes to the WM while it's running, talk to
    the X server directly (if you're into that kind of thing), integrate
    with Geiser in Emacs, etc. (Note: if you call a procedure that talks
    to the X server, use the metacommand ,post to evalute the
    expression.  That way it'll run inside the event loop on the other
    thread).
  • Some icccm support
  • And more! It's completely open, so you could implement whatever
    window-management paradigm you like.


4 What's Not Implemented
════════════════════════

  There's a lot more I'd like to do, but as you can see, it gets
  progressively more grandiose and, um… crazy, perhaps.


4.1 Wish List
─────────────

  • Some kind of window decoration
  • Built-in replacements for those little X utility programs (xmodmap,
    xsetbg, etc.) I did part of xrandr as a proof-of-concept.
  • A status bar/modeline type thing
  • Antialiased fonts! guile-pango would be good for this.
  • Whatever else you want… ideas (and implementations) welcome.


4.2 Even Crazier Wish List
──────────────────────────

  • Implement enough of a widget toolkit to actually run Guile Emacs
    inside of Guile-WM all on Guile XCB. You would basically be running
    a Lisp-machine at that point and all of your friends will be
    jealous.
  • Add support for XInput2 to Guile XCB w/touch gestures and whatnot
    and build a hackable mobile device interface. Isn't it a tragedy
    that smartphones are becoming the most common type of computer, but
    you can't really hack on them? Real XCB does support XInput2 now, so
    I'm running out of excuses…
  • Build a WM on top of Wayland. That would require a Scheme Wayland
    client, which could be built along the lines of Guile XCB, since the
    Wayland projects comes with the same kind of XML spec files that XCB
    uses.


5 Sample
════════

  An annotated sample init file is included with the distribution as
  "wm-init-sample.scm". It demonstrates how to set up the configurable
  values in the available modules. Copy it to ~/.guile-wm to try it out.


6 Installation and Prerequisites
════════════════════════════════

  You can use the typical ./configure, make, make install chain to build
  Guile-WM.

  Guile-WM requires Guile XCB and the latest release of Guile (2.0.9).