News
****

This lists the user-visible changes made to Sawfish, and which releases they occurred between. For more detailed information see the ChangeLog files in the Sawfish source tree.

1.3
===

  * Implemented EMWH "show desktop" mode

  * Set client window gravity to StaticGravity while reparenting windows (Michal Maru¹ka)

  * Support EWMH SKIP_TASKBAR state (Chris Boyle, me)

  * Window history keys may have multiple properties (not enabled by default for backwards compatibility, see window-history-key variable)

  * More placement modes are now multihead-aware (Steve Hill)

  * Translation updates: el (Simos Xenitellis, Kostas Papadimas), de (Christian Neumair), no (Kjartan Maraas), pt_BR (Alexandre Folle de Menezes), am (Daniel Yacob), es (German Poo Caaman~o), uk (Maxim Dzumanenko), sk (Stanislav Visnovsky)

  * Bug fixes:

       - compile with Gtk 2.2

       - don't try to unfocus windows within the X error handler

       - don't cache frame objects while clicking in windows, they may get garbage collected -- fixes "crash on shading" bug

       - set _NET_WM_NAME as UTF8_STRING type (Christian Krause)

       - save-session is now called gnome-session-save; fallback to looking in /usr/gnome for menus

       - fixed typo in adjust-position-for-gravity/y

1.2
===

  * Added an OPTIONS file describing the variables that may be customized

  * Some drawing optimizations: don't reinstall frame shape at each redraw, turn off graphics exposures in all contexts

  * Added a cache for X properties to minimize server round-trips

  * Added support for Xft fonts

  * Color objects now store alpha as well as rgb data

  * Support useful parts of 1.1 NET WM spec; also fixed some bugs / omissions in support for 1.0 spec (e.g. _NET_WORKAREA)

  * Support for two dimensional workspace layouts and edge flipping (Michael Toomin)

  * Translation updates (Dmitry G. Mastrukov, Jordi Mallach, Vincent van Adrighem, Christian Rose, Stanislav Visnovsky, Daniel Yacob, Andras Timar, Sava Chankov, Christian Neumair, Peteris Krisjanis, Gustavo Noronha Silva, Christian Meyer, Fatih Demir, Hasbullah Bin Pit, Christophe Fergeau)

  * Bug fixes:

       - Don't pass null pointers to accept ()

       - Stacking list assertions no longer abort execution, they just print an error message

       - Handle minimum-size hints that are zero

       - Understand the Pango font names that the Gtk2 font selector uses

       - Fixed bugs when iconifying sticky windows

       - When servicing configure-window requests, respect the window's locked dimensions. Also handle moving in only one direction

       - grow-pack bug fixes (Daniel Pfeiffer)

       - Fixed some problems with fullscreen mode

       - Fixed some problems in the Gtk2 config tool

       - Other bug fixes (Greg Morris, Claudio Bley)

1.1
===

  * Reorganized the customization options. Removed user levels. Removed many obscure options (most are still available as lisp variables, just not from the UI). Viewports are no longer available in the UI

  * Updates to the grow-pack module (Kai Großjohann, Daniel Pfeiffer)

  * In matched windows, boolean options can be turned off as well as on (me, merlin)

  * New full screen maximization mode

  * Bug fixes:

       - Miscellaneous focus fixes

       - Be more selective about which X errors imply window deletion

       - Don't trigger a stacking-list assertion on logout

       - Check for window-ness in window-visibility (Michal Maru¹ka)

       - Reread WM_WINDOW_PROTOCOLS when it changes

       - Fixed bug of nautilus windows not being focused in focus follows mouse modes

       - Recover "lost" windows when selecting windows (merlin)

       - Show correct size when resizing windows (merlin)

       - Most placement modes now respect workarea (Federico Mena Quintero, me)

       - Miscellaneous fixes to wm-spec implementation. Includes code to support _NET_WM_STRUT

       - Call bindtextdomaincodeset function if rep implements it (Christophe Fergeau)

       - Make the current-directory stored in the session a valid filename

       - Don't put windows below the default depth just because their parent is

       - Miscellaneous viewport fixes (Federico Mena Quintero)

       - Don't let ``transients above'' and ``layer'' stacking constraints conflict with one another

1.0.1
=====

  * Translation updates: pt (Carlos Perelló Marín), it (Michele Campeotto), pl (Zbigniew Chyla), zh_CN (Wang Jian), zh_TW (Abel Cheung), es (Eneko Lacunza), tr (Ömer Fadýl USTA), sv (Göran Uddeborg, Christian Rose), da (Ole Laursen), gl (Jesus Bravo Alvarez)

  * Bug fixes:

       - Fixed typo in apply-command-keys function (David Bustos)

       - Fixed bug in wm-spec module causing nautilus desktop window to cover panel

       - Adopt windows with a maximized hint correctly

       - Fixed bug in display-window function that can prevent the window getting focused

       - Don't allow windows to be moved or resized by third-parties when they're maximized (and the necessary option is set)

       - Fixed problem with localizing property names in the matched-windows configuration widget

       - Handle window gravity more correctly (Owen Taylor)

       - Forget everything about withdrawn windows -- better ICCCM compliance

       - Fixed root-window event proxying (the infamous gmc bug)

       - Don't use dlmalloc on sparcs (Brian Nitz)

0.99
====

  * Requires librep 0.14 or newer

  * Translation updates: ja (Sato Satoru), no (Kjartan Maraas), es (Carlos Perelló Marín), fi (Antti Ahvensalmi), cs (Jiri Cerny), fr (Christian Marillat), de (Matthias Warkus, Christian Meyer), da (Ole Laursen), sk (Stanislav Visnovsky), tr (Özgür), sv (Christian Rose, Peter Winnberg), gl (Jesus Bravo Alvarez)

  * Do i18n on more text strings (Vlad Harchev, me)

  * Broken support for multiple-screen displays. Supplying the new --multihead option will fork extra copies of sawfish for each extra screen. This has some fundamental problems, but some people seem to want it (Michael Vogt, Mahmood Ali, me)

  * Window manager virtual modifier once again defaults to M- instead of C-

  * Added support for Off2 and Off3 events

  * menu-program-stays-running variable now defaults to true by popular demand

  * New command focus-desktop

  * Switch viewports more efficiently (by choosing the best order to move windows, to minimize the exposed area)

  * Monitor the _WIN_WORKSPACE property of each window

  * Bug fixes:

       - Check for X SHAPE extension, exit if it's not available

       - Wait for the focus-in event before changing sawfish's knowledge of the focused window when moving focus from one window to another

       - Be more ICCCM-compliant, don't send synthetic configure notify events when the window was resized

       - Fixed locale font handling

       - Don't leave grid traces when trying to move/resize a window that's locked in place

       - Fixed bug where the pointer being over the message window could confuse focus after window cycling

       - decorate-transients option works again with shaded windows

       - Documentation appears in tooltips again

       - Handle sticky properties better in the window-history module

       - Maximization fixes for multi-headed displays (Florent Guillaume)

       - Cancelling a resize of a maximized window no longer discards the window's maximized state

