This lists user-visible changes, and which releases they occurred between. For more detailed information see the ChangeLog file in the Sawfish source tree, or git log. (See the Wiki on how to access git repository.)
Each release lists incompatible changes at its top.
enter-*focus-modes in tabbed-windowing. [fuchur]
wallpapermodule regarding wrong values or non-existent files. [Christopher Bratusek]
sawfish.wm.prgfehlstart, trayer, pancake, xmobar and xsettingsd modules calling
startafterwards in the same session failed. This is fixed now. [Christopher Bratusek]
mandirfrom configure is now honoured. [Christopher Bratusek]
Open Homewas shown in the root menu even if
filemanager-programwas unset. [Christopher Bratusek]
x-terminal-emulatorwas used to access the Sawfish info-file. For better compat with non-Debian-distributions, use
xterminstead. Note that the Sawfish variable
xterm-programis not accessible from SawfishConfig. [Christopher Bratusek]
Sawfish/MATEstart Sawfish and then initialize MATE session.
Sawfish/KDE4start Sawfish and then initialize KDE4 session. [note: it’s still possible to select Sawfish from System Settings > Default Applications and starting KDE4 normally using Sawfish in favour of KWin]
Sawfish/XFCEstart Sawfish and then initialize XFCE session.
Sawfish/Luminastart Sawfish and then initialize Lumina session. Also add Lumina integration module.
sawfishand start a new session.
sawfishin the corresponding field.
sawfish-kde4-session: install above mentioned KDE4 integration and (install if not already) kde-core (metapackage for minimal KDE4 desktop)
sawfish-mate-session: install above mentioned MATE integration and (install if not already) mate-desktop-environment-core (metapackage for minimal MATE desktop)
sawfish-xfce-session: install above mentioned XFCE integration and (install if not already) xfce (meta-package for XFCE desktop)
sawfish-lumina-session: install above mentioned Lumina integration and (install if not already) lumina-desktop (meta-package for Lumina Desktop)
CTWMlike interactive window placement. Previously pressing any button while interactively placing a window would place it.
CTWMs behaviour: pressing button 1 will just place the window, button 2 will allow dragging to resize the window and place it when the button releases, button 3 will place the window and attempt to fill it to the screen bottom. [Maxime SoulÃ©]
killKill a window when moved to the given edge
iconifyIconify a window when moved to the given edge
move-window-viewportMove window to the viewport in the direction of moving against the edge
move-window-workspaceMove window to the workspace in the direction of moving against the edge
send-window-to-previous-headfunctions for moving windows across heads. [fuchur]
toggle-window-fixed-sizefor toggling fixed-size on windows, also used in lock-button
run-applicationby Sergey I. Sharybin, with several improvements and better integration into Sawfish. Also add ’Run Application’ entry at the bottom of the root menu. [Christopher Bratusek]
sawfish.wm.prg.nm-applet, simple auto-starter for the
Network Manager Applet. [Christopher Bratusek]
sawfish.wm.prg.diodon, simple auto-starter for the
Diodon Clipboard Manager. [Christopher Bratusek]
sawfish.wm.prg.conky, simple auto-starter for the
Conky System Monitor, that allows for custom command line options to be passed. [Christopher Bratusek]
sawfish.wm.prg.idesk, simple auto-starter for the
Idesk Desktop Icon Manager. [Christopher Bratusek]
sawfish.wm.prg.comptondelay compton start by 3 seconds to prevent heavy screen flickering. [fuchur]
cabinetwindow-switcher. Code-cleanup, bug fixes, blacklisting applications (mostly panels, pagers) and icon for missing window-icons. [fuchur]
auto-raisein SawfishConfig, utilize them in tabbed-windowing. [fuchur]
marked-cursor-shapedefcustom (used when marking windows for tabbing). [fuchur]
Flatstyle. Also improve speed and decrease memory usage by mirroring images [fuchur]
alacartein XFCE and MATE integration by default [fuchur]
xfce-sessionsave the session (by adding
-fflag in XFCE integration) [fuchur]
Open Browserto the root menu (if
browser-programare set) [Christopher Bratusek]
toggle-window-fixed-positionto match naming spec. [Christopher Bratusek]
htmltarget to man/Makefile, creating html-documentation [Christopher Bratusek]
make-changelogscript by Marcus D. Hanwell (generates ChangeLog from git log) [Christopher Bratusek]
make-choice-itemto properly support settings for the
Cruxtheme. [Vedat Hallac]
window-ops-menuwas still calling
resize-window-to-dimensionthat didn’t exist anymore since Sawfish 1.7. Use
resize-window-promptinstead. [Christopher Bratusek]
max-heightwould exceed 32767 (X11’s maximum) it would result in odd window-behaviour (for example: no maximization button), this is fixed by capping the value at 32767. Originally reported with Firefox and Thunderbird 17.0 [Michael Panteleit]
$width-contentin the mxflat theme [Robert Zenz]
col-tileare working (see also lisp/sawfish/wm/tile/readme.org):
tall-tile: one big (master) window on the left, small windows on the right
col-tile: tile windows as columns (recommended for multi-head configurations)
;; Example Tiling configuration in Sawfish's resource file (require 'sawfish.wm.tile.tile) (tall-tiling 0 #:width 1.75 #:top 0 #:bottom 0 #:gap 3 #:max 3 #:right nil #:resize t) (col-tiling 0 #:top 0 #:bottom 0 #:gap 3 #:cols 3 #:resize t) (bind-keys global-keymap "C-S-KP_Add" 'increase-max-windows "C-S-KP_Subtract" 'decrease-max-windows "C-M-KP_Add" 'increase-cols "C-M-KP_Subtract" 'decrease-cols "C-M-Right" 'tall-rotate-right "C-M-Left" 'tall-rotate-left "C-F11" 'next-tiling)
sawfish-config it is also possible to change most compton options directly
from within Sawfish. [fuchur]
focus-when-mappedwindow-matcher chooseable from ’never ’maybe and ’always. ’never is suggested for KDE users to be applied to Plasma in order to prevent notification popups to take focus from currently active window (and possibly loosing keyboard input) [fuchur]
resize-window-prompt. Now display window’s name and old width (respectively old height) when prompt for new values. Shows an information, if one of the given values is not actually a number. [Christopher Bratusek]
trayermodule. Handles a
trayer(a system-tray) instance during a sawfish session. [Christopher Bratusek]
xmobarmodule. Handles a
xmobar(an on-screen, very flexible bar, monitoring whatever you like) instance during a sawfish session. [Christopher Bratusek]
xmodmapmodule. Allows reading ~/.Xmodmap on startup of Sawfish. Useful only if using Sawfish standalone without a session-manager that already does this. [Christopher Bratusek]
xsettingsdmodule. Handles a
xsettingsd(a daemon implementing XSettings to provide GTK+2 application with information like what theme to use))instance during a sawfish session. [Christopher Bratusek]
xgammamodule. Allows changing display’s gamma settings on startup of Sawfish. [Christopher Bratusek]
fehlstartmodule. Handles a
fehlstart(a simple, but yet flexible application launcher) instance during a sawfish session. [Christopher Bratusek]
pancakemodule. Handles a
pancake(a simple desktop panel with pager, window-list, taskbar, tray) instance during a sawfish session [Christopher Bratusek]
force-tabwindow-matcher, forcing a window to be tabbed. [fuchur]
window-typewindow-matcher. This allows you to change the
_NET_WM_TYPEof a window. Specifications explicitly state that the client (Sawfish in this case) is not allowed to do so. Still, we provide this ability in case of bogus applications and testing purposes, it is neither desired nor required for normal work. [fuchur]
tab-group-windows-hook, triggered when changing or creating a tabgroup, returning all windows contained in the current tabgroup. [fuchur]
sawfish.wm.ext.exposein favour of much more advanced tiling-functions. [Christopher Bratusek]
gradient-tabbedfor tab-system as of Sawfish 1.9.1 [fuchur]
customize-show-symbolsdefcustoms. These options are now adjustable from
sawfish-configagain. [Christopher Bratusek]
'WINDOW_MANAGERon startup with value
sawfish. [Christopher Bratusek]
pt_BRtranslations via transifex.
dimensionwindow-matcher does now properly restore the window’s size [Robert Zenz]
$(repexecdir)/rules.mkas first, so that
--prefixand co. from
configurewon’t get overwritten. [Allin Cottrell]
tabssome minor issues have been fixed, like correct
stickytabs, and some issue with
StyleTabuses this feature. [fuchur]
About Razor-Qthelp entry [Christopher Bratusek]
sawfish.wm.util.marks, now implemented in
make gitclean.[Christopher Bratusek]
gapsin the frame. This is fixed now. [Christopher Bratusek]
Moveevent). [Christopher Bratusek]
before-restart-hookhas been added for this purpose. [Christopher Bratusek]
EdgeFlip, it was possible to trigger the same event multiple times at a time. This is fixed now. [Jeremy Hankins]
selectwill stuck. This is fixed now [Michal Maruska]
choicewidget didn’t work when the choices were numerical values. This is fixed now. [Christopher Bratusek]
Sawfish-MMC was a fork of Sawfish active, while the original Sawfish was inactive (2004-2007). Next follows a list of changes merged from Sawfish-MMC.
pixmap-cache-controlto reset and return more informations.
pixmap-cache-imagesreturns all images in cache.
prog_namefrom display.c. Call
XAddToSaveSetfrom a better position in the code. Mar
HotMove. Calls an EdgeAction when dragging a window over the edge.
Expose. Simple expose (one-shot tiling) EdgeAction (can also be used stand-alone). Original code by Mark Triggs.
Expand. Drag a window over the edge and it expand to the half-screen size.
Show-Desktop. Toggles between
Maximize. Just for competitive reasons choosable from configurator.
leave-flipper-hooksimply respond to the mouse entering or leaving the flipper-window, the new hooks respond only when an EdgeAction was invoked. The two hooks pass the invoked EdgeAction, activated edge and a boolean
while-movingvalue to the child-function (in that order).
file. The file(-chooser) widget now uses GtkFileChooserButton in favour of the ancient GtkFileSelectionDialog. The GtkEntry and GtkVBox used as helpers became useless and are removed.
font. The font(-chooser) widget now uses GtkFontChooserButton in favour of the ancient GtkFontSelectionDialog. The GtkEntry used as helper became useless and is removed.
frame-style. Those widgets now use GtkComboBoxText in favour of ancient GtkCombo/GtkComboEntry.
scheme-boolean. This widget is now properly implemented.
Old: two checkboxes. First for activating setting, second for choosing yes or no. New: only one checkbox, yes or no as usual, shows minus when unset.
number. The number-widget now has a
steppingproperty, allowing to change the increment of a button-press on the spin-button.
range. The range widget represents an integer with a given range. Basically it uses a GtkScale instead of a GtkSpinButton, which results in a better user-experience for those values.
image. The image widget contains a preview and image-selector. The file-browser openend is setup to display previews, too. Original code by Lucas Pandolfo.
program. Just an alias to
gtk-onlywidgets. Since Sawfish 1.5.0 those have been dummies, we don’t use
(defcustom test-var 'eclipse "This is just a test with label on top. \\top" :type (choice eclipse crosshair none) :group appearance)
Of course that only works, if the label is a GtkLabel widget on it’s own.
next-workspace-buttonfrom StyleTab into Sawfish.
cabinetis an advanced application switcher for Sawfish. For more information please visit: http://sawfish.wikia.com/wiki/Cabinet [Wang HongQin]
tab-groupwindow-matcher. It allows window to be auto-tabbed together, if they got the same
single-window-mode. Basically this feature is known from OS-X, though it’s implemented in a more strict way. The
single-window-modewindow should get all of the users attention.
This is ensured by auto-iconifying any up-popping window, which is not in the same
group. To additionally not annoy the user this is done without animation. Avoided or ignored
windows are lowered. When
single-window-mode is quit, the opposite happens.
single-window-mode hooks into unmap-notify-hook to check whether the user wants to
single-window-mode (by either closing or iconifying the window). Besides each
workspace can hold it’s own
mouse-trapfeature. It provides a method for moving the mouse to any place of the screen by zooming with just a few keystrokes. The mouse is warped to the center of the screen screen and a outline is drawn dividing the screen in 4 squares (like trapping the mouse on it). [Fernando Carmano Varo] [Christopher Bratusek]
shade-stackfeature. It provides an alternative to
iconify-window. Instead of iconifying a window or minizing it to a tray, the windows get shaded and sorted in a stack starting from the top-left corner (the number of columns can be changed). Combined with auto-unshade this offers - possibly - a better way of interacting with windows which aren’t required at the moment. Original code by Luke Gorrie. [Christopher Bratusek]
toggle-desktopfunction. Toggles between
hide-desktop- always logically correct. [Christopher Bratusek]
Sawfish-Session-Dialog, a companion to Sawfish, by default. Support for logout and lockdown has been added. [Christopher Bratusek]
filemanagerlauncher. If set the Sawfish root-menu will show an
Open Homeentry. The KDE, GNOME, MATE, XFCE and LXDE integration modules will set the program accordingly, unless it’s already user-defined.
user.jl, rather than
edge-actions-enabledvariable in order to be able to completely disable EdgeActions (also via .sawfishrc)
sawfish.wm.edge.confmodule (so they appear in the correct order now)
Open the configurator -> “Edge Actions”. Changes will be easy. (Set 4 pull-downs, and you’re done mostly. “Infinite-desktop” is renamed to “viewport-drag”.) For more options, see “Edge Actions” below.
If your ~/.sawfish/rc opens related modules, delete those references. These modules are renamed, and you don’t have to manually load them any more.
popup-window-ops-menu(both the function and command). Old names are still available.
rename-window. (Old name is still avialable.) The function
rename-window-interactiveis deleted. Use
Even if the old names still remain, it is highly recommended to update.
onfocused parameters are now
keys, and pass them as “#:match-class t/nil” or “#:onfocused
value”. Note that
match-class is boolean; To pass a
#:match-class t and pass the class name to the
regex. (see Application Invocation)
apps-menu-show-allis deleted. See below for more.
focus-ignore-pointer-eventsis deleted. [Teika kazura]
All are collected under sawfish/wm/animation.
Previously when installing to a private directory as an ordinary user, the installation failed, because some files were forced to be installed in /usr. This is fixed now.
Now you can choose which session files (default: all) to install with these configure-options:
--with/out-kde4session: enable or disable the installation of session files for KDE4.
--with/out-gnome2session: enable or disable the installation of session files for GNOME2.
--with/out-xdmsession: enable or disable the installation of session files for XDM (or other display-managers).
In Sawfish-1.7.0, poweroff related items in the popup menu couldn’t be invoked, if run without any desktop environment. Fixed it.
It is ensured that SawfishPager builds correctly, by improving sawfish.pc file.
focus-out-hook are called,
Sawfish wrongly reported a focus change during a grab as
“ungrabbed”. Now it’s reported as
Some windows were skipped in window cycles among groups. This is fixed.
From Sawfish-1.7.0, Sawfish used to crash when a theme with wrong code is loaded, but it’s fixed. It’s not complete, and for example some mxflat options make Sawfish crash.
It used to print an error message when you cancel an interactive call of
call-command with the escape key, but it doesn’t any more.
Previously, user’s change of the variable
kde-desktop-directories was ignored, but this is fixed.
“Edge Actions” is a centralized way to invoke an action when the mouse pointer hits a screen-edge. It includes former “edge-flip” and “infinite-desktop” (now renamed to “viewport-drag”), and a new feature “hot-spot”.
Edge-flip and viewport-drag can be configured from the configurator “Edge Actions” group. Options are easy to understand.
“Hot-spot” lets you assign an action to each screen-edge and -corner. An action has to be a lisp function, and can be set in ~/.sawfish/rc, like this:
(defvar-setq top-left-corner-function (lambda () (display-message "hello world")))
Hot-spot variable names consist of position (e.g. top-left or bottom) + “edge”/”corner” + “function”.
Other related changes are:
sawfish.wm.edge.*. You don’t have to import them for ordinary use.
sawfish.wm.edge.utilwritten in Lisp.
--replaceis added. With it, Sawfish will replace the currently running window manager. It’s done by “manager selection” defined in ICCCM secs 2.8 and 4.3.
toggle-or-exec is similar to jump-or-exec, but turns windows
into quake-like drop-down/pop-up-windows. That means, when you have
the toggle-window focused and press its keybinding again, it will be
See the file jump-or-exec.jl for more detailed examples.
iconify-on-leavewindow-matcher [Christopher Bratusek]
This new window-matcher is a companion to
a window matched loses the focus, it gets hidden. Use this together
toggle-or-exec for greater toggle-window experience.
When an error occurs during initialization, and if you don’t customize
error-handler, then the error is reported to both
the screen and standard-error. After Sawfish starts, it’s printed to
the standard-error only.
A new, tab-capable, highly configurable theme “StyleTab” is added. It
allows the tab-bar to appear in top, left, right, and bottom. Use a
new window rule
title-position for it. “StyleTab” is now the
Many improvements in tab system are done. For example, stickiness change on a window applies to all other windows in the same tab group, though maybe not yet complete. (Please tell us things you noticed.)
When you used a tab capable theme (Elberg-Tabbed or Get-S-Tabbed), you had to manually adjust positions by pixel, but it’s not necessary any more.
When a lot of windows are open, they should now be more responsive.
With the new option
apps-menu-filter, you can fully customize
the application menu. For the full description, see See Applications Menu.
It replaces former options like
From the configurator “Window Rules” you can set the animation mode when iconified. (see Animating Windows)
In order to support “gnome2-globalmenu”, the reaction policy to
XFocusInEvent is slightly modified. Sawfish doesn’t emit
_NET_ACTIVE_WINDOW if it’s done by (un)grabbing the pointer.
get-window-by-*functions [Christopher Bratusek]
get-window-by-class-re. Use instead
get-window-by-classwith the new boolean option
#:regex. (The old name is still supported.)
get-window-by-nameto get a window via NET_WM_ICON_NAME (can be used with #:regex switch, too)
Four new commands to resize a window where you can specify the size by pixels are there. You’re either prompted to type in the new size, or you can preset it in the configurator.
For the new command
resize-window-to-preset-size, first you
specify a size in the configurator. The focused window will be resized
to that preset size on invocation. There’re also commands to change
only one of the height and width.
resize-window-prompt prompts you to enter the new size.
fixed-sizeflag, the window-operations menu-entry
make allat the top directory. Previously it was possible to produce wrong sawfish.pot.
let-fluidsand let-loop correctly, provided by sawfish.el [Teika Kazura]
Placement is renamed to
Geometry. The item
shade-hover is moved to
appearance category, and
define-command-args is deleted. In
function, the keyword argument
doc-key is dropped.
Read the file CONTRIBUTING for more infos.
If you have code which utilizes prompt, it is affected. When you
call the function
prompt, directly pass helper functions
as function arguments. They used to be set as global variables.
This change is straightforward, so it’s not difficult to update your
sawfish.wm.util.prompt for details.
Sawfish claimed to support mouse-buttons 1 - 9, but it is known that drag of buttons 6 - 8 may not work. The button 9 doesn’t work at all, so we withdraw it.
maybe-lower-windoware now obsolete. [Teika Kazura]
Replace them with
sawfish.wm.util.stacking. Only difference is that the obsolete
version supports a feature of Nautilus (GNOME file manager) which was
dropped long ago.
Sometimes maximized windows would overlap “avoided” windows (e.g., the gnome-panel, or a trayer) on startup. Sawfish now defers maximization until the initialization is complete, preventing this problem.
Under certain circumstances viewport slots were wrongly shifted when Sawfish was restarted, ending up with some windows outside of the virtual desktop. This has been fixed.
Previously, when you switched the keyboard-layout, or more correctly the keyboard-“group” (which is mainly for multilinguals) keyboard- and mouse-bindings got messed-up.
Now, this can be prevented by invoking Sawfish with the new
--5-buttons. It is assumed that modifiers
are common among keyboard groups.
More precisely, what’s supported is switching by
or similar, bound to a key (for example ctrl + alt). It appears as
“option” in X keyboard configuration, like “grp:ctrl_alt_toggle”.
If you use some utility to switch the layout and it confuses Sawfish
keybindings, please restart Sawfish.
With that commandline-option, you won’t be able to bind Sawfish commands to mouse buttons 6 - 8. This may be fixed in future.
x-atom-name now accepts all 32 bits. Previously only
30 bits were treated if the architecture was 32-bit. 64-bit systems
hadn’t had this bug.
It used to cause “Bad argument” error, most notably on Java applications. (In theory, an atom is set by X server, not a client. But Java applications seem to be affected often by this bug.)
Correct alphabetic ordering of menu-entries is done. Previously they were sorted [A-Z][a-z] (first all upper- then all loser-case entries).
Also the function for detecting the language has been improved. It now better follows the freedesktop.org specification.
The “draft” animator had two issues: on one hand the drawn numbers
were always black (therefore possibly invisible), on the other hand
those numbers weren’t erased from the screen. Both have been
fixed. Internally, it’s done by the new
workspace-send-boundary-mode couldn’t be set from the
configurator, but this is fixed.
xtermfix [Teika kazura]
Support for XFCE integration was added. It’s just like GNOME/KDE4 integration:
browser-program (unless already
set by user), and adds XFCE logout/help/customization menu-entries to
the Sawfish root-menu.
Improvements: All menu-entries for GNOME/KDE4 do now have
accelerators. Entries for invoking
gnome-control-center or KDE
systemsettings have been added. The KDE4 detection has been
improved. See also the item “Applications menu improvements” below.
A new variable
desktop-environment tells which desktop
environment is running (see External Applications).
Applications menu now looks more like that of GNOME / KDE / XFCE if one is running. (further improvements are planned)
The user option
apps-menu-ignore-no-display is now gone
and replaced by
apps-menu-show-all. [Note: After Sawfish-1.8.0,
this option is superseded by
nil (default), the menu
looks much like that of GNOME / KDE / Xfce, by hiding some
applications. If it’s
t, then all installed applications are
shown. An intermediate option, the symbol
maybe is possible, as
OnlyShowIn in files
/usr/share/applications/*.desktop tell under which
desktop environment that application wants to be shown. If
maybe, they are
Items with field
NoDisplay are usually not to
be shown. They are respected if
The KDE specific directory is now searched, too while menu generation.
fixed-size: this disables resizing, or more precisely, functions
double-window-size. (Maximization is still possible. Use
never-maximizeto prevent maximization.)
never-delete: this disables closing. Only interactive closing is prevented, and you can delete windows with
never-deleteproperty from a lisp program.
It is now distributed with Sawfish window manager. Improvements are:
#t. This is fixed.
describe-functionhave been broken, but it works again.
describe-variable, the value of the variable is pretty-printed.
sawfish-load-symbolscan be called interactively to update the cached symbols.
border-color[Alexey I. Froloff]
A “border” of a window surrounds the window and all other frame parts. (see Frame Part Definition)
x-draw-textfunction [Christopher Bratusek]
It is similar to
x-draw-string. Generally, if you use a
display-message like message, call
If you want to draw on the screen directly use
(see X Drawing.)
Updated translations since 1.6.0 are Danish (da), British English (en_GB), German (de), Spanish (es), Slovenian (sl), and Swedish (sv).
All translation files are now in UTF-8. Changed languages are Galician (gl), Italian (it), Romanian (ro), and Turkish (tr). The rest were already UTF-8. [Teika Kazura]
Due to librep >= 0.91.0, the backtrace is printed by default when an error was signaled. It is printed for sawfish-client, too, but it’s sent to Sawfish’s standard error, not to sawfish-client’s, sorry.
Phrase “Sawfish error:” is prepended to error messages which are printed to standard error.
Sawfish-pager’s errors are printed to Sawfish’s output. More precisely, when you connected to Sawfish as a server asynchronously, then the error was not printed. But now it is printed, to Sawfish’s output. (In contrast, a client which connects synchronously receives the error message itself.)
In window cycling, some unnecessary pointer warping is avoided. Previously, the necessity of a warp was judged by the geometry before the raise was done. Now the updated one is used.
Icon is now provided. (If it doesn’t show up, first run
If you run the configurator but the Sawfish window manager is not running, then an alert window is displayed before abortion. [Teika Kazura, Christopher Bratusek]
Two obsolete features are deleted. One is the command line option
--socket-id, which was for “capplets”, part of very early
GNOME 2.x. The other is the command line option
which has been broken.
FAQ items, on how to hide the mouse-pointer, and on application execution.
Manuals (1) describe all options. KEYBINDINGS file was revised
All menu-entries do now have accelerators. Labels for help entries have been improved.
widget-test is deleted. It provided testing function
of widgets in modules
sawfish.gtk.*. But allegedly it is broken
and crashed Sawfish.
widget-dialog.jl was merged into
Previously the functions
beautify-symbol-name were defined in several modules, with the
same contents. Now they are defined (only once) in a new module
stock-button function was defined in Sawfish, but now it’s
replaced by directly using
gtk-button-new-from-stock. Same for the
about-dialog function, replaced (in version 1.6.0) by
/usr/bin/sawfish-config is now minimal, moving most of it’s
sawfish.cfg.shell [Teika Kazura]
3d-hackis deleted. [Christopher Bratusek]
3d-hack module was an animation demo, not a feature. It
provided two functions similar to
glxgears, rendered in 2d.
If you want it, it can be downloaded from the Sawfish Wiki, from the
ignore-window-input-hintis deleted which has been invalid for long. [Teika kazura]
maximize-window-fullxinerama, too, not just in maximize-window [Nolan Leake]
Before it broke for ’R’ (statistics software), and whitespace handling didn’t follow the specification.
Some *.desktop files are not ignored any more either, i.e., leading empty lines and comments are allowed.
randr-changed-notify-hook[Daniel M. German]
iconify. In addition, new tabs gain those properties from their parent window.
User chooses a window by cursor and click, and it prints its position
and size in a popup. Also available as a function, defined in
It returns the process ID of a window. (see Window Attributes
Technically, the window class consists of “instance” and “class”,
but only the latter was returned previously by the function
window-class. Now with the new optional argument, the instance
is returned too. (see Window Attributes)
User can add lisp directories to be read with the environmental
SAWFISH_USER_LISP_DIR. Its value is directories
separated by colon, like
PATH, and prepended to
load-path. If not set, ~/.sawfish/lisp is assumed.
For example, if you define a module
it can be read from ~/.sawfish/lisp/sawfish/wm/super-hack.jl.
User can override system lisp files, too. For example, if there is
~/.sawfish/lisp/sawfish/wm/windows.jl, then it defines
sawfish.wm.windows, instead of the installed one. (But this can
easily break your Sawfish startup.) In fact, it was possible for some
lisp files, but now it’s guaranteed for all files.
display-windowis documented. Difference between
window-really-wants-input-pis described. Short description on the root window.
Application menu, introduced in 1.6.0, made Sawfish crash if *.desktop file had a malformed key value (say ; as first character or # somewhere inside), or it was unreadable. It is fixed.
When the window placement mode is for example
east and the window
is wider than the screen, then the window was put wrongly. It is fixed.
maximize-discard stops a maximized window to be
treated as maximized any more, so that you can move and resize the
maximize-discard has existed, and now it’s
The user uploaded module “jump-or-exec” has been merged. It
jump-or-exec, a command which may be used to focus a
window, or if it does not exist, start the application.
Unlike the original version this one also supports matching a window
by its class (returned by
window-class function), which makes
it more flexible for applications like music player or browsers, which
tend to change their WM_NAME relatively often.
For usage, see lisp/sawfish/wm/commands/jump-or-exec.jl file.
frame-style-editable-pand all other remaining sawfish-themer fragments, as it’s dead. [Christopher Bratusek]
--without-nine-mouse-buttonsis not allowed to have 4 hyphens, therefore it’s renamed to
--without-nine-mousebuttons. [Christopher Bratusek]
kde4-config --install datarather than
kde4-config --path data, so no sed-kludge is needed anymore.
Make $datadir/kde4/apps/ the fallback path, if KDE4 is not installed. [Kim B. Heino]
make distclean. [Christopher Bratusek]
(This item is no longer valid from 1.7.0.) Support for 6 - 9 mouse buttons is now optional. X.Org/XFree86 headers only define up to 5 buttons, and we use a working but somewhat hackish workaround for getting buttons 6 - 9 which is suspected to cause some problems with modifiers. Support for them is enabled by default. If you want to disable it, add the following flag to configure:
If you drop it, then you can’t use mouse button 8 to, for example, drag windows.
Directory libexec is not used anymore for library files installation. Instead, they go into lib by default.
sawfish-ui, is renamed to
Its window class is changed to
Sawfish-Configurator, too. The lisp module is renamed from
infinite-desktop, the option to specify the boundary
behavior has changed. If
dynamic, then you can go as far as you like. Otherwise, it
stops at the workspace boundary of which size is specified by
viewport-dimensions. Now the latter is the default. See also
“dynamic viewport” described below.
The previous variable,
which is used for this purpose, no longer exists.
In Sawfish < 1.6,
sawfish.wm.defaults is loaded by default,
only if the ~/.sawfishrc lacks. Now, it is always read, so you
don’t have to
require it. It sets up GNOME or KDE support if
found running, and does load the error-handling module.
Since Sawfish 1.5
~/.sawmillrc is no longer a valid configuration-
file. From this version on, Sawfish will rename
~/.sawfishrc, if the former does exist on your system, but the
Sawfish used to rely on ESounD and LibAudioFile to play sound, but we
dropped that. If you want sound, set the variable
to the path of the program capable of playing *.wav file. You can set the
variable from the Configurator, too. By default ‘paplay’ is beeing used.
You can’t set any arguments to pass from this variable. If you want to give arguments or redirect output, write a wrapper program. (see FAQ, “Sound support” section.)
GNOME support is trimmed down. All we offer now is as follows:
If GNOME runs, in
session submenu under Sawfish root menu,
logout and shutdown from GNOME are added. Don’t remove
restart from menu now. GNOME help is available in menu.
Unless set by user, gnome-terminal.wrapper and gnome-www-browser are used for
Most of dropped GNOME integrationcode is ancient, mainly for 1.x and early 2.x. Files lisp/sawfish/wm/commands/gnome.jl and lisp/sawfish/wm/state/gnome.jl are deleted.
GNOME-Detection has been updated for recent versions. [Alexey I. Froloff]
sawfish.wm.commands.xterm is renamed to
dropped. If you use it, simply append its value to
Customization-group is changed from
display-url is renamed to
defined in the module cited above. Variable
If you’ve been using Sawfish-pager, then you have to recompile it, due to library files location change.
(This affects almost none.) There has been a defcustom property
user-level. It has been deprecated for years, and it’s
There have been crashes if a window is destroyed soon after its creation.
It happens in
add_window function, and the cause is guessed to be
garbage collection following window destruction before the object access.
Now most parts of
add_window are protected from garbage
rep_POPGC. It also prevents
add_window_hook from being called with uninitialised argument.
[Timo Korvola, Janek Kozicki]
There’re reports of sudden, random window disapperance, under Xinerama and some other drivers. It is partly prevented, but not completely, as this may also be caused by other libraries or buggy video drivers.
Now in error_handler() in src/display.c, when a window sends request_code 12 (X_ConfigureWindow), don’t auto-assume it to be unmapped. [Janek Kozicki]
libICEcheck on x11r7 [Christopher Bratusek]
--tag=CCto libtool where necessary. It unbrakes compilation on some arches [Gentoo Linux]
Strings are now fully translatable [Alexey I. Froloff]
SpinButton listens to manual value change. (It’s now connected to the correct signal.) [Christoper Bratusek]
Position parameters can be negative [Christopher Bratusek, Teika Kazura]
Simpletheme, windows are now resizable from the right border [Christopher Bratusek]
send-to-workspace. [Christopher Bratusek]
maximize-window-fullxineramework. [Teika kazura]
niloutside of command call.
uniconify-to-current-viewporthas been undeprecated. [Teika kazura]
Sawfish now generates application menu automatically, by reading
/usr/share/applications/*.desktop files. If you manually set
apps-menu, then it won’t be. If you like to have both your
own applications menu and auto the generated one, then refer back to
user-apps-menu rather than
apps-menu. In addition you can
use the variable
desktop-directory to specify a different directory
to look for *.desktop files, or a set of directories, if desired.
Root, and Window-Operations menus are revamped, too. [Christopher Bratusek]
Internally, a new function
remove-frame-part-value which allows to change/remove values from frame-parts is used. [Timo Korvola]
Make grow/pack Xinerama aware. The support still remains basic, as shrink/yank still lacks it.
Window rules (former “matched windows”) can easily be set from
configurator, but it can now be set by lisp, too, with
add-window-matcher function. For the details, See Window Rules by Matching. An example usage is like this:
(add-window-matcher '((WM_NAME . "^root$") (WM_CLASS . "^XTerm/xterm$")) '((ignore-program-position . t) (maximize . vertical)))
In fact, this function has already existed, but now it can now specify both windowname and -class, also the grammar has changed. The old syntax is still allowed, but deprecated.
Sawfish can “translate” keymaps for each window. Suppose you have the following lines in your ~/.sawfish/rc:
(add-window-matcher '((WM_NAME . "^Terminal$")) '(keymap-trans . (("C-n" "C-S-t") ("C-w" "C-S-w"))))
Then, when you press C-n, any windows with name “Terminal” receive C-S-t, and so on.
This is part of window rules, but it cannot be exposed in the configurator yet.
full-xineramaare available now (see Maximizing Without Borders) [Jeremy Hankins]
new-viewport, which place a window on the first empty Workspace or Viewport (if there’s none, one will be generated), have been introduced [Jeremy Hankins]
new-workspace is chosen, then the window is put in an empty
workspace, or a new workspace is created if none. A workspace with
sticky windows only are considered empty.
the same but an empty viewport is chosen. If none is, the workspace is
enlarged, and the window is put in a new viewport.
window-namecan change the window’s name. [Christopher Bratusek]
5 new move-cursor commands, 4 diagonals and 1 to center. (see Pointer Functions
Three window manipulation commands,
The former two are based on the
browser invokes a browser instance.
rename-windowchanges the window name. [from “mmc” fork, Christopher Bratusek]
In practice, it works, but technically speaking, the window name is not supposed to be changed in ICCCM, by the Window-Manager.
viewport-windows returns windows in a viewport. [Jeremy Hankins]
get-window-by-class-re [Christopher Bratusek]
When you set
then the workspace grows and shrinks dynamically so that it contains
all windows and the current viewport. For the details, See Dynamic Viewport.
KDE4 is automatically detected. KDE help, and KDE logout, shutdown, and reboot are provided in the menu. In KDE4 WM Selector, Sawfish is added.
Unless set by user, konsole and konqueror are used for user options
Added poweroff commands in menu for non KDE/GNOME users. There are
reboot, halt, suspend and hibernate. The used shell commands can be
set from configurator, under “Misc” -> “External Applications”. If
you don’t want it, set
want-poweroff-menu to nil.
User needs the appropriate privilege. For a way to do so, see See FAQ, “Shutdown privilege” section.
Reboot and halt call
before-exit-hook and do
delete-window to each window before actually rebooting or
halting, to ensure everything is fine on the next startup.
sticky-button, a button to toggle window
lock-button, a button to toggle window position
rename-button, a button to rename the window-title and window-icon properties (not ICCCM compliant)
move-resize-button, a button to perform various move and resize actions on a window
raise-lower-button, a button to perform various raising and lowering actions on a window
(Later this item was found wrong. The true fix was done in 1.7.0.) At Sawfish startup including restart, maximized windows and position specified windows used to mess up viewport, appearing in wrong viewports. It’s fixed now.
cycle-class-backwardsignore window-order [Daniel M. German]
dockby default [Timo Korvola]
C-cit won’t kill the WM [Teika Kazura, Timo Korvola]
raise-tabs-on-hovertakes effect immediately now [Christopher Bratusek]
customize-redirect, configurator’s output can be redirected. [Teika Kazura]
These commands are now available from window operation menu, too.
hand2, when resizing
sawfishhas been added [Luis Rodrigo Gallardo Cruz]
The new release is Sawfish-1.5.0. We don’t release 1.4 series for historical reason. The next will be 1.6, and 1.5.x are for bugfix branches.
If your .sawfishrc has a line
then change it to
If your configuration file is named
~/.sawmillrc, then rename it
Configurator GUI (sawfish-ui) used to display categories in flat row, but now arranges them in tree diagram.
To use the old style, put
(define-special-variable customize-program "sawfish-ui --flatten") in your configuration file.
Windows can be “tabbed”, or multiple windows bound to one, sharing size and frames. It’s still under development (sorry). For instructions, see our wiki site http://sawfish.wikia.com/Tabs.
Improvements in focus are done from which KDE users will benefit. Some new windows can receive focus. Some undesired focus transitions to desktop windows are suppressed.
In enter-exit and enter-only focus modes, enter-notify events caused by grab/ungrab are ignored. This has a bad side effect, too.
In lisp, replaced hardcoded focus logic by
function. Previously, action when the focused transient window is
unmapped was not handled by focus modes, but coded elsewhere. Now
focus-revert event is invoked, and passed to focus modes. (For
detail, see Input Focus.) This makes the modes’ policy clear, and
During window cycling, cursor is warped to the current top window if
When the window gets unmaximized, the cursor is retained in that
warp-to-window-enabled is non-nil.
Shrink and yank are commands to reduce overlap with other windows “by one”, with a motion in direction left/right/up/down. “Shrink” commands move one edge of the window to shrink, and “yank” commands move the window.
To use them, put
(require 'sawfish.wm.commands.shrink-yank) in
your configuration file, and use the configurator GUI to bind commands
It makes the virtual desktop bigger than the screen, actually so big that there’s no limit. You can scroll it with mouse continuously in natural manner.
This is in contrast to the coventional viewport; it scrolls by a step of one screen size. Thus it may not work so well with viewports.
To use it, put
(require 'sawfish.wm.ext.infinite-desktop) in
your configuration file, and use configurator GUI.
StaticGravitywhile reparenting windows (Michal MaruÅ¡ka)
SKIP_TASKBARstate (Chris Boyle, me)
UTF8_STRINGtype (Christian Krause)
grow-packbug fixes (Daniel Pfeiffer)
grow-packmodule (Kai GroÃjohann, Daniel Pfeiffer)
bindtextdomaincodesetfunction if rep implements it (Christophe Fergeau)
apply-command-keysfunction (David Bustos)
wm-specmodule causing nautilus desktop window to cover panel
display-windowfunction that can prevent the window getting focused
librep0.14 or newer
menu-program-stays-runningvariable now defaults to true by popular demand
_WIN_WORKSPACEproperty of each window
decorate-transientsoption works again with shaded windows
Extract some more translatable strings (Vlad Harchev)
Cruxtheme now has an extra button mode:
Default, like Mac OS Platinum but also has an iconify button. Used by default
grow-packmodule now works with windows which specify increments (Kai GroÃjohann)
_WIN_WORKSPACEproperty changing and will move the window in response
configure-ignore-stacking-requestsand a similarly-named window property. When set stacking requests from windows are ignored (Matt Tucker)
exit-type– returns the type of exit in progress
XParseColorunless we actually have a display connection (merlin)
setlocaleto avoid trashing the locale preferences
shade-buttonbutton class (many themes created it anyway)
sawfish.wm.util.recolor-imagemodule, currently contains a single function for recolouring parts of images based on a given colour gradient
delete-group. Deletes a whole group of windows. With default bindings, shift-click on the close button to invoke this command
window-icon-imagewill return the mini-icon
XUrgencyHintnot being defined before X11R6
bind-keysis called with zero arguments
crop-imagefunction when checking validity of height parameter (email@example.com)
choicewidgets may now contain descriptive names, syntax is
focus-windows-when-mappedoption to only apply to non-transient windows (this option is now enabled by default)
top-leftis now the default mode for non-transients
_SAWFISH_WM_LOWER_WINDOW. Used by
These are similar to
WM_TAKE_FOCUS, in that if the window
supports the protocol, it’s up to it whether or not it raises (or
lowers) the window in question. These functions should only be used
where the user hasn’t explicitly requested the restacking
An example usage is an application that doesn’t want its window to be raised due to a button-press event that initiates a drag operation
menus-include-shortcuts, disabled by default (Unai Uribarri)
WM_TRANSIENT_FORset to the root window as children of all windows in the group (it causes too many annoying effects), instead just decorate these windows as transients
transienticonification modes better, don’t use a recursive method, instead use one pass to identify the windows to change, then another to make the changes. In
transientsmode, only change the state of shared transients if they will have no visible parents afterwards
_WIN_HINTSclient message (with a similar format to the
sawfish.wm.commands.viewport-extras, some commands for viewport for viewport navigation (Dams NadÃ©)
never-maximizewindow properties when appropriate
focus-windows-when-mappedset would cause any shaded windows to be deleted
font-descentfunctions to the gaol
""to denote a null doc string (which has bad side effects when internationalized)
()as a valid image modifier color component
sawfish.wm.ext.error-handler). When loaded it records the most recent errors, and the time at which they occurred. Use the
display-errorscommand to display all recorded errors.
window-history-clearcommand to forget history for all windows.
defcustomforms may now a
:widget-flagskeyword, a constant list of symbols passed to the configuration tool. Current flags include:
sawfish.wm.util.pingmodule, it implements the
_NET_WM_PINGprotocol of the new window manager spec.
destroy-notify-hookis no longer called asynchronously
sawfish.wm.state.wm-specmodule to match the current (almost final) draft of the new GNOME/KDE window manager spec
raise-lower-window. The set of windows affected by these commands is determined by the
user-raise-type(either the individual window, the window and any transients, or the entire group). The old commands of these names are now called
Most modules now use these commands when raising or lowering windows, allowing the stacking model to be configured globally.
Also, try to avoid displaying maximize buttons in windows whose hints prevent them from being maximized
edge-flip-delayoption now applies when dragging windows
enter-exitfocus mode, focus isn’t removed due to enter/leave events due to pointer grabs (fixes the bug with Mozilla URL completion)
focus-click-throughbehaviour with respect to frame decorations
window-wants-input-pto check if the
InputHintis set before reading the value
window-state-change-hookis called with
urgencystate when it changes
shade-hovermode (adapted from Eli Barzilay)
window-list-skip. Unified with GNOME skip-winlist hint
dimensionsproperty in window matching was called
sp-cost:functions from the
move-window-foocommands (Yoshiki Hayashi)
WM_TAKE_FOCUSmessage, only focus the window if its ‘Input’ hint is set
sawfish.wmfor window manager code,
sawfish.uifor configurator and
sawfish.gtkfor GTK+ utilities
Compatibility should have been preserved as far as possible, through
the use of module aliases. The
user module that unmodularized
user code is loaded in should look very similar to the old environment.
However, code using private functions, probably will not work
New features written as modules can either import modules individually,
or just open
sawfish.wm to get the core functionality
autoload-command add entries to this
define-command takes a name and a function (and some
other optional arguments). The old style of defining commands still
works, but only in the user module
sawfish-clientnow provides the same repl as the normal
repprogram. E.g. this allows the module system to be easily inspected
Also, the module of each loaded theme is available for inspection under
themes.theme-name. (With themes using top-level defines
instead of a single
let* block, this is useful for debugging)
sawfish.clientmodule provides lisp functions for communicating with a running window manager. Also, the protocol has been modified to support proper communication of errors, which are then re-raised on the client-side. This should make debugging client-server code more obvious
add-window-menu-toggleto add items to the ‘Toggle’ sub-menu of each window
ConfigureRequestevents in a way that is compliant with the ICCCM—honour the window’s
win_gravitysetting (defaulting to
NorthWestgravity), instead of assuming
sawfish.wm.util.xplugin (Ryan Pavlik)
To support this, new window property
desktop denoting a
“desktop” window; new function
one of these things (or the symbol
pointer-motion-thresholdoption. Pointer motion events are only generated when the pointer moves at this many pixes away from the position it had when the button was pressed
select-workspace-and-viewport. Renamed some workspace functions:
get-visible-window-edgesfunction to use proper keyword parameters, and added some new keywords
gnome-about. Added a
sawfish-aboutscript to implement the first of these. Added associate menu items to the ‘Help’ menu
cycle-skip, defines whether the window is included when cycling the focused window. (Dave Dribin, me)
throwout the top of the program by mistake
find-headfunction, to allow Xinerama support to work
synthesize-eventto scan the window tree for a child window accepting button events (E. Jay Berkenbilt)
image-setand related functions will add an alpha channel to the image when necessary (when using gdk-pixbuf)
quote-menu-itemfunction to help with this)
setmethod of the
hiddenattribute, ignore it
FIXED_POSITIONGNOME hint (renamed old
fixed-positionnow means don’t allow the window to be moved by the user)
transients-aboveoption can now be set per-window
defcustomalways causing the module to be loaded, not just when the option is non-nil
quote-eventcommand now works with applications that ignore synthetic events (adapted from code by Timo Korvola)
define-frame-type-mapperallows modules to affect the mapping from window type to frame type. E.g. the shading module uses this. (fixes the bug that changing the frame type of a shaded window didn’t work)
variable-customized-p; use this to avoid redefining user-modified options
:type (optional color)weren’t being converted when passed between the wm and the configurator, leading to reader errors
A side-effect of this is that updated custom files will not be compatible with previous versions of the wm (though old custom files will work with new versions)
default-bevel-percentwas being ignored)
move-window-to-viewportcommand to correct for 1… indexing
As the normal window stacking commands, but restacks the “transient-group” of the window. This includes the window itself and any transients it has, and any windows that it itself is a transient of.
These commands are used in the default keymaps
WM_TRANSIENT_FORproperty to the root window denotes that the window is a transient for the whole group
image-map. New color accessor function
color-rgb-8. New function
sawfish-ui: optionally use some GNOME widgets, more lisp widget types, some bug fixes
command-sequence. Allows individual bindings to invoke a sequence of commands
uniconify-whole-group. New commands
:type, but value is left unquoted
WM_NORMAL_HINTS(was using base-size instead of min-size in places)
window-historymodule won’t resize a window to a size that violates its size constraints
match-windowoptions). Also, extra widget types and containers may be added as extra Lisp modules
cursorattribute may now be a function
under-pointerplacement modes clamp the window into the current work area (i.e. without overlapping windows that shouldn’t be covered). Added a
placementgroup. Fixed some more bugs and sub-optimal default option values
SKIP_FOCUSwindow hint sets
never-focusproperty on window, as well as the
window-historymodule behave more sanely (don’t save iconified or shaded state; include window name when generating keys for transient windows)
beos-window-modulethe standard window menu (require
old-window-menuto get the original version). Also made this display the windows’ class names
window-history—automatically saves window attributes when they are explicitly set by the user, then copies these attributes to windows with the same
WM_CLASSas they are created. This is loaded automatically if you have no .sawfishrc
frame-type-fallback-alistmaps each frame type to the type to try if the original type isn’t available in the chosen frame style.
Note that for this to work, themes must return
nil when they
don’t support the requested frame type, until now, the convention had
been to return the default frame definition, so most if not all themes
will need changing. (This doesn’t include themes created using the
best-fitplacement mode user-controllable. Set the
sp-cost-componentsvariable to a list of cost functions and the weight to apply to that metric. E.g. by default it gives 50% importance to the distance from the placement to the focused window, and 25% each to the distance to the pointer and to the “future-unusefulness” of the area being covered
beos-window-menuto redefine the window menu to group items by the window group that they are a member of (in the absence of actual group information, it will heuristically build groups by matching window titles)
edge-flip-warp-pointer, whether or not to warp the pointer after edge-flipping (Paul Warren)
display-window:uniconify-to-current-workspace, controls whether windows uniconified by
display-windowshould be moved to the current workspace (John N S Gill)
xlibrary now supports creating and then drawing to pixmaps. The pixmaps can then be grabbed to images using the
cycle-windowssequence is terminated by an unknown event, re-handle that event after exiting (so that e.g. M-TAB can be followed by another M- qualified event without releasing Meta)
raise-groups-on-focusoption, it caused unstable window flickering in certain cases
current-head-offset. Some placement modes should handle multiple heads sensibly, as should window maximization and edge snapping.
lower-groupto preserve the stacking of the group, then change the selected window. Added new command
workspace-menuto add the focus-marking asterisk (John N S Gill)
WM_STATEproperty is set each time a window is mapped, not just the first time
selection, adds functions
x-get-selectionfor retrieving X selections (Mark Probst)
window-animmodule enabling asynchronous animations after window events. Currently only two animation styles
solid, and they only animate window iconification
audio-eventsmodule; maps window manager events to audio samples (played using esd by default, but can be configured to use any program)
xterm-programto decide which terminal program to use (James Antill)
randommode; also increased
sp-avoided-windows-weightby an order of magnitude (Dan Winship)
get-cursorto use the correct background color when creating cursors from vectors (Alexander Barinov)
get-fontto set ‘descent’ property correctly
xplugin, also only support this if configure finds the correct header files
synthesize-eventto generate correct relative pointer positions
input-focusto theme-callable functions
display-windowwhen it’s applied to iconified windows
fontset-languages-reto work around broken X servers
ws-move-windowto not remove the window if source and dest are the same (Rob Hodges)
sp-prune-pointsfunction (Dan Winship)
move-viewport-to-windowto only flip viewports if window isn’t already on the current viewport (Merlin)
x-raise-window; added symmetrical function
/in themes to be the
quotientfunction (integer division), which is what they expect. The
dividefunction can be used for real division
x, a basic Xlib binding for creating and drawing in windows (Merlin, me)
call-command-with-output-to-screen, prompts for and invokes a command, then displays any output it emitted (bound to A-x in default keymaps)
multi-click-delay, maximum time in milliseconds between button presses to count as click2 or click3 events (Martin Blais)
edge-flip-only-when-moving(Yaron M. Minsky)
cycle-class(Kai GroÃjohann); can now be bound to events with more than one modifier (Timo Korvola)
uniquify-window-name; new property
unique-name. Forces the window to have a unique name
magnetism(the old method),
resistance. (Merlin, me)
define-focus-mode—make defining these things easier. Focus modes are now settable for each window individually
configure-request-hook. The new configure handler respects window gravity when resizing
configure-auto-gravity. When enabled the window gravity is implied by the position of the center of the window. (e.g. try placing the GNOME control center in the bottom right corner of the screen, then click on an item that causes it to resize)
XCreateFontSetcauses—fall back to
Also, remove the need to call
.sawmillrc, it’s always done now
gravity(overrides the hinted gravity value)
resize-add-edges>. Also allows twm-style resizing (Mark Probst, me)
frame-state-mutexare now functions
fp->win == 0assertion, it should be harmless and was triggering for some people
custom-add-required. If you have a .sawmillrc you’ll need to do this manually
move-resize-window-todoing a combined move/resize. New variable
synthetic-configure-mutex, when set holds off sending synthetic
ConfigureNotifyevents to windows until it’s unset (this is held while interactively moving or resizing windows)
after-add-window-hook. Called with a single parameter, the window that’s has just been adopted
send-client-messagenow groks long integers (i.e. cons cells) in 32-bit data (Timo Korvola)
equalto compare keys, not
error-handler, implements a simple alternative error handler (and allows the much-maligned beep to be turned off), requires rep 0.11+
shade-hover, unshades windows while the pointer is over them
window-menu, shorten sticky entries as usual (James Antill)
move-cursor, various commands for moving the mouse pointer; these commands are bound to the cursor keys when moving or resizing windows
WM_NAMEis a null text property
skip-tasklistproperties I’d stupidly broken
New or updated functions to access frame parts directly:
Other new functions:
sawmill-themerto emit code to tell the window manager that the theme is editable. The wm adds an ‘Edit Theme...’ option to the Customize menu when appropriate
call-after-property-changedfunction can now be given a list of properties to monitor (James Antill)
call-after-state-changed, monitors a list of window states (i.e. things like iconified, shaded, …) and calls a function when any of them change. The
window-state-change-hooknow has a second argument (apart from the window), the list of symbolic states that changed (James Antill)
skip-tasklistto the window matcher when GNOME support is enabled (Ben Liblit)
display-messagefunction update background color, and gracefully handle invalid color specifiers (Matt Krai)
window-keymap. (Matt Krai)
inactive-clicked. (Last two are new)
sawmill-themer. A GUI for creating simple themes (those without any parts defined by functions)
gnome-int, loaded by
sawmill-defaultsif GNOME is around, sets up some GNOME’ish things
make-imagenow always returns a new image
(cursor . nil)work correctly in frame definitions
Create new window instances by using the
commands. Merge instances by moving them to the same workspace, or
ungrouped. Means to put the window in a group on its own
commandpfunction when applied to autoload stubs
gnome-logoutcommand (Jens Finke)
raise-window-and-pass-through-clickcommand to pass click2, etc, events through to frame parts
size, in terms of the window’s size hints
popup-apps-menucommand (GÃ©rard Milmeister)
define-frame-classwhen creating keymaps
(set …)custom types
raise-window-and-pass-through-clickcommand to pass-through subsequent clicks
bar-windows-revariables, they’re obsoleted by the general match-windows mechanism
show-messagefunction, replaced by
display-messagewith a better calling interface; also displays multi-line strings
Hypermodifier, prefix is H-
New option ‘--disable-nls’ to disable i18n
gtkrc-call-after-changedto allow themes to receive these events (hooks are now off-limits to themes)
raise-window-and-pass-through-click; bind it to a mouse button in the
window-keymapto get the “raise window on click” behaviour that seems popular
slide-group-xfor x one of:
ignoredproperty of windows (Julian Missig)
bevel-imagefunction (Scott Sams)
gnome-menucode when GNOME binaries aren’t in the first $PATH item; also accept non-alphanumeric language codes
AnyModifierand a specific button
For most commands working on single windows, there’s also one operating on the group that the current window is a member of. (With the notable exception currently of moving windows.) There’s also options controlling whether (de)iconification operates on windows or groups
gnome-share-directory, also look in /etc/X11/applnk for menu entries
after-framing-hook: called whenever a window’s frame is changed or recalibrated
cycle-windowsonly finds a single window; also, abort immediately if there’s no windows to cycle through at all
WM_NORMAL_HINTSproperty is read after it’s been updated
maximize-fillfunctions to respect the
avoidproperty instead of the
maximize-avoidproperty; new functions
avoided-windows; new regexp
WM_COMMANDhas to match
resize-by-frame-class, when enabled (the default), the resized window edges are chosen to match the class of the clicked frame part (i.e. matching the cursor shape)
set-frame-part-value—makes customizing the
_WIN_CLIENT_LISTproperty not being set properly (both missing windows immediately after they’re adopted, and of intentionally skipping ignored windows)
cycle-disable-auto-raise); option to restrict cycling to the current viewport (
lock-first-workspaceis now enabled by default, and prevents both the first and last interesting workspaces being moved inwards
root-window-keymapis searched for key-press events
shaped-transientwindow types (make the window completely unframed)
cycle-windowscould leave a window originally under the pointer that’s unfocused, drawn as though it is focused
lock-first-workspace, prevent the first workspace from being deleted when it’s empty
ignore-window-input-hint, to always give windows the focus, whether they say they will accept it or not
move-window-xcommands (for x being
microGUIby Ryan Lovett firstname.lastname@example.org, based on the QNX Photon screenshots
(require 'gnome-menu)to your ~/.sawmillrc file to load it
send-to-workspace:xfor x from 1 to 9
foregroundproperty of each frame part may now be an image instead of a piece of text
smaker, uses the foreground images capability to do a somewhat WindowMaker-like theme (with the absolute-e images). This theme is extensively customizable—all images, colors, dimensions, etc…
xtermcommand to launch an xterm
previous-workspace-rowcommands. Together with the
workspace-columnsvariable these mimic a 2d desktop
cycle-through-workspacesoption, there’s now
override_redirectattribute while unmapped
override-frame-part-classesvariable—allows all frame properties to be overridden on a per-class basis
auto-window-type-alistvariable mapping window names to border types
eval-key-release-eventsto allow catching these types of keyboard events, disabled by default
meta-keysymsdescribe the virtual modifier assignments
frame-part-classesvariable). This should ensure that different themes have the same feel (but a feel that may be customized by the user)
removableproperty). Nothing makes use of this yet
gtktheme, draw bevels on window decorations
focus-proxy-clickcontrolling whether to pass the focus-inducing button-press event to the underlying window (in click-to-focus mode)
sm-restore-window-hookhooks). See lisp/workspace.jl for an example
auto-frame-style-alistvariable associates window name regular expressions with frame styles. Also, the
window-ops-menuhas a new submenu with all possible styles
preallocated-workspaces, the number of workspaces to create at startup
gradienttheme to create full-sized gradient images, trading memory for quality
customcustomize options into normal variables (they’re not particularly intuitive)
rendererproperty in frame definitions. This property is a function called with args
(image state); it should draw a background into image for the specified state (
gtk. This reads the default GTK style and uses the associated colors and pixmaps to decorate windows. It doesn’t try to handle engine-based themes. It should automatically detect when the default style changes (if changed by the GNOME control center). Do ‘sawmill-client -c gtk-reload-style’ in the shell to reload the style manually
gradienttheme uses these and on-the-fly rendering to do
afterstep-like window titles
customize:groupfor each group.
Also created the variable
theme-load-path containing the list of
directories searched when trying to load a theme. By default it
contains two directories: ~/.sawmill/themes/ and
select-workspace:Xfor X between 1 and 9
sawmill-client; invokes the named interactive function
window-ops-menucould be displayed from one window but then affect a different window
sloppy-focusvariable, it’s replaced by
focus-mode. This can currently be one of
enter-exit(normal focus follows pointer),
enter-only(“sloppy” focus) or
click(click to focus)
keymapproperty of the window under the pointer, not the focused window (as with keypress events)
before-exit-hook, called immediately before shutting down
simplethemes now define all four standard frame types
simpleframe style can now be customized (
fontattributes of each frame part may now refer to a function
First proper release