This page compares window managers extensible, or programmable, so to say, with scripting languages.

What's "extensible window managers"?[]

Window managers are 'event-driven' - they react when a window appears, or the user presses some keys, etc. In extensible window managers, users can freely override, or newly define those reactions by scripting. Triggers include timers, window changes of title or geometry, etc.

Basics comparison[]

Comparison of basic features Comparison of basic features
Window Manager Language Repl Type ICCCM / EWMH Compliance
Sawfish Librep (a Lisp dialect, mixture of Emacs Lisp and Scheme) Yes Stacking Partial
CLFSWM Common Lisp(s) Yes Dynamic = Tiling and Stacking Very partial
StumpWM Common Lisp(s) Yes Tiling ?
XMonad Haskell No Dynamic = Tiling and Stacking Yes ( Wikipedia says you have to turn it on.)
Awesome Lua Yes Dynamic = Tiling and Stacking Yes
Qtile (See also Tilenol below) Python 3 No Dynamic = Tiling and Stacking ?
Subtle Ruby Yes Dynamic grid tiling and stacking Yes
KWin JavaScript, QML Yes Stacking

Tiling is available by 3rd-party extensions

style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" |Yes

Window Manager

Language Repl Type ICCCM / EWMH Compliance


  • CLFSWM's frame model is unique. With its parent-children structure, you don't need pager, tabbing, nor workspaces (= virtual desktops.)
  • Subtle simply divides the screen into "grids", 3x3 by default, allowing quick maneuver.
  • KWin: the following 3rd party tiling extensions are available:


With repl, users can run their own scripts on-the-fly. Repl stands for "read-eval-print-loop".

  • Sawfish's repl is available from both console and Emacs, and supports tab-completion for function and variable names.
  • In CLFSWM, common-lisp's repl is available. You can also use CLFSWM in a client/server manner, with a common-lisp's repl available.
  • In Awesome, you can use "awesome-client" command.
  • In Subtle, you can use either subtler (subtle remote) on the commandline or the Ruby extension subtlext in a custom script.
  • In KWin, you can execute a script file through a D-Bus interface or use the Desktop Scripting console integrated in Plasma Desktop.
  • Qtile has several repl options.

Some don't have Repl:

  • In XMonad, user-written xmonad codes need compilation, although GHC, the Haskell compiler, has repl.


ICCCM and EWMH specify window manager standards.

Visual effects comparison[]

Comparison of visual effects Comparison of visual effects
Window Manager Configurable titlebar / Themable Configuration with GUI Pager Taskbar and Application starter Tabbed windows Compositing
Sawfish Yes Yes Yes. sawfish-pager understands lisp, and communicates with the window manger in lisp. No (But there's "apps-menu". See below.) Yes (yet primitive) ?
CLFSWM Yes, all configuration variables can be tweaked. Yes, with CLFSWM standard menu No, you don't need one. "You're in the pager". No, but there's the application launcher menu. See below. No. You don't need tabs in CLFSWM. Yes, with an external manager such as xcompmgr
StumpWM No No ? ? No Yes, with an external manager such as compton
xmonad Yes No? ? third-party Yes Yes, with xmonad-contrib and an external manager
Awesome Yes No 3rd party pagers It's been broken. Yes
Qtile Yes No No Yes ? No
Subtle Yes (Called "style") Styles can be customized with the styler from subtle-contrib 3rd party pagers Yes. Quite configurable No 3rd party compositors
KWin Yes Yes No No Yes Yes
Window Manager Configurable titlebar Configuration with GUI Pager Taskbar Tabbed windows Compositing

Configuration with GUI[]

In Sawfish, basic configurations can be done via GUI, which includes setting boolean, choice, and number type variables, key bindings, "window rules" (Per-window geometry, style, etc options.) GUI reads from and writes to a lisp file. GUI configuration profits both for newbies and experienced users.


Pager shows the thumbnail of the screen, for some or all of the large desktop and workspaces.


Taskbar differs among window managers / desktop environments, but basically they show present windows in icon / by name, and sometimes offer a launcher of some applications.

  • In Sawfish there's no taskbar, but a launcher of applications is offered. It's automatically generated from softwares you installed, and at the same time highly configurable. It's called 'apps-menu'. Of course you can use third-party taskbars.
  • CLFSWM offers a menu to run apps. The applications menu is dynamically generated, but the default list is written by hand.
  • Qtile has a taskbar with system tray.

Input Comparison[]

Comparison of inputs Comparison of inputs
Window Manager Supports XKB Input event synthesis Per-window key binding Input translation per window "Extra" mouse features Undo / history
Sawfish No Yes Yes Yes See below No undo. Remembers only the last operation.
CLFSWM You can use either keysyms or keycodes Yes ? ? See below Not yet.
StumpWM ? ? ? ? No, mouse is completely ignored. ?
Xmonad Yes ? ? No ? ?
Awesome No Yes Yes No ? ?
Qtile Yes Yes Unless you resort to kludge Probably no No No
Subtle Yes Yes Yes Yes Yes Yes
KWin Yes No ? No Yes No
Window Manager Supports XKB Input event synthesis Per-window key binding Input translation per window "Extra" mouse features Undo / history


Without XKB support, some combinations of modifiers and the main key are not recognized. (See the output of xmodmap -pk. Keys with "NoSymbol" will be ignored.)

For example, in German layout you can't bind ° (degree sign) key.

Input event synthesis[]

The window manager allows you to generate a fake keyboard / mouse event.

Input translation per window[]

In Sawfish, you can configure each window with "key translation". For example, by typing Control-X on the xterm, it'll turn into Y.

For example, you can choose "ctrl-q" to close all applications, even for softwares that don't allow key-binding configuration.

Extra mouse features[]

  • Sawfish provides "edge-action": when the mouse pointer hits each of the screen edge / corner, a hook is called. For example, you can make the drag of a window to the top edge maximize that window.
  • CLFSWM has it, too, called "corner" (But not edges). BTW there is a mouse motion hook, feel free to add any actions you want when the mouse hit the edge.
  • KWin supports screen edges. Scripts need to register for the edge and a callback is executed when the edge is hit.

Screen comparison[]

Comparison of screen related issues Comparison of screen related issues
Window Manager Supports large desktop Supports multilple monitors
Sawfish Yes Xinerama (treat as one big screen), only primitive.
StumpWM ? Yes
Xmonad No? Yes
Awesome No Yes
Qtile No? Yes
Subtle No? Yes
KWin No Yes
Window Manager Supports large desktop Supports multilple monitors

Large desktop[]

The desktop can be extended larger than the physical monitor. This must be good even for tiling window managers, because its geometrical structure appeals to your intuition, unlike workspace = virtual desktop.

Many modern window managers supports tiling, and tiling window managers usually don't have large desktops.

Multiple monitors[]

  • Xmonad's multi-screen help is well written.
  • In Awesome, you can switch virtual desktops per monitor independently, which feature is not so common yet among other window managers.
    On the other hand, Awesome doesn't seem to manage "tags" (Awesome's way of managing workspaces) common to monitors, according to a blog post (in Japanese).
  • In CLFSWM, by default, there is a root frame per monitor. Managing windows is done as usual in the CLFSWM way.