0.38
====

  * Translation updates: gl (Jesus Bravo Alvarez), sv (Martin Norbäck), de (Matthias Warkus, Christian Meyer), ru (Vlad Harchev), es (Joseba García Etxebarria), pl (Daniel Koc), fi (Antti Ahvensalmi), sk (Stanislav Visnovsky), az (Pablo Saratxaga), cz (Stanislav Brabec), no (Kjartan Maraas), el (Simos Xenitellis), it (Michele Campeotto), fr (Christian Marillat), ro (Marius Andreiana), ko (?)

     Extract some more translatable strings (Vlad Harchev)

  * Crux theme now has an extra button mode: Default, like Mac OS Platinum but also has an iconify button. Used by default

  * The grow-pack module now works with windows which specify increments (Kai Großjohann)

  * New command kill-client

  * Fixed bugs:

       - Don't return a null pointer when no default cursor has been set, return nil instead

       - Avoid triggering assertions in the stacking list code when raising or lowering windows and the given sibling has been destroyed

       - Turned off the annoying code that beeps and prints a message when unfocusable windows are detected

       - The GNOME hints now listen for the _WIN_WORKSPACE property changing and will move the window in response

       - Don't forget maximized state of windows when they're moved, only if they're resized

       - Don't show special cursors when moving or resizing windows, or when hovering over the title bar

       - Corrected off-by-one error in `smart' placement modes

       - Identified and fixed some problems in the new GNOME/KDE window manager hints implementation (Rob Hodges, me)

0.37
====

  * New command line option --window-history-file=FILE

  * Search for user's rc file in this order: ~/.sawfishrc, ~/.sawfish/rc, ~/.sawmillrc

  * New option configure-ignore-stacking-requests and a similarly-named window property. When set stacking requests from windows are ignored (Matt Tucker)

  * When restarting sawfish, reselect the previously selected workspace

  * Added a function that can recolour multiple image channels simultaneously

  * New function exit-type -- returns the type of exit in progress

  * Translation updates: ja (Sato Satoru), sk (Stanislav Visnovsky), es (Iñaki García Etxebarria), hu (Robert Vanyi), tr (Fatih Demir), ro (Tutu Valentin), no (Kjartan Maraas), it (Michele Campeotto), pl (Daniel Koc)

  * Fixed bugs:

       - Fixed focus-handling in enter-only mode on window close and viewport switch

       - Fixed overflow error in the image recolouring module (Simon Budig)

       - Session management always uses a unique session file (Timo Korvola, me)

       - Fixed bug in random placement mode where windows could sometimes be placed off-screen

       - Fixed some auto-raise problems by reverting a misguided bug fix

       - Fixed bugs with aborted session saves

       - Cache stacking order of windows locally -- this allows us to keep the order consistent, especially after window reparenting operations

       - Don't call XParseColor unless we actually have a display connection (merlin)

       - Merged two calls to setlocale to avoid trashing the locale preferences

       - Check for presence of Xinerama extension before trying to use it -- removes the annoying error message at startup

       - Added some more X server timestamp logic to correct for the timestamp discontinuities after APM resume

0.36
====

  * Added a new default theme: `Crux'. By default it recolours itself to match the current GTK+ selection colour. (Arlo Rose, me)

  * Updated translations: it (Michele Campeotto), fr (Christian Marillat)

  * Added a shade-button button class (many themes created it anyway)

  * Added a sawfish.wm.util.recolor-image module, currently contains a single function for recolouring parts of images based on a given colour gradient

  * Added new command delete-group. Deletes a whole group of windows. With default bindings, shift-click on the close button to invoke this command

  * Added support for KDE-style mini-icons. If the window has no normal icon, then window-icon-image will return the mini-icon

  * Fixed bugs:

       - Themes that use the module for reading the user's gtk preferences will once again get updated when the gtk theme changes

       - Fix another of the null-string translation bugs (Christian Marillat)

       - Work around XUrgencyHint not being defined before X11R6

       - Fixed some long-standing bugs when decorating windows (use the correct mask when creating the overall window shape; for frame parts with no mask, set the local shape to the appropriate rectangle; be sure to generate at least one Expose event when reconfiguring frame parts)

       - Fixed crashing bug when bind-keys is called with zero arguments

       - Fixed typo in crop-image function when checking validity of HEIGHT parameter (martin@whoever.com)

0.35
====

  * Translation updates: ja (SATO Satoru), it (Michele Campeotto), zh_TW.Big5 (Chun-Chung Chen), pl (Daniel Koc), sk (Stanislav Visnovsky)

  * Items in choice widgets may now contain descriptive names, syntax is (SYMBOL "DESCRIPTION")

  * Changed focus-windows-when-mapped option to only apply to non-transient windows (this option is now enabled by default)

  * New placement modes top-left and off-center. top-left is now the default mode for non-transients

  * Enabled the module supporting the newly standardized GNOME/KDE window manager hints. Also made random changes to support KDE2 a lot better

  * Added WM_PROTOCOLS _SAWFISH_WM_RAISE_WINDOW and _SAWFISH_WM_LOWER_WINDOW. Used by maybe-raise-window and maybe-lower-window functions.

     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

  * New option menus-include-shortcuts, disabled by default (Unai Uribarri)

  * Don't interpret windows with WM_TRANSIENT_FOR set 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

  * Handle group and transient iconification 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 transients mode, only change the state of shared transients if they will have no visible parents afterwards

  * In the (old) GNOME hints code, support a _WIN_HINTS client message (with a similar format to the _WIN_STATE message)

  * New module sawfish.wm.commands.viewport-extras, some commands for viewport for viewport navigation (Dams Nadé)

  * Check for never-iconify and never-maximize window properties when appropriate

  * Support sixth and seventh mouse buttons (Steve Haslam)

  * Bug fixes:

       - Fixed problems with reverting changes to list-based options

       - Don't allow the empty list as a valid modifier list

       - Fixed bug where restarting the wm with focus-windows-when-mapped set would cause any shaded windows to be deleted

       - Ignore iconified windows in the grow-pack code

       - Added font-ascent and font-descent functions to the gaol

       - Catch errors when loading site-init and rep-defaults files

       - Don't use "" to denote a null doc string (which has bad side effects when internationalized)

       - Don't need to run sawfish-client - to get a repl anymore, just sawfish-client

       - Fixed bugs in composite-images function

       - Fixed ordering of states output by gtk-style program (michaelj@maine.rr.com)

       - Fixed grabbing mono window icons in gdk-pixbuf mode

       - Reject button event descriptions that don't specify at least one mouse button

       - Accept () as a valid image modifier color component

       - Now grabs translatable strings from defgroup forms correctly

0.34
====

  * Added a virtual modifier key, the W- modifier. This modifier is used for all standard window-manager key bindings, it may be set to any of the standard X modifiers using the configuration tool

  * Optionally show window-icons when cycling through windows (Unai Uribarri Rodríguez, me)

  * Event handlers for low-level X windows now get passed the window as their second argument (Unai Uribarri Rodríguez)

  * Translation updates: fr (Christian Marillat), sv (Richard Hult), pt_BR (Flávio Bruno Leitner), it (Michele Campeotto)

  * Error handler module (sawfish.wm.ext.error-handler). When loaded it records the most recent errors, and the time at which they occurred. Use the display-errors command to display all recorded errors.

  * Added an option to not save window-history data for transient windows. Also added a window-history-clear command to forget history for all windows.

  * Rearranged window operations menu to hopefully be clearer

  * Attempt to catch and handle errors while loading custom options

  * Labels in menu items can now be functions, they should return the label text when called (with any menu arguments)

  * Moved installed message catalogues to $datadir/locale

  * defcustom forms may now a :widget-flags keyword, a constant list of symbols passed to the configuration tool. Current flags include: expand-vertically and expand-horizontally

  * Added a sawfish.wm.util.ping module, it implements the _NET_WM_PING protocol of the new window manager spec.

  * destroy-notify-hook is no longer called asynchronously

  * Bug fixes:

       - Fixed various bugs when dragging/resizing windows

       - Reverted the changes to make the click-to-focus click-through setting apply to window decorations

       - Fixed bug when handling 32-bit data in client messages and X properties

       - Fixed window-focus problems when switching viewports

       - Many bug-fixes to handling of maximized window state. Maximized state should now be preserved across wm and session restarts. It's also saved in the window-history attributes

       - Support the function hints of the MWM window manager properties

       - Updated the sawfish.wm.state.wm-spec module to match the current (almost final) draft of the new GNOME/KDE window manager spec

       - Fixed sporadic stacking bugs when unmapped windows exist

       - Fixed miscellaneous click-to-focus and focus-click-through related bugs

