Sawfish
m (Minor changes)
Line 1: Line 1:
This page compares window managers extensible with scripting languages.
+
This page compares window managers '''extensible''', or '''programmable''', so to say, with scripting languages.
   
 
== What's "extensible window managers"? ==
 
== 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.
+
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 ==
 
== Basics comparison ==
Line 8: Line 8:
 
{| class="wikitable"
 
{| class="wikitable"
 
|+Comparison of basic features
 
|+Comparison of basic features
|+Comparison of basic features
+
|+Comparison of basic features<!-- Dunno why, but GUI editor of this site duplicates the caption. It doesn't harm, though.-->
 
! Window Manager
 
! Window Manager
 
! Language
 
! Language
Line 18: Line 18:
 
| Partial
 
| Partial
 
|-
 
|-
| [http://common-lisp.net/project/clfswm/ CLFSWM] || Common Lisp || {{tableYes|Yes}} || Dynamic = Tiling and Stacking || Very partial
+
| [http://common-lisp.net/project/clfswm/ CLFSWM] || Common Lisp(s) || {{tableYes|Yes}} || Dynamic = Tiling and Stacking || Very partial
 
|-
 
|-
 
| [https://github.com/sabetts/stumpwm/wiki StumpWM] || Common Lisp(s) || {{tableYes}} || Tiling || ?
 
| [https://github.com/sabetts/stumpwm/wiki StumpWM] || Common Lisp(s) || {{tableYes}} || Tiling || ?
Line 27: Line 27:
 
| {{tableYes}}
 
| {{tableYes}}
 
|-
 
|-
| [http://qtile.org/ Qtile] || Python || {{tableNo}} || Dynamic = Tiling and Stacking || ?
+
| [http://qtile.org/ Qtile] || Python2 || {{tableNo}} || Dynamic = Tiling and Stacking || ?
 
|-
 
|-
 
| [http://subforge.org/projects/subtle/wiki Subtle] || Ruby || {{tableYes}} || Dynamic grid tiling and stacking || {{tableYes}}
 
| [http://subforge.org/projects/subtle/wiki Subtle] || Ruby || {{tableYes}} || Dynamic grid tiling and stacking || {{tableYes}}
Line 47: Line 47:
 
With repl, users can run their own scripts on-the-fly. Repl stands for "read-eval-print-loop".
 
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.
 
* '''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 maner, with a common-lisp's repl available.
+
* 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 '''Awesome''', you can use "awesome-client" command.
 
* In '''Subtle''', you can use either [http://subforge.org/projects/subtle/wiki/Subtler subtler] (subtle remote) on the commandline or the Ruby extension [http://subforge.org/projects/subtle/wiki/Subtlext subtlext] in a custom script.
 
* In '''Subtle''', you can use either [http://subforge.org/projects/subtle/wiki/Subtler subtler] (subtle remote) on the commandline or the Ruby extension [http://subforge.org/projects/subtle/wiki/Subtlext subtlext] in a custom script.
Line 62: Line 62:
 
{| class="wikitable"
 
{| class="wikitable"
 
|+Comparison of visual effects
 
|+Comparison of visual effects
|+Comparison of visual effects
+
|+Comparison of visual effects<!-- Dunno why, but GUI editor of this site duplicates the caption. It doesn't harm, though.-->
 
! Window Manager
 
! Window Manager
 
! Configurable titlebar / Themable
 
! Configurable titlebar / Themable
Line 75: Line 75:
 
| {{tableYes|Yes. sawfish-pager understands lisp, and communicates with the window manger in lisp.}} || No (But there's "apps-menu". See below.) || {{tableYes|Yes (yet primitive)}} || ?
 
| {{tableYes|Yes. sawfish-pager understands lisp, and communicates with the window manger in lisp.}} || No (But there's "apps-menu". See below.) || {{tableYes|Yes (yet primitive)}} || ?
 
|-
 
|-
| CLFSWM || {{tableNo|All colors can be changed.}} || {{tableNo}} || No, "You're in pager". || No, but there's the application launcher menu. See below. || No. You don't need tabs in CLFSWM. || {{tableYes|Yes, with an external manager such as xcompmgr}}
+
| CLFSWM || {{tableNo|No. All can be changed is colors.}} || {{tableNo}} || No, you don't need one. "You're in pager". || No, but there's the application launcher menu. See below. || No. You don't need tabs in CLFSWM. || {{tableYes|Yes, with an external manager such as xcompmgr}}
 
|-
 
|-
 
| StumpWM || {{tableNo}} || {{tableNo}} || ? || ? || {{tableNo}} || ?
 
| StumpWM || {{tableNo}} || {{tableNo}} || ? || ? || {{tableNo}} || ?
Line 101: Line 101:
   
 
=== Configuration with GUI ===
 
=== Configuration with GUI ===
In Sawfish, basic configurations can be done via GUI, which includes
+
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.
+
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.
 
It profits both for newbies and experienced users.
 
   
 
=== Pager ===
 
=== Pager ===
Line 120: Line 118:
 
{| class="wikitable"
 
{| class="wikitable"
 
|+Comparison of inputs
 
|+Comparison of inputs
  +
|+Comparison of inputs<!-- Dunno why, but GUI editor of this site duplicates the caption. It doesn't harm, though.-->
|+Comparison of inputs
 
 
! Window Manager
 
! Window Manager
 
! Supports [[#XKB|XKB]]
 
! Supports [[#XKB|XKB]]
Line 161: Line 159:
   
 
=== Input translation per window ===
 
=== Input translation per window ===
In '''Sawfish''', you can configure each window with "key translation". That means e.g. when you type <code>Control-X</code> on the xterm, you can make it receive <code>Meta-Z</code>.
+
In '''Sawfish''', you can configure each window with "key translation". For example, by typing <code>Control-X</code> on the xterm, it'll turn into <code>Y</code>.
  +
  +
For example, you can choose "ctrl-q" to close all applications, even for softwares that don't allow key-binding configuration.
   
 
=== Extra mouse features ===
 
=== Extra mouse features ===
Line 171: Line 171:
 
{| class="wikitable"
 
{| class="wikitable"
 
|+Comparison of screen related issues
 
|+Comparison of screen related issues
|+Comparison of screen related issues
+
|+Comparison of screen related issues<!-- Dunno why, but GUI editor of this site duplicates the caption. It doesn't harm, though.-->
 
! Window Manager
 
! Window Manager
 
! Supports [[#Large desktop|large desktop]]
 
! Supports [[#Large desktop|large desktop]]
Line 197: Line 197:
 
=== Large desktop ===
 
=== 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.
 
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 ===
 
=== Multiple monitors ===
Line 207: Line 209:
 
{| class="wikitable"
 
{| class="wikitable"
 
|+Comparison of community and development status
 
|+Comparison of community and development status
|+Comparison of community and development status
+
|+Comparison of community and development status<!-- Dunno why, but GUI editor of this site duplicates the caption. It doesn't harm, though.-->
 
! Window Manager
 
! Window Manager
 
! Good Quickstart Guide
 
! Good Quickstart Guide
Line 254: Line 256:
   
 
=== CLFSWM ===
 
=== CLFSWM ===
  +
(Next) key bindings are shown on the screen, so easy to use for newbies.
  +
 
=== StumpWM ===
 
=== StumpWM ===
   
Line 282: Line 286:
   
 
=== Qtile ===
 
=== Qtile ===
Qtile's memory leak issue is terrible. (Running for a couple of days will reach a Gig byte.)
+
(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.
   
 
=== Subtle ===
 
=== Subtle ===

Revision as of 09:25, 15 August 2012

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 Python2 No Dynamic = Tiling and Stacking ?
Subtle Ruby Yes Dynamic grid tiling and stacking Yes

Window Manager

Language Repl Type ICCCM / EWMH Compliance

Tiling

  • 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.

Repl

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.

Some don't have Repl:

  • In XMonad, user-written xmonad codes need compilation, although GHC, the Haskell compiler, has repl.
  • In Qtile, you have to restart.

ICCCM / EWMH

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 No. All can be changed is colors. No No, you don't need one. "You're in 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 ?
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
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

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

Taskbar

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
Window Manager Supports XKB Input event synthesis Per-window key binding Input translation per window "Extra" mouse features Undo / history

XKB

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.

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.
CLFSWM No Yes
StumpWM ? ?
Xmonad No? Yes
Awesome No Yes
Qtile No? Yes
Subtle 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" (what's "tag" exactly?) 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
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

Sawfish

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, liprep, 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.

CLFSWM

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

StumpWM

Xmonad

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.

Awesome

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.

Qtile

(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.

Subtle

(Obsolete, fixed in Ruby 1.9.3) It wasn't Subtle but ruby, but every 10ms a wakeup happens. Further readings: [1] [ttp://bugs.ruby-lang.org/issues/3919].

Others

wmii

Wmii homepage.

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

pwm

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