Community and Development Status[]

Comparison of community and development status Comparison of community and development status
Window Manager Good Quickstart Guide Code repository Mailing list
Sawfish No Download#GIT Gmane archive
CLFSWM See here gitweb Several MLs
StumpWM So-so (See "Introduction") gitweb Gmane archive
Xmonad Excellent. See the guide tour. download; explore latest code Gmane archive
Awesome So-so gitweb Gmane archive
Qtile No github site google group
Subtle Very good. See wiki Mercurial web interface No ML? See Forum or IRC
KWin Tutorial and API documentation and Effect documentation gitweb Listinfo
Window Manager Good Quickstart Guide Code repository Mailing list
  • Xmonad's website is best organized, and manuals are easy to locate what you're searching.
  • Subtle has a very good wiki, too.
  • Sawfish may be the most scattered.

See the source code repositories and mailing list archives to see how active they are. All are developed (more than) moderately now.

Mailing list activity
(Don't differ much, updated Sep 2011)

Pros and Cons[]


Since it's stacking, new users can use it without any preparation.

Users can easily override the system-installed lisp file, say /usr/share/sawfish/.../lisp/foo/bar.jl with ~/.sawfish/lisp/foo/bar.jl. You can add as many such directories as you want, enabling separation of stable and testing codes.

The language, librep, is not an authentic Scheme. It's only for Sawfish, and obsolete in many aspects. Rewrite in some Scheme is desired, but it's not so much likely to happen.

In some distros (e.g. Debian), it's not up-to-date.


(Next) key bindings are shown on the screen, so easy to use for newbies.



Haskell is quite abstruse.

Any change to the system often requires serious reconsideration of many other aspects of the code. - a blog article

I don't know Haskell very well at all. Although I am a developer[...] I find Haskell's syntax annoyingly confusing. However, I have a pretty extensive and very customized xmonad.hs file. I was able to create it by reading documentation, and asking the xmonad mailing list many many specific questions. And the investment has been well worth it. The community around xmonad is fantastic. It's really active, and very responsive and supportive. - a message in mailing list

Dependency on haskell is not usually considered a problem. See for example this discussion.


Lua is relatively easy.

I couldn't like the customization file which looked like an extraction of the core code. - a blog article (Japanese)

Awesome supports D-Bus, thus supports notification-spec, so e.g. "notify-send" and kde apps send their notification to Awesome.

Awesome is easy to try, but Awesome may be less flexible than other extensible window managers since core codes are in C. so if you feel discontent, you can turn to others.

Some people feel Awesome is unstable, crashing sometimes. At the same time, Awesome is very popular, so most don't suffer from it.

Old defects[]

Awesome's configuration file used to change too quickly, but it doesn't any more.


(Obsolete, fixed in xpyb-1.3, released in March 2012.) Qtile's memory leak issue was terrible. Running for a couple of days would reach a Gig byte.


(Obsolete, fixed in Ruby 1.9.3) It wasn't Subtle but ruby, but every 10ms a wakeup happens. Further readings: [1] [2].


Although KWin is the window manager of the KDE Plasma Workspaces it can be used with other desktop shells, for example it works well with Razor-Qt. The scripting capabilities are very extensive and used to also implement core features. All user visible elements are written in QML, many animations are written in JavaScript, some functionality is provided as scripts written in JavaScript. For scripting features at least version 4.9 is required, this is not available in Debian Wheezy.



Tilenol homepage (github)

Tilenol is written in Python3, heavily influenced by Qtile.


Wmii homepage.

Though it's not scriptable in strict sense, it seems it's nearly so. Recently the development is not so active.


pwm stands for "perl window manager", and it's entirely written in perl, so you can customize it. No visual frill. Written in 2010-2012.

External links[]