0.33
====

  * Added support for user-levels associated with individual commands

  * The GNOME hints code now understands that the do-not-cover flag is the same as sawfish's avoid property

  * Swap properties of sticky windows when entering and leaving workspaces as for normal windows (fixes the old problem where sticky windows can grab focus when a workspace is entered)

  * Changed the default settings of some customization options, hopefully to give a more ``conventional'' feel for new users

  * Better support for Xinerama (Geoff Reedy)

  * Added a new set of window stacking commands: raise-window, lower-window, 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 FOO-single-window.

     Most modules now use these commands when raising or lowering windows, allowing the stacking model to be configured globally.

  * Translation updates: no (Kjartan Maraas), fi (Antti Ahvensalmi), it (Christopher R. Gabriel), pt_BR (Douglas Moura Ferreira), uk (Yuri Syrota), de (Matthias Warkus)

  * Fixed bugs:

       - If committing changes in the configurator causes new customization options or groups to be added, update the UI to reflect this

       - Added code to detect and correct the sporadic bug where windows become unfocusable in click-to-focus mode

       - Sanitized how the focus gets passed to and from transient windows (when passing focus back from a transient, give it to the most recently focused window in the group, not the transient's parent)

          Also, try to avoid displaying maximize buttons in windows whose hints prevent them from being maximized

       - Many fixes to how maximized windows are handled across session and window manager restarts. Also support GNOME window maximized hints when windows are created

       - Fixed some bugs in the wm-spec module

       - Don't trigger auto-raise hooks on leave/enter events generated by pointer grabs

       - The edge-flip-delay option now applies when dragging windows

       - Fixed the preview command in sawfish-themer

       - Miscellaneous fixes to the ``smart'' window placement modes

       - Fixed type description of persisitent-group-ids option

       - In enter-exit focus mode, focus isn't removed due to enter/leave events due to pointer grabs (fixes the bug with Mozilla URL completion)

       - Fixed (again) the focus-click-through behaviour with respect to frame decorations

       - Re-added hack to make GMC icons unfocusable

       - Fixed interactive placement to check for window destruction (merlin)

       - Fixed bug with tiled images with shapes (the shape mask would always be applied an integer number of times, ignoring the size of the frame part it's associated with)

       - Fixed window-wants-input-p to check if the InputHint is set before reading the value

0.32
====

  * M-TAB window cycling now works in both directions, bind keys to CYCLE-COMMAND-backwards, e.g. cycle-windows-backwards (Merlin, me)

  * Added support for X `Urgency' hint: window-urgent-p and window-state-change-hook is called with urgency state when it changes

  * Some improvements to shade-hover mode (adapted from Eli Barzilay)

  * Functions that raise/lower groups of windows now generate the minimum number of expose events (Rob Hodges, me)

  * New window property window-list-skip. Unified with GNOME skip-winlist hint

  * Custom options may have tooltips, use :tooltip tag

  * Catch errors when applying custom changes and revert to previous state

  * Translation updates: uk (Yuri Syrota), pt_BR (Douglas Moura Ferreira), hu (Róbert Ványi), de (Christian Meyer), ja (SATO Satoru), da (Keld Jørn Simonsen), es (Iñaki García Etxebarria), fr (Christian Marillat)

  * Fixed bugs:

       - With click-to-focus in non-click-through mode, don't click-through into window decorations

       - dimensions property in window matching was called size by mistake

       - Export the various sp-cost: functions from the sawfish.wm.placement.smart module

       - Don't allow cycles in the transient-for relationship

       - Fixed some maximize bugs

       - GNOME skip-focus property no longer causes the window to be unfocusable, just uncyclable-to

       - Coerce auto-raise timeout to be at least one millisecond; support disable-auto-raise correctly

       - Window input hints defaults to true not false

       - Fixed typo when loading the defaults file (Ronald Wahl)

       - Fixed command spec of move-window-FOO commands (Yoshiki Hayashi)

       - When sending WM_TAKE_FOCUS message, only focus the window if its `Input' hint is set

0.31.1
======

  * Translation updates: da (Kenneth Christiansen), de (Christian Meyer), no (Kjartan Maraas), pt_BR (Rui Miguel Silva Seabra), sv (Johan Dahlin), uk (Yuri Syrota)

  * Bug fixes:

       - Fixed typos in sawfish.wm.gnome.integration and sawfish-themer (Christian Marillat)

       - Fixed bug when building on Tru64 (John H. Palmieri)

       - Remember to check return value when initializing Imlib

0.31
====

  * Requires librep version 0.13

  * Organized all lisp code into a hierarchy of modules. Root points are sawfish.wm for window manager code, sawfish.ui for configurator and sawfish.gtk for 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

  * All command handling is now written in Lisp. It's fully compatible except for how commands are defined. Since there is no longer a unified namespace the mapping from names to command definitions is maintained separately.

     define-command and autoload-command add entries to this mapping. 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-client now provides the same repl as the normal rep program. 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.client module 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

  * `Action' parts of menu items may now be lisp objects that don't have a read syntax. (E.g. this allows closures to be used, avoiding the problems arising from modularization)

  * Support for checked and radio-group menu items. Also a new function add-window-menu-toggle to add items to the Toggle sub-menu of each window

  * Handle ConfigureRequest events in a way that is compliant with the ICCCM---honour the window's win_gravity setting (defaulting to NorthWest gravity), instead of assuming Static gravity

  * Support more GC attributes in the sawfish.wm.util.x plugin (Ryan Pavlik)

  * Support for handling arbitrary windows as extra ``root'' windows. Used, e.g., to support Nautilus' desktop window. Allows the focus modes to work correctly

     To support this, new window property desktop denoting a ``desktop'' window; new function desktop-window-p recognizing one of these things (or the symbol root)

  * Added pointer-motion-threshold option. 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

  * New functions: scale-image, composite-images, and crop-image.

  * New option maximize-avoid-avoided (Jonas Linde)

  * New functions exported by sawfish.wm.ext.tooltips module: display-tooltip, remove-tooltip

  * New function exported from sawfish.wm.viewports module: select-workspace-and-viewport. Renamed some workspace functions:

     ws-move-window => move-window-to-workspace, ws-copy-window => copy-window-to-workspace, ws-insert-workspace => insert-workspace, ws-move-workspace => move-workspace, ws-remove-window => remove-workspace.

  * Changed interface of get-visible-window-edges function to use proper keyword parameters, and added some new keywords

  * New commands help:about and gnome-about. Added a sawfish-about script to implement the first of these. Added associate menu items to the `Help' menu

  * New window property cycle-skip, defines whether the window is included when cycling the focused window. (Dave Dribin, me)

  * Translation additions and updates: es (Iñaki García Etxebarria), tr (Fatih Demir), zh_CN.GB2312 (zw@zhaoway.com), fr (Christian Marillat), ja (SATO Satoru), de (Kai Lahmann), el (Simos Xenitellis), ga (Seán Ó Ceallaigh), ru (Valek Filippov), sl (Andraz Tori)

  * Bug fixes:

       - Don't let errors in .sawfishrc prevent customization settings being loaded

       - initialize event handler when creating X window proxies (Matt Tucker)

       - No longer able to throw out the top of the program by mistake

       - Fixed find-head function, to allow Xinerama support to work

       - When exiting, leave window configurations exactly as they were found (E. Jay Berkenbilt)

       - Fixed synthesize-event to scan the window tree for a child window accepting button events (E. Jay Berkenbilt)

       - Removed ``yow! ...'' debugging messages

       - image-set and related functions will add an alpha channel to the image when necessary (when using gdk-pixbuf)

       - Canonify S-x as X where possible

       - Catch and handle errors when matching properties in the sawfish.wm.ext.match-window

       - Escape underscores in menu items where they shouldn't introduce accelerators. (Added quote-menu-item function to help with this)

       - Fixed race-condition when exiting configurator embedded into the GNOME control center (Havoc Pennington, me)

       - Fixed bug in set method of the icon widget

       - Fixed shading behaviour of included themes (Daniel Lundell)

       - Compute the shape of the frame window each time the background of one of its parts changes

0.30.3
======

  * If a frame part has a non-nil hidden attribute, ignore it

  * When reframing windows, keep the absolute position of the client window constant

  * Support FIXED_POSITION GNOME hint (renamed old fixed-position property as client-set-position; fixed-position now means don't allow the window to be moved by the user)

  * transients-above option can now be set per-window

  * Translation updates: fr (Christian Marillat), en_GB (Robert Brady), de (Kai Lahmann), da (Keld Simonsen), ru (Valek Filippov), sl (Andraz Tori), no (Kjartan Maraas), gl (Jesus Bravo Alvarez), it (Michele Campeotto)

  * Fixed bugs when converting option values

  * Fixed :require keyword in defcustom always causing the module to be loaded, not just when the option is non-nil

  * Fixed bug when adding windows that are shaded

  * Fixed some minor bugs in the configurator

0.30.2
======

  * Window cycling now forwards terminating events to external applications as well as internal bindings (e.g. M-TAB M-w closes an activated Netscape window)

  * quote-event command now works with applications that ignore synthetic events (adapted from code by Timo Korvola)

  * Reorganized frame style and window type management. New function define-frame-type-mapper allows 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)

  * Added function variable-customized-p; use this to avoid redefining user-modified options

  * Do type-directed deep conversion of values when converting to/from readable representations. This fixes the bug that options with :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)

  * Translation updates: no (Kjartan Maraas), de (Kai Lahmann), nl (Dennis Smit), sl (Andraz Tori)

  * Added primitives map-windows and filter-windows

  * Fixed bug of not retaining focus on startup when originally in PointerRoot mode and moving to click-to-focus mode (Brad Thompson)

  * Ensure that apps get sent a synthetic ConfigureNotify event after ConfigureRequest events are handled (fixes bug where menus in Java apps can appear at wrong position until window is moved)

  * When referencing known variables from subroutines, make sure that restricted environment doesn't prevent the variable being accessed (fixes bug where default-bevel-percent was being ignored)

  * When creating transient groups, don't compare null group ids (fixes xfmail related bugs)

  * Fixed move-window-to-viewport command to correct for 1... indexing

  * Fixed non-gnome workspace widget in configurator

0.30
====

  * New commands activate-viewport-column, activate-viewport-row

  * New commands raise-window-and-transients, lower-window-and-transients and raise-lower-window-and-transients, raise-transients-and-pass-through-click.

     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

  * Functions that deal with transient windows now understand the de facto standard of setting the WM_TRANSIENT_FOR property to the root window denotes that the window is a transient for the whole group

  * New image manipulation functions: image-ref, image-set, image-fill, image-map. New color accessor function color-rgb-8. New function root-window-id

  * Improvements to sawfish-ui: optionally use some GNOME widgets, more lisp widget types, some bug fixes

  * New command command-sequence. Allows individual bindings to invoke a sequence of commands

  * Options iconify-group-mode and uniconify-group-mode replace iconify-whole-group and uniconify-whole-group. New commands iconify-transient-group, and uniconify-transient-group

  * Added :type* key to defcustom, like :type, but value is left unquoted

  * Translation updates: pl (Daniel Koc), ru (Valek Filippov), uk (Yuri Syrota), es (Iñaki García Etxebarria)

  * Fixed handling of WM_NORMAL_HINTS (was using base-size instead of min-size in places)

  * Fixed further locale / FontSet bug (Tomohiro KUBOTA)

  * window-history module won't resize a window to a size that violates its size constraints

0.29
====

  * Rewrote the configuration user interface. Improvements include:

       - Key bindings may now include parameters. E.g. this finally allows shell commands to be bound to keys using the GUI (use the new run-shell-command command)

       - Nautilus-like user-levels to tailor the options shown to the expertise of the user

       - Options may have much richer type descriptions (including match-window options). Also, extra widget types and containers may be added as extra Lisp modules

       - By default the stand-alone configurator commits changes to the window manager as they are made, instead of waiting for the Try button to be pressed

       - Added dependences---options with dependences are only editable when the value of their dependence is non-nil

  * Rewrote window stacking code to be based on ``stacking predicates''---functions that accept or reject a possible stacking configuration. This allows the ``stack-transients-above-parents'' option to work correctly, only keeping transient windows above their own parent windows

  * The configure-event handler now understands and handles the full complexity of stacking requests (Brad Thompson)

  * New frame-part attribute: scale-foreground. The cursor attribute may now be a function

  * Made the centered, centered-on-parent and under-pointer placement modes clamp the window into the current work area (i.e. without overlapping windows that shouldn't be covered). Added a stagger placement mode

  * When grabbing window icons to images, preserve their shape masks

  * Moved window-history options to placement group. Fixed some more bugs and sub-optimal default option values

  * Don't set cursors for button classes, use the default value

  * GNOME SKIP_FOCUS window hint sets never-focus property on window, as well as the ignored property

  * Translation updates: de (Karl Eichwalder), ru (Valek Filippov), da (Kenneth Christiansen)

  * Added mostly-complete support for using gdk-pixbuf instead of Imlib (requires an experimental Xlib version of the gdk-pixbuf library)

  * Various bug fixes and other minor changes...

0.28.1
======

  * New options --visual=TYPE and --depth=DEPTH. These tell the window manager to use a different visual than the default

  * Made the window-history module behave more sanely (don't save iconified or shaded state; include window name when generating keys for transient windows)

  * Made beos-window-module the standard window menu (require old-window-menu to get the original version). Also made this display the windows' class names

  * Updated translations: es (Iñaki García Etxebarria), tr (Fatih Demir)

0.28
====

  * New module window-history---automatically saves window attributes when they are explicitly set by the user, then copies these attributes to windows with the same WM_CLASS as they are created. This is loaded automatically if you have no .sawfishrc

  * New method of allowing themes to implement only some of the (currently) four frame types. The variable frame-type-fallback-alist maps 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 make-theme module.)

  * Made the metrics used by the best-fit placement mode user-controllable. Set the sp-cost-components variable 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

  * New module beos-window-menu to 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)

  * New option edge-flip-warp-pointer, whether or not to warp the pointer after edge-flipping (Paul Warren)

  * New option display-window:uniconify-to-current-workspace, controls whether windows uniconified by display-window should be moved to the current workspace (John N S Gill)

  * Changed method of selecting when to use multi-byte aware rendering functions (except when initializing the locale fails, or returns a 7-bit locale); also, when creating a fontset fails, try to intelligently fall back to a similar group of fonts (Tomohiro Kubota)

  * The x library now supports creating and then drawing to pixmaps. The pixmaps can then be grabbed to images using the make-image-from-x-drawable function

  * Added a Help item to the root menu

  * Translation updates: fi (Antti Ahvensalmi), gl (Jesus Bravo Alvarez), de (Karl Eichwalder), nl (Jan Nieuwenhuizen), pl (Daniel Koc), tr (Fatih Demir)

  * Now supports the Super modifier

  * Fixed bug of sometimes ignoring pending X events

  * Fixed bug of calling focus change hooks too many times (only when our view of the focused window has actually changed)

  * Avoid problems when windows set weird size hints structures

  * Raise windows after possibly moving them to a different layer, when they have been mapped

  * When the cycle-windows sequence 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)

0.27.2
======

  * Translation updates: da (Kenneth Christiansen), de (Karl Eichwalder), es (Iñaki García Etxebarria), ja (SATO Satoru)

  * Attempt to destructure the language code when parsing GNOME desktop items (e.g. if LANG=de_DE look for both de_DE and de translations)

  * New focus handler events enter-root and leave-root

  * Removed raise-groups-on-focus option, it caused unstable window flickering in certain cases

  * Fixed bug When transferring focus after a window is unmapped (inverted choice of when to look under pointer, and when to look in focus history)

0.27
====

  * Changed the name from sawmill to sawfish; all user-visible binaries have been renamed appropriately, the old programs will still work for now...

  * Added support for accelerators in menu definitions (this requires a new rep-gtk package) (Richard Kilgore). Added accelerators to many of the standard menu items

  * Added some (untested) support for Xinerama: current-head, current-head-dimensions, current-head-offset. Some placement modes should handle multiple heads sensibly, as should window maximization and edge snapping.

  * Added icons for GNOME control center applets (all icons by Tigert, except for the saw-blade logo by Glyph Lefkowitz)

  * New functions map-window-properties (me), window-icon-image (Bruce Miller)

  * Changed behaviour of raise-group and lower-group to preserve the stacking of the group, then change the selected window. Added new command raise-lower-group

  * New option raise-groups-on-focus

  * Updated translations: de (Hubert Nachbaur), es (Iñaki García Etxebarria), gl (Jesus Bravo Alvarez), ko (Man-Yong Lee), tr (Fatih Demir)

  * Try to handle errors more gracefully when creating window frames

  * Better handling of errors in the control center applet

  * Fixed the below-client frame-part attribute

  * Fixed the disappearing items in the match-windows dialog

  * Fixed the non-beautified entries in the keymaps dialog

  * Fixed interactive placement mode (Timo Korvola)

  * Invoke audio playing program asynchronously, may avoid deadlocks

  * Fixed workspace-menu to add the focus-marking asterisk (John N S Gill)

  * Fixed menu-obscuring bug after auto-raising windows

  * Ensure that WM_STATE property is set each time a window is mapped, not just the first time

  * Fixed bug when discarding grab in click-to-focus mode, even though successive events may be in the window's keymap

  * Only focus windows when they're mapped when they're visible

  * Fixed click-to-focus problems when unmapping transient windows

0.26
====

  * Added plugin selection, adds functions x-selection-active-p and x-get-selection for retrieving X selections (Mark Probst)

  * New functions prompt-for-window, prompt-for-workspace and select-workspace-interactively (Dave Pearson)

  * window-anim module enabling asynchronous animations after window events. Currently only two animation styles wireframe and solid, and they only animate window iconification

  * audio-events module; maps window manager events to audio samples (played using esd by default, but can be configured to use any program)

  * When running programs in terminals from the GNOME apps menu, use the value of xterm-program to decide which terminal program to use (James Antill)

  * Translation updates: gl (Jesus Bravo Alvarez), pl (Daniel Koc)

  * New command toggle-window-iconified (Jens-Ulrik Petersen)

  * New option raise-windows-when-unshaded

  * Customization options for tooltip colors (Erik Assum)

  * Removed default binding to A-x

  * Added support for librep-with-module-system (cvs version)

  * Note that ko and zh languages need FontSets

  * When sticking a window not on the current viewport, move it to the current viewport (Merlin)

  * Fixed bug (?) of placing over avoided windows in random mode; also increased sp-avoided-windows-weight by an order of magnitude (Dan Winship)

  * Fixed bug of maximizing a window changing its viewport

  * Fixed window cycling losing grab if originally focused window is unmapped

  * Fixed get-cursor to use the correct background color when creating cursors from vectors (Alexander Barinov)

  * Fixed get-font to set `descent' property correctly

  * Changed double-buffering semantics in x plugin, also only support this if configure finds the correct header files

  * Fixed synthesize-event to generate correct relative pointer positions

  * Don't focus on non-visible windows (crashes GNOME control center)

  * Fixed bug of using cp to install GNOME desktop files

0.25.2
======

  * If no user customization file when saving options, inherit from the custom-defaults file

  * Rewrote window stacking (fixes bugs, more efficient)

  * Added input-focus to theme-callable functions

  * When focused window is unmapped, don't try to focus non-visible windows

  * Fixed display-window when it's applied to iconified windows

  * New variables fonts-are-fontsets and fontset-languages-re to work around broken X servers

  * Update edges for snapping to when dragging windows across workspaces or viewports

  * When passing keymaps to customization system, filter out, then later restore, bindings that aren't symbols

  * Most commands to move/copy windows between workspaces can now be told whether to select the destination workspace or not

  * In GNOME hints, never place windows on workspaces that don't exist (from the pager's POV). (Rob Hodges)

  * Fixed ws-move-window to not remove the window if source and dest are the same (Rob Hodges)

  * Fixed sp-prune-points function (Dan Winship)

  * Fixed move-viewport-to-window to only flip viewports if window isn't already on the current viewport (Merlin)

  * Try to detect and handle system clock being rewound

  * Optional second arg to x-raise-window; added symmetrical function x-lower-window

  * Fixed unix-domain server code assuming atomic writes to sockets

  * Added double buffering support to x module

  * Fixed grabs during multi-key sequences; also, print the current prefix keys if idle during a multi-key sequence

0.25.1
======

  * Only force windows onto the visible screen if they didn't explicitly set their position

  * Redefine / in themes to be the quotient function (integer division), which is what they expect. The divide function can be used for real division

0.25
====

  * New plugin x, a basic Xlib binding for creating and drawing in windows (Merlin, me)

  * Added a method of reading textual input from the user from completion. Provision for completing functions, variables, commands, files, directories, etc.... Also supports reading passwords. (Topi Paavola, me)

  * Re-enabled the following interactive codes: a (function), C (command), D (directory), f (existing file), F (file), k (event), n (number), N (prefix or number), s (string), S (symbol), v (variable)

  * Support prefix keys in bindings (binding an event to a keymap, or the name of a keymap, marks that event as a prefix key for the associated keymap)

  * New command 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)

  * New variable multi-click-delay, maximum time in milliseconds between button presses to count as click2 or click3 events (Martin Blais)

  * New option edge-flip-only-when-moving (Yaron M. Minsky)

  * New window cycling commands cycle-prefix, cycle-class (Kai Großjohann); can now be bound to events with more than one modifier (Timo Korvola)

  * New command uniquify-window-name; new property unique-name. Forces the window to have a unique name

  * New commands size-window-add-column, size-window-subtract-column, size-window-add-row, size-window-subtract-row

  * Window edge snapping now has three variants: magnetism (the old method), attraction and resistance. (Merlin, me)

  * New commands grow-window-{left,right,up,down} and pack-window-{left,right,up,down} (Kai Großjohann)

  * Support the WM_COLORMAP_WINDOWS protocol

  * New functions synthesize-event, font-ascent, font-descent, call-with-keyboard-grabbed

  * New functions define-placement-mode and define-focus-mode---make defining these things easier. Focus modes are now settable for each window individually

  * Made the tree-organised customization groups work better with the GNOME control center. Add the sawmill capplet desktop entries to the GNOME programs menu (under Settings). Also, beautify the names displayed in the bindings widget

  * When applicable, load the GNOME applications menu when the wm is first idle, reduces the latency of displaying the first root menu

  * Translation updates: de (Hubert Nachbaur), es (Iñaki García Etxebarria), ja (Sato Satoru), sv (Andreas Persenius)

  * Fix bug of not noticing when the keyboard / pointer / modifier mappings change

  * Fixed current-event-string function

  * Better method of reconfiguring frames when they're resized (helps opaque resizing)

  * Added some kludges to try and break the intermittent lockups some people have seen

  * Made the auto-gravity option work a lot better (John N S Gill, me)

  * Fixed bug where unmapped windows were being included in the snapping calculation

  * Fixed bug when uniconifying windows and merging workspaces

  * Fixed bug of warp-cursor-to-window trying to put the pointer outside the screen boundaries (Merlin)

  * Fixed bug of losing keyboard grab when originally focused window is deleted during x-cycle command

  * Fixed bug of trying to focus unviewable parent windows when focused window is unmapped

0.24
====

  * Configure requests events are now passed to the hook configure-request-hook. The new configure handler respects window gravity when resizing

  * New option 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)

  * Worked around the numerous reports of non-existent font errors that using XCreateFontSet causes---fall back to XLoadQueryFont if possible

  * There's now a library custom-defaults giving default customization options (only if the user has no ~/.sawmill/custom)

     Also, remove the need to call custom-add-required in .sawmillrc, it's always done now

  * New window properties focus-when-mapped, and gravity (overrides the hinted gravity value)

  * New placement modes under-pointer and centered-on-parent

  * New option resize-edge-mode, replaces resize-by-frame-class and resize-add-edges>. Also allows twm-style resizing (Mark Probst, me)

  * Optionally display command documentation in tooltips; tooltips are now aligned into columns (if you use a monospaced font for them)

  * Variables default-cursor, synthetic-configure-mutex, frame-draw-mutex, frame-state-mutex are now functions

  * New functions x-keysym-name, x-lookup-keysym, decode-event, encode-event.

  * New option move-resize-inhibit-configure

  * Translation updates: es (Iñaki García Etxebarria), fr (Christian Gillot), gl (Jesus Bravo Alvarez), nl (Han-Wen Nienhuys), pt_PT (Rui Silva), sv (Andreas Persenius)

  * Fixed single-quoting in client readline (Matt Krai), copied bouncing parentheses hack

  * Removed fp->win == 0 assertion, it should be harmless and was triggering for some people

  * Fixed bug of sending configure notify events to too many windows

  * Fixed off-by-one error in ws-insert-workspace (Kirk Saranathan)

  * Fixed maximization in single directions to work additively

  * Fixed bug of leaving tooltips displayed after the associated window has been deleted

  * Fixed bug of not removing -clientId option from restart parameters

  * Fixed bug of not translating customize group names

0.23
====

  * Customization groups are now organized as a tree structure, with groups able to contain subgroups

  * Define the list of features that will be presented to the user in sawmill-defaults.jl, by calling custom-add-required. If you have a .sawmillrc you'll need to do this manually

  * New function move-resize-window-to doing a combined move/resize. New variable synthetic-configure-mutex, when set holds off sending synthetic ConfigureNotify events to windows until it's unset (this is held while interactively moving or resizing windows)

  * New hook after-add-window-hook. Called with a single parameter, the window that's has just been adopted

  * New functions x-kill-client, delete-window-safely. send-client-message now groks long integers (i.e. cons cells) in 32-bit data (Timo Korvola)

  * window-put, window-get, image-put, image-get, font-put, font-get: use equal to compare keys, not eq

  * New module error-handler, implements a simple alternative error handler (and allows the much-maligned beep to be turned off), requires rep 0.11+

  * Allow the pointer-warp position to be defined relative to the window (Kai Großjohann)

  * New module shade-hover, unshades windows while the pointer is over them

  * Don't automatically warp to the new workspace when opening windows on a different workspace

  * Include iconified sticky windows in the window-menu, shorten sticky entries as usual (James Antill)

  * Support the TryExec field in GNOME desktop files (Ian)

  * New commands: raise-or-pass-through-click, raise-and-pass-through-click-if-focused

  * New module move-cursor, various commands for moving the mouse pointer; these commands are bound to the cursor keys when moving or resizing windows

  * Translation updates: es (Iñaki García Etxebarria), fr (Fabien Ninoles), gl (Jesus Bravo Alvarez), ja (Satoru Sato), nl (Jan Nieuwenhuizen), tr (Fâtih Demir)

  * Fix bug of leaving window-name unset when WM_NAME is a null text property

  * Don't fail catastrophically if unable to open the default font

  * Fixed method of truncating maximized window dimensions

  * Fixed the match-window skip-winlist and skip-tasklist properties I'd stupidly broken

  * Fixed bug of trying to edge-flip sticky windows

  * Fixed the move-workspace-forwards and move-workspace-backwards commands

  * Fixed uniconify-to-current-viewport option

  * Fixed infinite-loop bug in delete-empty-workspaces command

  * Avoid generating empty sub-menus when reading GNOME menu tree

0.22
====

  * Window frame parts are now first-class lisp data objects, allowing a higher level of control by themes

     New or updated functions to access frame parts directly:

     frame-part-get, frame-part-put, frame-part-window, frame-part-x-window, frame-part-position, frame-part-dimensions, frame-part-state, map-frame-parts, refresh-frame-part, rebuild-frame-part

     Other new functions: refresh-window

  * Updated sawmill-themer to 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

  * The call-after-property-changed function can now be given a list of properties to monitor (James Antill)

  * New function 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-hook now has a second argument (apart from the window), the list of symbolic states that changed (James Antill)

  * Add support for skip-winlist and skip-tasklist to the window matcher when GNOME support is enabled (Ben Liblit)

  * Integrated patch supporting multi-byte languages from the Kondara MNU/Linux distribution (forwarded by Yukihiro Nakai)

  * Translation updates: de (Christoph Rauch), es (Iñaki García Etxebarria), gl (Jesus Bravo Alvarez), ja (Satoru Sato), tr (Fâtih Demir)

  * Use a combo box in the configurator to display the list of themes (it gets given scroll bars when too big for the screen)

  * Changed timestamp handling---attempt to detect and discard timestamps that arrive out of order

  * Added option controlling title justification to mono theme

  * Filter Scroll_Lock modifiers as well as the other lock modifiers (Matt Krai)

  * Fixed display-message function update background color, and gracefully handle invalid color specifiers (Matt Krai)

  * Reverted to grabbing events on the client window, not the frame, avoids some awkward-to-fix-correctly problems

  * Load i18n support before other libraries; ensures that some static strings get translated

  * Fixed annoying flicker when cycling to an iconified window

0.21.1
======

  * Fixed problem causing spurious double-click events to be reported in click-to-focus mode

  * Fixed problem with binding -Off events in the window-keymap. (Matt Krai)

  * Don't try to grab non-existent keys (which actually grabs the entire keyboard)

  * Fixed some problems with reading unusually formatted GNOME menu entries

0.21
====

  * Frame pattern definitions (foreground, background, font) may now take alists as well as the old single object, or list of four objects. Possible states are inactive, focused, highlighted, clicked, inactive-highlighted, inactive-clicked. (Last two are new)

  * New program sawmill-themer. A GUI for creating simple themes (those without any parts defined by functions)

  * New module gnome-int, loaded by sawmill-defaults if GNOME is around, sets up some GNOME'ish things

  * New command toggle-single-window-mode

  * Translation updates/additions: de (Christoph Rauch), es (Iñaki García Etxebarria), nl (Han-Wen Nienhuys)

  * Optional removal of tooltips after time period (Morgan Schweers)

  * Any-RET completes interactive move or resize

  * Work around Imlib's annoying image caching, make-image now always returns a new image

  * Fixed gc bug when building window frames

  * Fixed X property handling on Alpha's (George Lebl)

  * Make call-command accept closures

  * Make (cursor . nil) work correctly in frame definitions

  * Grab on frame window, not client window (ICCCM compliant)

  * Fixed the ``uniconify to current workspace'' option

  * Added window-maximization predicates to the gaol

0.20
====

  * Rewrote workspace handling---windows can now appear on multiple workspaces, with each instance having different properties (position, size, whatever...)

     Create new window instances by using the copy-to-next-workspace, copy-to-previous-workspace, and copy-to-workspace:N commands. Merge instances by moving them to the same workspace, or using the delete-window-instance command

  * Added linear-viewport commands---indexing two-dimensional virtual workspace areas by one-dimensional values (adapted from code by Eric Kidd)

  * Rewrote tooltips; especially how they're removed (also, don't show null keymaps)

  * Added new match-window property ungrouped. Means to put the window in a group on its own

  * Translation additions/updates: da (Wandy Christiansen), en_GB (me), es (Iñaki García Etxebarria), fr (Christian Gillot), gl (Jesus Bravo Alvarez)

  * Fixed bug of not refocusing unshaded windows

  * Fixed bug of not notifying windows of their actual position after placing them

  * Fixed bug when grabbing Hyper-modified buttons

  * Fixed the focus-flickering when moving windows opaquely

  * Fixed the commandp function when applied to autoload stubs

  * Fixed typo in gnome-logout command (Jens Finke)

  * Fixed raise-window-and-pass-through-click command to pass click2, etc, events through to frame parts

  * Fixed infinite-regress bug when reading GNOME menu entries (Type=directory, but actually a file)

  * Fixed bug when showing window-move position with snapped movement (adapted from merlin@merlin.org)

  * Fixed bug when matching null text properties

0.19
====

  * Added tooltips for window frames (disabled by default)

  * Added Grab... button to match-windows dialogue, grabs the value of an X property from a window

  * Support for creating cursors from bitmaps, and for changing the colors of cursors

  * Internationalized all strings in the configurator

  * New functions: frame-part-get, server-grabbed-p, forget-button-press, resize-window-with-hints, window-in-workspace-p, windows-share-workspace-p

  * New window properties: never-focus, raise-on-focus

  * New pseudo-property (for window matching): size, in terms of the window's size hints

  * Message catalogue additions/updates: Galician (Jesus Bravo Alvarez); Danish (Birger Langkjer)

  * Don't ignore initial state property of windows

  * Option to control height of drawn bevels (Chris Hanson)

  * More logical method of drawing diagonal gradients (Chris Hanson)

  * Fixed typo when looking for i18n theme README files (Jesus Bravo Alvarez)

  * Fixed popup-apps-menu command (Gérard Milmeister)

  * Fixed define-frame-class when creating keymaps

  * Fixed conversion of old-style (set ...) custom types

  * Fixed raise-window-and-pass-through-click command to pass-through subsequent clicks

  * Fixed problems when grabbing/ungrabbing customized keymaps

  * Fixed screen corruption when doing wireframe moving and move-resize-raise-window is set

  * Hacked around window-order problem when sticky windows exist

0.18
====

  * General subsystem for matching windows to properties as they're created. Allows matching on one or more of the window's X properties (e.g. name, class, etc...), and then setting any number of window manager properties as a result. See the Matched Windows customize group

  * Removed all auto-FOO-alist and BAR-windows-re variables, they're obsoleted by the general match-windows mechanism

  * Respect window's size hints when maximizing (both to see if the window is maximizable, and to truncate the maximized dimensions to an integral number of rows and columns)

  * Show actual colors in the configurator, not just their names

  * Added a new directory to the theme search path: PREFIX/share/sawmill/themes. Use this for system-wide themes (don't use the version specific directory)

  * Included a new theme mono

  * Deprecated the show-message function, replaced by display-message with a better calling interface; also displays multi-line strings

  * Deprecated the menu ``expand variables when first in list'' behaviour. Instead expand variables when the list is dotted to them, as is done for functions

  * Support the Hyper modifier, prefix is H-

  * In the configurator, look for i18n'd theme README files (Yukihiro Nakai)

  * Added option to disable the ability to grab a second edge while resizing (resize-add-edges)

  * Included Danish message catalogue (Kenneth Christiansen)

  * Renamed fixed-position property as sticky-viewport, and focus-proxy-click as focus-click-through

  * When evaluating mouse events, look in the window that the pointer was in when the button was pressed, not where the pointer currently is

  * Fixed bug where focus gets totally lost after closing a Motif application that has grabbed the keyboard

  * Fixed (again) the problems when handling remapped windows; also should be more ICCCM-compliant

  * Fixed typos in one-dimensional maximisation (Gérard Milmeister)

  * Fixed the logic deciding when it's necessary to switch workspaces after merging an empty one

  * Fixed interactive placement showing the window when edge-flipping (but it still doesn't work properly, rubber band traces are left)

  * Removed flicker when focusing already-focused windows

0.17
====

  * First version to use lexically scoped librep. This enables themes to run in a ``safe'' environment, but all existing themes will need to be ported; other language changes include the use of a single symbol namespace, and scheme-like function call semantics

  * Support for internationalization of messages and run-time documentation; an en_GB catalogue is the only translation currently, so please send me .po files for your native languages!

     New option --disable-nls to disable i18n

  * New functions call-after-property-changed and gtkrc-call-after-changed to allow themes to receive these events (hooks are now off-limits to themes)

  * New command raise-window-and-pass-through-click; bind it to a mouse button in the window-keymap to get the ``raise window on click'' behaviour that seems popular

  * New commands to move windows incrementally: slide-window-X and slide-group-X for X one of: left, right, up, down

  * New commands to control ignored property of windows (Julian Missig)

  * New commands to toggle GNOME skip-winlist and skip-tasklist properties of windows

  * Respect window gravity with program-specified window placement (merlin@merlin.org)

  * Fixed a memory leak in the stacking-order function

  * Fixed the bevel-image function (Scott Sams)

  * Never look in the focused window's keymap by default with mouse events

  * Hacked around the ``need an X11 connection to compile'' misfeature

  * Fixed bug in gnome-menu code when GNOME binaries aren't in the first $PATH item; also accept non-alphanumeric language codes

  * Fixed interactive window placement (again)

  * Rewrote obscure documentation for some custom options

  * Fixed bug when grabbing events with AnyModifier and a specific button

0.16
====

  * Support window groups, both as defined by applications, and defined by the user (either interactively through the window's menu, or via the auto-group-alist and persistent-group-ids variables).

     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

  * Improved GNOME menu support---merge duplicate sub-menus, scan PATH for gnome-share-directory, also look in /etc/X11/applnk for menu entries

  * Option to control whether edge-flipping flips viewports or workspaces (edge-flip-type)

  * New hook after-framing-hook: called whenever a window's frame is changed or recalibrated

  * New window placement mode: first-fit-or-interactive

  * Variables specifying common cursor shapes: (move-cursor-shape, resize-cursor-shape, select-window-cursor-shape)

  * Fix interactive placement

  * Fix problem of window losing focus when cycle-windows only finds a single window; also, abort immediately if there's no windows to cycle through at all

  * Fix how the WM_NORMAL_HINTS property is read after it's been updated

  * Fix maximize-fill functions to respect the maximize-ignore-when-filling option

  * Fix interactive move/resize aborting if keyboard is already grabbed

  * Ungrab the keyboard as well as the pointer before popping menus

0.15
====

  * Changed how themes are loaded from tar files---the tar file must now contain a directory with the same name as the theme; it's this directory that stores the data files

  * Allow viewport edge-flipping to be enabled by the customization system, also enable flipping while moving windows

  * Unified the method of marking which windows should be avoided when maximizing, and which windows should be avoided when using the fitted placement methods. Set the avoid property instead of the maximize-avoid property; new functions window-avoided-p and avoided-windows; new regexp avoided-windows-re

  * New command delete-empty-workspaces

  * Default theme is now microGUI

  * When resizing only one edge of a window, moving the pointer past one of the perpendicular edges grabs that edge also

  * Only the first three buttons focus a window in click-to-focus mode

  * Changed behaviour of window-id and window-frame-dimensions functions. Replaced query-last-pointer function by query-button-press-pointer

  * New hooks: while-moving-hook, while-resizing-hook

  * Notice when WM_TRANSIENT_FOR property changes

  * More bug fixes to the maximization code, mainly for efficiency; also make first-fit placement work from top-left again

  * Fix bug when matching events with Any modifier as well as other modifiers

  * Fix bug in window-outside-viewport-p (Andreas Degert)

  * Fix bug in sawmill-client -- with long inputs

  * Fix bug when matching windows with session data---SM_CLIENT_ID or WM_COMMAND has to match

  * Fix bugs when passive grabbing non-button-press pointer events

0.14
====

  * Rewrote window-maximization, many new options

  * New option 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)

  * Load GNOME support code automatically if it looks like GNOME is being used

  * Create unix-domain sockets in /tmp

  * New hooks: window-moved-hook, window-resized-hook, after-initialization-hook, shape-notify-hook.

  * Improved how menus are displayed; the window-ops menu is shown by ButtonPress not ButtonRelease events

  * Refocus most-recently-focused window when switching viewport

  * Added centered placement style

  * Added symbol-completion to readline-based client

  * Fix bug of not noticing WM_NORMAL_HINTS property changes; follow the window's maximum size hints

  * Fix bug of not reframing windows when they change from unshaped to shaped, or vice versa

0.13
====

  * New option to only highlight frame parts when their window is focused (highlight-when-unfocused)

  * Typing ESC while moving/resizing a window cancels the operation, restoring the original geometry

  * New session management hook sm-after-restore-hook

  * New function set-frame-part-value---makes customizing the frame-part-classes variables easier

  * Support for loading themes from tar files; needs librep 0.7

  * Fix bug when allocating colors (choosing an incorrect cached color)

  * Fix image tiling in frame part backgrounds

  * Handle shifted keysyms when passive grabbing

  * Fix another race condition when active grabbing

  * Fix _WIN_CLIENT_LIST property not being set properly (both missing windows immediately after they're adopted, and of intentionally skipping ignored windows)

  * Fix some problems with viewports when exiting/restarting

  * Fix broken stacking of windows after they're mapped

  * Prevent smart window placement blowing up when large numbers of windows are open/opened (throttle back to random placement when the event queue is too large, as well as trying to prune the search space)

0.12
====

  * Remember most recently focused windows on each workspace, activate that window after changing workspaces; also, try to preserve focus when moving windows between workspaces

  * Option to disable auto-raise while cycling through windows (cycle-disable-auto-raise); option to restrict cycling to the current viewport (cycle-all-viewports)

  * Option lock-first-workspace is now enabled by default, and prevents both the first and last interesting workspaces being moved inwards

  * Added readline support to the client program, pass --with-readline option to configure (from Christopher P Goller goller@eng.utah.edu)

  * Added shaped-transient frame to microGUI theme

  * New frame part attribute below-client

  * Release passive grabs when unadopting windows

  * When no window has the focus, the root-window-keymap is searched for key-press events

  * Fix bug when binding to the unix-domain socket

  * Fix focus sometimes being lost when the focused window is destroyed

  * Fix bug when reading GNOME menu entries without Type fields

  * Fix bug when removing title or border of shaped-transient window types (make the window completely unframed)

  * Fix bug when shading a transient window with decorate-transients enabled

  * Fix some bugs when placing windows that are almost as big or bigger than the screen

  * Fix some race-conditions between wm-generated and client-generated map/unmap/reparent events

  * Fix infamous ``jerky pointer'' bug, this will also make overlapping shaped frame-parts display correctly

  * Fix bug where cycle-windows could leave a window originally under the pointer that's unfocused, drawn as though it is focused

0.11
====

  * New option lock-first-workspace, prevent the first workspace from being deleted when it's empty

  * New option ignore-window-input-hint, to always give windows the focus, whether they say they will accept it or not

  * New options when cycling windows: cycle-warp-pointer and cycle-focus-windows

  * Restore the old method of setting the focus, should fix bug of losing focus totally when switching to a new workspace

0.10
====

  * Implemented virtual workspaces, bind to the move-viewport-X and move-window-X commands (for X being left, right, up, or down)

  * Added a new theme: microGUI by Ryan Lovett ryan@ocf.berkeley.edu, based on the QNX Photon screenshots

  * Added a Grab key button in the bindings widget, replaces the current binding with the next pressed key

  * Lisp module to load the GNOME menus and use them to replace the applications menu. Add (require 'gnome-menu) to your ~/.sawmillrc file to load it

  * Network server is disabled by default (since it can provide a security hole if X access control is disabled); re-enabled the old unix domain socket code (see the FAQ for more details)

  * Only give the input focus to windows that actually want it

  * New option to keep transient windows above their parents (transients-above-parents)

  * New option to control how the workspace boundary is handled when moving windows between workspaces (workspace-send-boundary-mode)

  * New commands send-to-workspace:X for X from 1 to 9

  * While windows are hidden or shaded, unmap the client (for ICCCM compliance)

  * Slightly different method of handling destroyed clients, hopefully results in fewer annoying error messages

  * Support X installations without X11R6 session management (by not doing any session management)

  * Don't ask the session manager to save our environment

  * Fix bug where a window is destroyed/unmapped while it's being resized or moved

  * Fix bug where window can still be auto-raised even if it's been defocused

  * Fix problems when --prefix option has a trailing slash

  * Now handles client windows being reparented by a third party (i.e. swallowing apps)

0.9
===

  * The first-fit and best-fit algorithms are now much more intelligent, e.g. instead of falling back to random placement when a window can't be placed without overlapping an existing window, they will attempt to minimize this degree of overlapping

  * The foreground property of each frame part may now be an image instead of a piece of text

  * New theme 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...

  * Use Imlib's fuzzy color matching for all color allocation; this should help on PseudoColor visuals

  * Added an xterm command to launch an xterm

  * Improved the bindings customization widget layout; added a Copy button to insert a copy of the current binding

  * Added next-workspace-row and previous-workspace-row commands. Together with the workspace-columns variable these mimic a 2d desktop

  * Removed the cycle-through-workspaces option, there's now workspace-boundary-mode---one of stop, wrap-around or keep-going

  * Added option to include ignored windows when edge snapping (move-snap-ignored-windows)

  * Fix race condition between startup of sawmill and gmc; sawmill now has earlier priority

  * Fix seg fault when running out of color cells while generating a window frame

  * Fix bug where the window-workspace mapping wasn't reloaded from saved sessions

  * Fix cancel/revert problems in bindings widget

  * Fix problems binding to shifted keys when using the XKEYBOARD extension and XFree86

  * Be ICCCM compliant when a client requests to be moved

  * Fix crash when tiling small images into large images

  * Fix bug where windows could be snapped totally off-screen

  * Fix bug when windows change their override_redirect attribute while unmapped

  * Fix bug associated with WordPerfect's menu window

0.8
===

  * First attempt at best-fit window placement (doesn't really work properly yet...)

  * Added a customization option to focus windows when they're un-iconified (focus-windows-on-uniconify)

  * Fix bug in click-to-focus mode where the click is only passed through to the client window, not to any local bindings of the wm

  * Don't leave windows unframed if there's an error in the user's startup files

  * Fix bug in preallocated-workspaces option

  * Don't place windows off-screen in first-fit mode

0.7
===

  * Added stack-based window cycling, bound to M-TAB by default. Hold Meta, keep pressing TAB until the correct window is reached, then let go of Meta.

  * Added first-fit window placement (a.k.a smart-placement)

  * Completed first stage of workspace rewrite---shouldn't go ballistic when windows are removed anymore

  * Added override-frame-part-classes variable---allows all frame properties to be overridden on a per-class basis

  * Click-to-focus now accepts any button and any modifiers

  * Don't snap to gmc icons or panels

  * Added an auto-window-type-alist variable mapping window names to border types

  * New variables eval-modifier-events and eval-key-release-events to allow catching these types of keyboard events, disabled by default

  * Added functions for actively grabbing the keyboard

  * Removed the long names of the keyboard modifiers, only the single character modifiers are left

  * If no alt modifier, set it to the same as meta; new variables alt-keysyms and meta-keysyms describe the virtual modifier assignments

  * Fix bug when handling shaped frame parts---it was possible to go into a long enter-, leave-notify loop when the old shape was cleared

  * Fix bug where opaque resizing with snap-to-edges on moved the window as well as resizing it

  * Fix bug when raising the only managed window

  * Fix bug where very small client windows got weirdly shaped frames

0.6
===

  * Define the standard classes of frame parts (i.e. things like close button, title, left border, etc...) then allow the state of members of these classes to be set in one place (the frame-part-classes variable). This should ensure that different themes have the same feel (but a feel that may be customized by the user)

  * Allow frame parts to be removed if possible (if they have the removable property). Nothing makes use of this yet

  * Added window-shading, double-click button1 on the title bar

  * Created a sawmill capplet for the GNOME control center. Use the --enable-capplet configure option to build it

  * First attempt at a technical manual (very quickly written, so probably some inaccuracies)

  * In the gtk theme, draw bevels on window decorations

  * Use spin-buttons in the configurator to enter numbers

  * Add option focus-proxy-click controlling whether to pass the focus-inducing button-press event to the underlying window (in click-to-focus mode)

  * Changed the bindings in window borders, it's now the more usual button1 to resize, button2 to move

  * When clicking and dragging windows, ensure that the clicked frame part stays clicked until the button is released

  * If in click-to-focus mode, and there's no parent window to focus when the focused window is closed, focus the topmost window (not the window under the pointer as in the other focus modes)

  * Changing window frames is much less ugly, no flicker at all!

  * Try to optimise window restacking some more

  * Sped up opaque window moving when the position display is enabled

  * Preserve iconified state across restarts

  * Optimise updating the shape of an unframed window (this stops gmc icons flashing annoyingly)

  * Fix bugs in click-to-focus mode where some windows were un-focusable

  * Fix bug where cycling through windows in click-to-focus mode didn't focus the activated window

  * Fix bug where comparing sawmill lisp objects caused a crash

  * Fix bug where initiating a resize in the middle of the window didn't allow any of the edges to be moved

  * Fix bug where changing the ``decorate transients'' option didn't alter any existing transient windows

  * Fix bug where iconifying a sticky or ignored window gave no way of reclaiming it---these windows now appear at the end of the window menu

0.5
===

  * Now does session management. The scheme is extensible, arbitrary Lisp modules can save and restore window state due to their own functionality (using the sm-window-save-functions and sm-restore-window-hook hooks). See lisp/workspace.jl for an example

  * Displays window position or dimensions whilst interactively moving or resizing a window (move-show-position, resize-show-dimensions)

  * Mechanism for setting frame styles on a per-window basis (this was always possible, just not easy). The auto-frame-style-alist variable associates window name regular expressions with frame styles. Also, the window-ops-menu has a new submenu with all possible styles

  * New option preallocated-workspaces, the number of workspaces to create at startup

  * Window-workspace mapping is preserved through restart (as long as the GNOME hints are enabled)

  * Theme directories may contain a short README file that will be displayed in the configuration tool

  * Changed the custom file to ~/.sawmill/custom instead of ~/.sawmill-custom. The old file will be moved to the new location if it exists

  * Install sawmill-menu under libexec since it shouldn't be run manually

  * Option in gradient theme to create full-sized gradient images, trading memory for quality

  * Workaround the flicker when raising windows

  * Changed most of the menus and custom customize options into normal variables (they're not particularly intuitive)

0.4
===

  * Frame parts can now be highlighted when the mouse is over them, also they ``un-click'' and ``re-click'' as the pointer leaves and re-enters their window. ButtonRelease bindings are only activated when the mouse is in the window at the time

  * Frame part backgrounds can now be rendered on-the-fly using the new renderer property in frame definitions. This property is a function called with args (IMAGE STATE); it should draw a background into IMAGE for the specified state (nil, focused, highlighted or clicked)

  * New theme 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

  * Functions for drawing color gradients and bevels into images. The new gradient theme uses these and on-the-fly rendering to do afterstep-like window titles

  * Configurator changes: use a paned widget to separate the list of groups from the settings (stops their relative sizes changing), allow each group to be customized separately, either through a new set of root-submenus or the commands customize:GROUP for each GROUP.

  * Changed the way that ``themes'' are organised, each theme now gets its own directory, which must include a theme.jl or theme.jlc script to initialise a frame-style of the same name as the directory. While this script is being evaluated the image path is set so that the theme can load any images stored in its directory.

     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 PREFIX/share/sawmill/VERSION/themes.

  * Resizing now chooses the direction to resize the window in by the initial position of the pointer in relation to the window. The window is divided into a 3x3 grid, the pointer must be in one of the outer rectangles to resize in that direction

  * New commands select-workspace:X for X between 1 and 9

  * Support multiple depths, or layers, of windows

  * It's now possible to move the current workspace up or down the list of all workspaces

  * New option -c COMMAND to sawmill-client; invokes the named interactive function

  * When an app asks for no title and no border, give it what it wants---use the new unframed window type

  * The maximize button works

  * Option to control placement of transient windows (place-transient-mode)

  * Changing the frame style preserves the original window stacking order

  * Added documentation strings for most built-in functions

  * Fix bug of evaluating both KeyPress and KeyRelease events

  * Fix bug of making the shape mask of unshaped client windows too big

  * Fix bug where already-handled BadWindow errors were being reported

  * Fix bug where the window-ops-menu could be displayed from one window but then affect a different window

  * Fix bug where click-to-focus doesn't work for new windows

  * Fix bug where deleting the last workspace selected the first, not the new last workspace

  * Fix bug where changing a colormap when no window is focused causes a segfault

  * Fix bug where iconifying a window may leave it in the clicked state after it's uniconified

  * Fix Caps_Lock and Num_Lock modifiers interfering with bindings

  * Fix accessing X properties on 64-bit architectures

  * Fix bug where pointer may be left grabbed after moving a window

0.3a
====

  * Support the maximized GNOME window states

  * Where available, show documentation strings of commands in the configurator

  * Improve the method of handling clicks in frame-parts

  * Fix asynchronous client-server protocol

  * Fix interactive window moving/resizing (don't leave traces of the rubber-band, stop the window initially ``jumping'' to the pointer)

0.3
===

  * Implemented window maximization

  * Added support for snapping to window edges when interactively moving windows (move-snap-edges and move-snap-epsilon)

  * First attempt at handling a subset of the Motif and OpenLook window hints

  * Removed the sloppy-focus variable, 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)

  * When resolving pointer events, scan the keymap property of the window under the pointer, not the focused window (as with keypress events)

  * The sawmill-client program can now communicate inter-host, since it uses X properties not raw sockets

  * New hook before-exit-hook, called immediately before shutting down

  * Rewrote the GNOME support as a Lisp module

  * Placing windows interactively now works

  * Fixed the bug on Solaris where deleting windows could cause a segmentation fault

0.2
===

  * Added a user-customization system, inspired by Emacs' customize facility. Invoke this through the sawmill-ui program, or from the Customize... entry in the main menu. All changes are stored in the Lisp script ~/.sawmill-custom

  * Selected windows may now be raised (raise-selected-windows)

  * It's possible to prevent the mouse pointer being warped to selected windows (warp-to-selected-windows)

  * The brushed-metal and simple themes now define all four standard frame types

  * Frame themes are now stored in a separate directory (PREFIX/share/sawmill/VERSION/lisp/themes) so that the list of all available themes can be made automatically

  * The frame colors of the simple frame style can now be customized (simple-normal-color and simple-active-color)

  * The sawmill-defaults.jl script enables GNOME compliance unconditionally (since it has no ill-effects even if GNOME isn't being used)

  * Transient windows can be given the same frames as normal windows (decorate-transients)

  * Newly-displayed transient windows can be automatically given the focus if their parent window is focused (transients-get-focus)

  * Any newly-displayed windows can be automatically given the input focus (focus-windows-when-mapped)

  * The foreground, background and font attributes of each frame part may now refer to a function

  * Fixed the window-move bug whereby the first motion event was discarded

  * Fixed the bug where windows may be placed partially off the root window, even if they needn't be

  * Fixed the shaped frame parts bug (they didn't work)

  * Miscellaneous other bug-fixes

0.1
===

First proper release