This is sawfish.info, produced by makeinfo version 4.8 from
sawfish.texi.

INFO-DIR-SECTION Programming
START-INFO-DIR-ENTRY
* sawfish: (sawfish).		sawfish programming manual
END-INFO-DIR-ENTRY

   This is `The sawfish Programming Manual', for sawfish.

   Copyright 1999 - 2003 John Harper, 2007 - 2011 Sawfish team.

   Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

   Permission is granted to copy and distribute modified versions of
this manual under the conditions for verbatim copying, provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.


File: sawfish.info,  Node: Top,  Next: Copying,  Prev: (dir),  Up: (dir)

   This document describes the Lisp programming interface to `sawfish',
an extensible X11 window manager.

   For edit history, see `ChangeLog' file.

* Menu:

* Copying::                     Distribution conditions
* Introduction::                Brief introduction to sawfish
* News::                        Feature history

* Colors::			Color type
* Fonts::			Font type
* Images::			Image type
* Cursors::			Cursor type
* Windows::			Window type
* Customization::		Supporting user-configuration

* Window Frames::		Decorating windows
* Viewports::			Subdivided desktop areas
* Workspaces::			Multiple desktop areas
* RandR and Xinerama::          Many monitors and updates
* Window Placement::            Controlling placement of new windows
* Popup Menus::			Displaying menus
* Events::			Input event types
* Commands::			Functions you can invoke interactively
* Keymaps::			Bindings events to actions
* Event Loop::			Handling input events
* Miscellaneous Functions::	Useful features
* External Applications::       Invocation of external applications
* Standard Hooks::		Hooking into wm actions
* Standard Properties::		Window properties
* Session Management::		Saving state across sessions
* Low-level X Interface::       Accessing the server directly

* FAQ::				Frequently asked questions

* Function Index::              Menu of all documented functions
* Variable Index::              All variables which have been mentioned
* Concept Index::               Main index, references to all sections


File: sawfish.info,  Node: Copying,  Next: Introduction,  Prev: Top,  Up: Top

1 Copying
*********

Sawfish is copyright (C) 1999 John Harper and is released under the
terms of the GNU General Public License. See the included file
`COPYING' for the full text of the license (or *note Copying:
(emacs)Copying.).

     This is free software - you are welcome to redistribute it and/or
     modify it under the terms of the GNU General Public License as
     published by the Free Software Foundation; either version 2, or
     (at your option) any later version.

     Sawfish is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.


File: sawfish.info,  Node: Introduction,  Next: News,  Prev: Copying,  Up: Top

2 Introduction
**************

Sawfish is a lisp-extensible window manager for X11. Its aim is to
allow all areas of window management (decoration, manipulation) to be
customized as far as is possible, yet still remain as fast or faster
than existing window managers.

   Despite this extensibility its policy is very minimal compared to
most window managers. It does not implement desktop backgrounds,
applications docks, or other things that may be achieved through
separate applications.

   All high-level window management functions are implemented in Lisp
for future extensibility or redefinition. Also, most received events are
exported to the Lisp environment through key-bindings and hooks,
similar to in Emacs. These events include pointer behavior and many
internal X11 events.

   Sawfish uses the librep Lisp environment (*note Overview:
(librep)Top.), this is a run-time library implementing a language
similar to Emacs Lisp (*note Overview: (elisp)Top.), but with many
extensions, and using lexical instead of dynamic scope. This manual
assumes at least a basic knowledge of the language.

   Homepage and mailing list are listed in *Note FAQ::.


File: sawfish.info,  Node: News,  Next: Colors,  Prev: Introduction,  Up: Top

3 News
******

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.

1.13.0 "Bolero"
===============

   * Bug Fixes
        - Fix random resize issues with GTK+3 [GSR]

        - Improved KDE4/5 integration, prevent Plasma and KRunner
          windows to be tiled. [Christopher Bratusek]

        - Update KDE5 session script, use `startx11-plasma' instead of
          `startkde' [Christpher Bratusek]

        - Make `shring-yank' recognise screen edges when shrinking or
          yanking windows, when the window crosses screen edges [Michal
          Nazarewicz]

        - Add support for `_NET_FRAME_EXTENTS' and
          `_NET_REQUEST_FRAME_EXTENTS' properties, fixing issues with
          HTML5 data element positioning in browsers, and several more
          [GSR]

        - Fix wrong detection of GNOME because of other DEs using an
          old GNOME-related envvar [Christopher Bratusek]


   * Build and Installation
        - Make build reproducible [Bernhard M. Wiedemann]

        - Fix cross compilation [Helmut Grohne]

        - Fix compilation with GCC10 [Kim B. Heino]
             x allow overriding `build-info' build time, hostname and
               username.

             x avoid recreating theme tarball for every single file
               (the old code was erroneously recreating theme tarballs
               for each file contained thus calling `tar' over 200
               times to create 8 tarballs)

             x make `DOC' file reproducibly

             x other improvements to make builds reproducible

        - Explicitely check for `rep' binary, not just `librep-dev'.
          [Christopher Bratusek]

        - First check for `libgtk2.0-dev' then for `rep-gtk-dev'.
          [Christopher Bratusek]

        - Only create session file directories for GNOME 2, KDE 4 or
          KDE 5 if actually requested by user. [Christopher Bratusek]

        - Makefile.in `distclean' target no longer utilizes
          debian/rules, no longer removes finalized RPM spec file or
          Gentoo ebuild. [Christopher Bratusek]

        - Remove dead code from `build-info' [Ulrik Haugen]

        - Revert commit `6ad175d835aee85179259d7c02b3be152d3e4b86',
          "The problem is that any sticky windows that have been
          focused…", see https://github.com/SawfishWM/sawfish/pull/49
          [Mario Goulart]

   * New or changes features
        - Make `match-window' allow specifying arbitrary functions as
          filter [Michal Nazarewicz]

   * Miscellaneous Changes
        - Various minor changes to the Makefiles, mostly replacing
          `gitlcean' target with `distclean' target and adding `.PHONY'
          section. Also move theme tarball creation into `all' target,
          rather than `install' target. [Christopher Bratusek]

        - Make `rename-window' throw an actual useful error message if
          no string (or no usable) was given. [Christopher Bratusek]

        - Make `resize-window-prompt' throw an actual useful error
          message if one (or both) of the input values was not given.
          [Christopher Bratusek]

        - Move several modules from `sawfish.wm.prg' into the Sawfish
          Extras package [Christopher Bratusek]
             + `diodon'

             + `fehlstart'

             + `idesk'

             + `nm-applet'

             + `pancake'

        - Filter out `Trayer' in `cabinet'. [Christopher Bratusek]

        - Update Lumina integration. [Christopher Bratusek]

        - Update GNOME integration and explicitely check for GNOME,
          respectively GNOME-classic [Christopher Bratusek]

        - Update KDE5 integration, check for plasma as desktop session
          [Christopher Bratusek]

        - Simplify Frame-Style README parsing. [OpenBSD patch]

        - Update Japanese translation. [Takeshi Hamasaki]

        - Update Korean translation. [parkmino]

1.12.0 "The Hidden Village"
===========================

   * Bug Fixes
        - Fixed that a focus change by pointer motion was ignored after
          x-cycle. [Teika Kazura]

        - Focus-mode `enter-exit' now ignores `pointer-out' event.
          Fixing flickering bugs with widgets like GtkComboBox,
          GtkCompletion or Firefox' URL-Bar. [Teika Kazura]

        - Fixed that `edge-flip-delay' did not work as expected. Before
          this fix the edge-action would always be actived when the
          cursor hit the edge, and `edge-flip-delay' would only delay
          the actual action. Leaving the edge before `edge-flip-delay'
          ended, would not stop the action. Now `edge-flip-delay'
          properly works when the cursor leaves the edge before
          `edge-flip-delay' ended, the action will not be executed as
          expected. [Christopher Bratusek]

        - Better detection of transient windows during tiling [Jose A.
          Ortega Ruiz]

   * Build and Installation
        - When building Sawfish while an instance of it is running, a
          sawfish-managed `conky' instance does no longer get killed.
          [Christopher Bratusek]

        - Fix `libtool' version check in `autogen.sh'. [Christopher
          Bratusek]

        - Remove `gitclean' Makefile target, improve `distclean'
          target. [Christopher Bratusek]

   * New Features
        - The Tiling functions now use `calculate-workarea' to not
          overlap `_NET_WM_STRUT' windows like panels and others.
          [Christopher Bratusek]

        - Let `window-icon-image' use `NET_WM_ICON' to get 16x16 icon.
          Also add a size-parameter in case a different one is desired.
          [hans1024]

        - Allow passing of extra (custom) arguments to compton. [Joshua
          Moller-Mara]

   * Miscellaneous Changes
        - Add `lumina-window-matchers' for better interaction of Lumina
          and Compton. Also filter Lumina out from `cabinet'.
          [Christopher Bratusek]

        - Add double buffering of frame parts to reduce flickering
          while redraw of frames. [hans1024]

        - Properly filter out `conky' from `cabinet'. [Christopher
          Bratusek]

        - Added session integration for KDE5, `--with-kde5session'
          configure flag, updated `sawfish.wm.integration.kde',
          sawfish-kde5-session package for Debian GNU/Linux
          [Christopher Bratusek]

        - Restructured session file installation. Removed
          `--with-xdmsession' configure flag, the bare Sawfish session
          is installed always. For the remaining there's now an
          configure option each: `--with-matesession' (MATE),
          `--with-luminasession' (Lumina) and `--with-xfcesession'
          (XFCE). [Christopher Bratusek]

        - Properly uninstall all session related files upon `make
          uninstall' [Christopher Bratusek]

        - Update `config.sub', `config.guess' and `install-sh' to
          2016-04 [Christopher Bratusek]

        - Add window matcher `never-tile' to `Conky' by default
          [Christopher Bratusek]

        - Guard `PangoX' functions as it is going to go away (Debian
          patch) [Emilio Pozuelo Monfort]

        - Merge downstream Debian GNU/Linux packaging scripts upstream
          [Christopher Bratusek]

        - More meaningful error message when `libXtst' was not found by
          `configure' [Allan Duncan]

        - Add `GenericName' and `Categories' to desktop files [OpenSuSE
          patch]

        - Update `sawfish.spec' [Allan Duncan]

        - Debian code review
             x Fix FSF address across all files [Christopher Bratusek]

             x Fix code spellings [Christopher Bratusek]

             x Rename `configure.in' to `configure.ac' [Christopher
               Bratusek]

             x Make build reproducible (Debian patch) [Jose M. Calhariz]

             x Honour `SOURCE_DATE_EPOCH' for build.h when building
               Debian packages (Debian patch) [Alexis Bienvenüe]

             x Add `Keyword' entry to `sawfish.desktop' (Debian patch)
               [Jose M. Calhariz]

             x Do not remove `wallpaper.jlc' compiled lisp file. It
               used to break Wallpaper Setter, thus it was removed. But
               with fixes since the first release of the Wallpaper
               Setter this is no longer the case, thus  the compiled
               file does not need to be removed anymore. (Debian patch)
               [Jose M. Calhariz]

1.11 "Apollo"
=============

   * Bug Fixes
        - Fix possibly wrong `input-focus' from `enter-*' focus-modes
          in tabbed-windowing. [fuchur]

        - Properly support tabbed-windowing when tiling is active as
          well. [fuchur]

        - Several fixes for the `wallpaper' module regarding wrong
          values or non-existent files. [Christopher Bratusek]

        - When calling the `stop' function from `sawfish.wm.prg'
          fehlstart, trayer, pancake, xmobar and xsettingsd modules
          calling `start' afterwards in the same session failed. This
          is fixed now. [Christopher Bratusek]

        - When installing manpages the `mandir' from configure is now
          honoured. [Christopher Bratusek]

        - Fix handling symbol-type defcustoms in sawfish-xgettext,
          preventing generation of new sawfish.pot. [Christopher
          Bratusek]

        - Fixed that `Open Home' was shown in the root menu even if
          `filemanager-program' was unset. [Christopher Bratusek]

        - In SawfishConfig `x-terminal-emulator' was used to access the
          Sawfish info-file. For better compat with
          non-Debian-distributions, use `xterm' instead. Note that the
          Sawfish variable `xterm-program' is not accessible from
          SawfishConfig. [Christopher Bratusek]

   * New Features
        - Session scripts with xdm (and compatible) integration.
          [fuchur] [Christopher Bratusek]
             x `sawfish-mate-session'/`Sawfish/MATE' start Sawfish and
               then initialize MATE session.

             x `sawfish-kde4-session'/`Sawfish/KDE4' start 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]

             x `sawfish-xfce-session'/`Sawfish/XFCE' start Sawfish and
               then initialize XFCE session.

             x `sawfish-lumina-session'/`Sawfish/Lumina' start Sawfish
               and then initialize Lumina session. Also add Lumina
               integration module.

             x Other desktop environments:
                  + GNOME2: set the GConf key
                    `/desktop/gnome/session/required-components/windowmanager'
                    to `sawfish' and start a new session.

                  + LXDE: in lxsession-default-apps replace `openbox'
                    with `sawfish'.

                  + Razor Qt: in the razor configuration center >
                    default applications enter `sawfish' in the
                    corresponding field.

                  + Other: no other desktop environments are officially
                    supported as of now.

             x Note for Debian users: the official Sawfish Debian
               GNU/Linux packages for amd64/i386/armhf distributed at
               http://apt.nanolx.org/ now have three more packages
               built from the Sawfish source:
                  + `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)

        - `CTWM' like interactive window placement. Previously pressing
          any button while interactively placing a window would place
          it. `Sawfish' now mimics `CTWM's 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é]

        - New EdgeActions for when moving windows. [Christopher
          Bratusek]
             x `kill' Kill a window when moved to the given edge

             x `iconify' Iconify a window when moved to the given edge

             x `move-window-viewport' Move window to the viewport in
               the direction of moving against the edge

             x `move-window-workspace' Move window to the workspace in
               the direction of moving against the edge

        - Separate left/right and top/bottom edges in SawfishConfig,
          allowing for individual actions on each edge. [Christopher
          Bratusek]

        - Add `send-window-to-next-head' and
          `send-window-to-previous-head' functions for moving windows
          across heads. [fuchur]

        - Add `toggle-window-fixed-size' for toggling fixed-size on
          windows, also used in lock-button `Button3-Off'. [fuchur]

        - Add ability to move tabs around in the titlebar. [fuchur]

        - Add `run-application' by 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]

        - Add `sawfish.wm.prg.nm-applet', simple auto-starter for the
          `Network Manager Applet'. [Christopher Bratusek]

        - Add `sawfish.wm.prg.diodon', simple auto-starter for the
          `Diodon Clipboard Manager'. [Christopher Bratusek]

        - Add `sawfish.wm.prg.conky', simple auto-starter for the
          `Conky System Monitor', that allows for custom command line
          options to be passed. [Christopher Bratusek]

        - Add `sawfish.wm.prg.idesk', simple auto-starter for the
          `Idesk Desktop Icon Manager'. [Christopher Bratusek]

   * Miscellaneous Changes
        - Majorly improved start-up speed of StyleTab theme by locking
          the re-coloring of images until all configuration is loaded,
          so that re-coloring is only done once upon start. [fuchur]

        - In `sawfish.wm.prg.compton' delay compton start by 3 seconds
          to prevent heavy screen flickering. [fuchur]

        - Partially revert focus changes introduced in Sawfish 1.6.0
          [fuchur], auto-apply window-matchers for Plasma when KDE4 is
          detected running, for proper user experience. [Christopher
          Bratusek]

        - Improve `cabinet' window-switcher. Code-cleanup, bug fixes,
          blacklisting applications (mostly panels, pagers) and icon
          for missing window-icons. [fuchur]

        - Enable `shade-hover' and `auto-raise' in SawfishConfig,
          utilize them in tabbed-windowing. [fuchur]

        - Add `marked-cursor-shape' defcustom (used when marking
          windows for tabbing). [fuchur]

        - Improve icon size in StyleTab, add `Flat' style. Also improve
          speed and decrease memory usage by mirroring images [fuchur]

        - Use `menulibre' instead of `alacarte' in XFCE and MATE
          integration by default [fuchur]

        - Do not let `xfce-session' save the session (by adding `-f'
          flag in XFCE integration) [fuchur]

        - Add `Open Terminal' and `Open Browser' to the root menu (if
          `xterm-program' or `browser-program' are set) [Christopher
          Bratusek]

        - Rename `toggle-fixed-position' to
          `toggle-window-fixed-position' to match naming spec.
          [Christopher Bratusek]

        - Tweak default compton settings. [fuchur]

        - Improve doc strings in many modules [fuchur]

        - Add `html' target to man/Makefile, creating
          html-documentation [Christopher Bratusek]

        - Add `make-changelog' script by Marcus D. Hanwell (generates
          ChangeLog from git log) [Christopher Bratusek]

        - Updated german translation. [fuchur]

        - Updated RPM spec file. [Kim B. Heino]

        - Updated Debian packaging scripts. [Christopher Bratusek]

1.10 "Soundtropolis"
====================

   * Updated or New dependencies
        - PangoX: no longer required

   * Bug Fixes
        - Always rebuild the list of marked windows in tabs when
          closing a marked window. [fuchur]

        - In `sawfish-config' fix the `make-choice-item' to properly
          support settings for the `Crux' theme. [Vedat Hallac]

        - Only allow a window to be tabbed, if the parent window's
          framestyle has support for tabs.  (Note that in Sawfish
          different windows can have different framestyles) [fuchur]

        - `window-ops-menu' was still calling
          `resize-window-to-dimension' that didn't exist anymore since
          Sawfish 1.7. Use `resize-window-prompt' instead. [Christopher
          Bratusek]

        - Make "Sawfish Rootmenu" label an insensitive menu-item, so
          that clicking it while the root-menu pops up doesn't make the
          menu disappear immediately. [Christopher Bratusek]

        - In SawfishConfig you can select different cursor shapes for
          different buttons. Some of the definitions have been wrong
          and could crash Sawfish when choosing them. This is fixed
          now. [fuchur]

        - When a windows `max-width' or `max-height' would 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]

        - Fixed grabbing key-bindings in SawfishConfig. [Christopher
          Bratusek]

        - Fixed non-working `$height-content' and `$width-content' in
          the mxflat theme [Robert Zenz]

        - Fixed remembering all window properties after switching
          workspaces [fuchur]

   * New Features
        - Tiling. [Jose A. Ortega Ruiz] [Christopher Bratusek] here are
          still minor hickups, but both `tall-tile' and `col-tile' are
          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)

        - Added full compton integration (including autostarting
          compton with Sawfish).  Compton is a fork of xcompmgr with
          many bug fixes and many improvements compared to the original.

          Using `sawfish-config' it is also possible to change most
          compton options directly from within Sawfish. [fuchur]

        - Make `focus-when-mapped' window-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 losing keyboard input) [fuchur]

        - Completeley revised `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]

        - External Application modules. Those modules allow handling,
          setting-up and starting external applications during a
          sawfish session. See `doc/AUTOSTART' for additional notes on
          them.
             ++ `trayer' module. Handles a `trayer' (a system-tray)
               instance during a sawfish session.  [Christopher
               Bratusek]

             ++ `xmobar' module. Handles a `xmobar' (an on-screen, very
               flexible bar, monitoring whatever you like) instance
               during a sawfish session. [Christopher Bratusek]

             ++ `xmodmap' module. Allows reading `~/.Xmodmap' on
               startup of Sawfish. Useful only if using Sawfish
               standalone without a session-manager that already does
               this. [Christopher Bratusek]

             ++ `xsettingsd' module. 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]

             ++ `xgamma' module. Allows changing display's gamma
               settings on startup of Sawfish. [Christopher Bratusek]

             ++ `fehlstart' module. Handles a `fehlstart' (a simple,
               but yet flexible application launcher) instance during a
               sawfish session. [Christopher Bratusek]

             ++ `pancake' module. Handles a `pancake' (a simple desktop
               panel with pager, window-list, taskbar, tray) instance
               during a sawfish session [Christopher Bratusek]

        - Added `force-tab' window-matcher, forcing a window to be
          tabbed. [fuchur]

        - Added `window-type' window-matcher. This allows you to change
          the `_NET_WM_TYPE' of 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]

        - Added `tab-group-windows-hook', triggered when changing or
          creating a tabgroup, returning all windows contained in the
          current tabgroup. [fuchur]


   * Removed Features
        - Removed `sawfish.wm.ext.expose' in favour of much more
          advanced tiling-functions. [Christopher Bratusek]

   * Miscellaneous Changes
        - Updated `Elberg-tabbed' and `gradient-tabbed' for tab-system
          as of Sawfish 1.9.1 [fuchur]

        - Wallpaper setter now has an option for setting wallpaper on
          startup. Image widget is now more robust.  [Christopher
          Bratusek]

        - Improved default keymap for `titlebar' and `tabbar'. [fuchur]

        - Revived `decorate-transients', `menus-include-shortcuts' and
          `customize-show-symbols' defcustoms.  These options are now
          adjustable from `sawfish-config' again. [Christopher Bratusek]

        - Give the `root-window' the property `'WINDOW_MANAGER' on
          startup with value `sawfish'.  [Christopher Bratusek]

        - Updated `ru' and `pt_BR' translations via transifex.

1.9.1 "Voyager"
===============

   * Bug Fixes
        - `dimension' window-matcher does now properly restore the
          window's size [Robert Zenz]

        - When destroying a window marked for tabbing, before tabbing
          was done, tabbing didn't work anymore until Sawfish
          restarted. This is fixed now. [fuchur]

        - In `Makedefs.in' source `$(repexecdir)/rules.mk' as first, so
          that `--prefix' and co. from `configure' won't get
          overwritten. [Allin Cottrell]

        - In `tabs' some minor issues have been fixed, like correct
          `raise' or `sticky' tabs, and some issue with `move-resize'
          tabs. [fuchur]

        - Only allow '_NET_WM_WINDOW_TYPE_NORMAL to be marked as a
          tabbed window. [fuchur]

   * New Features
        - In tabbed-windowing it is now possible to add a whole
          tab-group to another tab-group, or a single window. By
          default the keybinding is `C-Button2-Off'. [fuchur]

        - Tabs now support `viewport-sticky' and `workspace-sticky'.
          [fuchur]

        - Tabs now support coloring the window-title in a different
          color, for windows, which are marked for tabbing. Currently
          only `StyleTab' uses this feature. [fuchur]

   * Miscellaneous Changes
        - In razor-qt integration module add `About Razor-Qt' help
          entry [Christopher Bratusek]

        - Replace `gdk_pixbuf_unref' by `g_object_unref' [Togan
          Muftuoglu]

        - Fix the address of FSF in all relevant files [Togan Muftuoglu]

        - Change cursor shape when working with tabs [fuchur]

        - Removed `sawfish.wm.util.marks', now implemented in
          `sawfish.wm.tabs.tab'. [fuchur]

        - Fix debian packaging scripts for Debian/Unstable, update
          install-sh to 2011-01-19.21, also remove NEWS and config.h.in
          upon `make gitclean'.[Christopher Bratusek]

1.9.0 "Next Dimensional World"
==============================

   * Updated or New dependencies
        - librep 0.92.0 -> 0.92.1

        - rep-gtk 0.90.4 -> 0.90.7

        - ssd 0.30 [optional, for built-in poweroff-menu]

   * Bug Fixes
        - When cursor-warping was enabled and user switched to a shaded
          window, the cursor warped to the position of the unshaded
          window. This is fixed now.  [Christopher Bratusek]

        - When switching between tabbed themes from SawfishConfig, it
          could happens that there were `gaps' in the frame. This is
          fixed now. [Christopher Bratusek]

        - In SawfishConfig one could only grab key-bindings, but not
          mouse- or mixed mouse-key-bindings. This is fixed now. (Move
          mouse 20 pixels to grab a `Move' event).  [Christopher
          Bratusek]

        - SawfishConfig became useless when Sawfish restarted. This is
          now worked-around by simply restarting SawfishConfig when
          Sawfish does. A new `before-restart-hook' has been added for
          this purpose. [Christopher Bratusek]

        - In EdgeActions `HotSpot', `HotMove' and `EdgeFlip', it was
          possible to trigger the same event multiple times at a time.
          This is fixed now.  [Jeremy Hankins]

        - Fixed a bug in apps-menu, failing to generate the menu, if a
          desktop-file contains both Categories and the (errorneous)
          Category key, or only the later. [Matthew Love]

        - Fixed a bug in window-manager selection handling. Set all
          fields of the client message event. This prevents bugs, where
          Sawfish sometimes isn't able to replace another
          window-manager or acquiring the screen if no other WM is
          running. [Timo Korvola]

        - When making X request, we might receive and `select' will
          stuck. This is fixed now [Michal Maruska]

        - Avoid calling Xmap for gone windows. [Michal Maruska]

        - Fixed a possible segmentation fault in `leave_notify' [Michal
          Maruska]

        - In SawfishConfig the `choice' widget didn't work when the
          choices were numerical values. This is fixed now.
          [Christopher Bratusek]

   * Sawfish-MMC [Michal Maruska]

     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.
        - Only apply property changes if window as `refresh' property.

        - In the pixmap-cache append pixmaps to the age list, rather
          than prepending.

        - Extend `pixmap-cache-control' to reset and return more
          informations.

        - `pixmap-cache-images' returns all images in cache.

        - When initializing Sawfish, try to initialize XKB, too.

        - Misc: Drop unused `prog_name' from `display.c'. Call
          `XAddToSaveSet' from a better position in the code. Mar
          `mapped_not_override_p' static. Simplified `property_notify'.

   * EdgeAction changes [Christopher Bratusek]
        - New EdgeActions:
             x `HotMove'. Calls an EdgeAction when dragging a window
               over the edge.

             x `Expose'. Simple expose (one-shot tiling) EdgeAction
               (can also be used stand-alone).  Original code by Mark
               Triggs.

             x `Expand'. Drag a window over the edge and it expand to
               the half-screen size.

             x `Show-Desktop'. Toggles between `show-desktop' and
               `hide-desktop'.

             x `Maximize'. Just for competitive reasons choosable from
               configurator.

        - `before-edge-action-hook' and `after-edge-action-hook'. While
          `enter-flipper-hook' and `leave-flipper-hook' simply 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-moving' value to the child-function (in that
          order).

        - Simplified, more robust EdgeFlip (flip-viewport and
          flip-workspace are now split).

        - Improved logic of blocking an action while another is already
          running. On one hand, see `Bug Fixes' above, on the other
          hand it's now ensured that we dont' activate an edge twice
          when dragging a window over it or when the pointer hits the
          edge via mouse-trapping.

        - New `move-window-to-corner' and `move-window-to-edge' helpers.

        - Updated EdgeAction documentation

   * SawfishConfig changes [Christopher Bratusek]
        - Updated and Improved widgets in SawfishConfig:
             x `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.

             x `font'. The font(-chooser) widget now uses
               GtkFontChooserButton in favour of the ancient
               GtkFontSelectionDialog. The GtkEntry used as helper
               became useless and is removed.

             x `choice', `symbol', `keymap', `frame-style'. Those
               widgets now use GtkComboBoxText in favour of ancient
               GtkCombo/GtkComboEntry.

             x `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.

             x `number'. The number-widget now has a `stepping'
               property, allowing to change the increment of a
               button-press on the spin-button.

        - New widgets in SawfishConfig:
             x `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.

             x `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.

        - Removed widgets in SawfishConfig:
             x `program'. Just an alias to `file'.

             x All `gtk-only' widgets. Since Sawfish 1.5.0 those have
               been dummies, we don't use `libgnome', `libgnomeui' or
               `libgnomecanvas' anymore anyway.

        - New buttons. SawfishConfig now offers buttons to access Wiki,
          Help, ResourceFile and About. Additionally there's now a
          file-chooser for installing themes from `*.tar.*' files.

        - Widgets that depend on an disabled setting are now hidden
          instead of greyed-out.

        - Merged sawfish.cfg.widgets into sawfish.gtk.widgets. Old
          widgets aren't loaded anymore, even if present from an old
          installation.

        - All defcustoms do now have a property to change the position
          of the label.  To change it, append on of the following to
          the doc-string: \\left \\right \\top \\bottom.

          Example:

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

   * Theme/Theming changes [Christopher Bratusek]
          === spoiler === : StyleTab in Sawfish 1.9 add lots of new
          fancyness for the price of being slow.  So if you experience
          a long startup-time of Sawfish, it's a feature, not a bug. :
          == /spoiler ===

        - StyleTab changes [fuchur]:
             x The theme is now fully re-colorable. You can choose
               different colors for each button and the frame.
               Furthermore you can choose how much to dimm inactive
               frames (compared to active).

             x Majorly improved the grouping of options in StyleTab.

             x Added corners to frames (allowing resize with mouse at
               window-corners).

             x Available styles: Default (former Dark), WixDa (former
               Silver), Reduce, Smoothly and Glass (New).

             x Added hash-tables for images.

        - New themes:
             x Candido

             x Zami-like

        - Improved themes:
             x Gradient has been replaced by Gradient-tabbed.

        - Removed themes [still available from Wiki]:
             x get-S-tabbed

             x brushed-metal

             x simple

             x smaker

             x mono

             x gtk

        - New theme-related configuration-options [theme independent]:
             x Added an option to control the titlebar text position.
               If a theme draws something additional in the titlebar
               (eg. StyleTab draws an icon), refer to the functions
               `update-title-x-offsets', `update-title-y-offsets'.

             x Added an option to control the cursor-shape when
               hovering frame-buttons.

             x Added an option to change the font, depending on the
               window state.

        - Moved definitons for `previous-workspace-button' and
          `next-workspace-button' from StyleTab into Sawfish.

   * New Features
        - Added `cabinet' application-switcher. `cabinet' is an
          advanced application switcher for Sawfish. For more
          information please visit:
          http://sawfish.wikia.com/wiki/Cabinet [Wang HongQin]

        - Added `tab-group' window-matcher. It allows window to be
          auto-tabbed together, if they got the same `tab-group'
          property [fuchur]

        - Added `single-window-mode'. Basically this feature is known
          from OS-X, though it's implemented in a more strict way. The
          `single-window-mode' window 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.

          Also `single-window-mode' hooks into unmap-notify-hook to
          check whether the user wants to stop `single-window-mode' (by
          either closing or iconifying the window). Besides each
          workspace can hold it's own `single-window-mode'.

        - Added `mouse-trap' feature. 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]

        - Added `shade-stack' feature. 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]

        - Integrated settings for selecting wallpaper using an external
          command (eg: hsetroot).  Applying settings to GNOME2 or XFCE4
          is also supported. Original code by Lucas Pandolfo.
          [Christopher Bratusek]

        - Added `toggle-desktop' function. Toggles between
          `show-desktop' and `hide-desktop' - always logically correct.
          [Christopher Bratusek]

   * Miscellaneous Changes
        - Improved desktop-integration modules [Christopher Bratusek]
             x KDE integration: added entries for user-switch,
               hibernate, suspend, lock-screen, menu-editor.

             x XFCE integration: added entries for hibernate, suspend,
               lock-screen, menu-editor.

             x GNOME integration: added entry for lock-screen,
               menu-editor.

             x MATE integration: full integration module for MATE
               Desktop has been added.

             x Razor-Qt integration: full integration module for
               Razor-Qt has been added.

             x LXDE integration: basic integration module for LXDE has
               been added.

        - The fallback poweroff-menu now uses SSD
          `Sawfish-Session-Dialog', a companion to Sawfish, by default.
          Support for logout and lockdown has been added. [Christopher
          Bratusek]

        - Added a `filemanager' launcher. If set the Sawfish root-menu
          will show an `Open Home' entry. The KDE, GNOME, MATE, XFCE
          and LXDE integration modules will set the program
          accordingly, unless it's already user-defined.

1.8.1 "Sharp As A Knife"
========================

   * Updated or New dependencies
        - librep 0.91.0 -> 0.92.0

   * Bug Fixes
        - Fixed jump-or-exec failing when a window without WM_CLASS
          exists [Christopher Bratusek]

        - Fixed failing to uninstall Sawfish [Christopher Bratusek]

   * Miscellaneous Changes
        - EdgeActions changes [Christopher Bratusek]:
             + Load from `user.jl', rather than `wm.jl'

             + Add `edge-actions-enabled' variable in order to be able
               to completely disable EdgeActions (also via .sawfishrc)

             + Move all options into new `sawfish.wm.edge.conf' module
               (so they appear in the correct order now)

             + Updated documentation for EdgeActions

        - Fixed documentation for function `insert-workspace'
          [Christopher Bratusek]

        - Removed unused or unneeded 'default, 'viewort and 'advanced
          classes from command definitions [Christopher Bratusek]

        - Fixed two strings in mxflat theme [Christopher Bratusek]

        - Improved Requires in sawfish.pc [Christopher Bratusek]

        - Improved debian packaging-scripts [Ian Zimmermann,
          Christopher Bratusek]

        - Improved .desktop-files [Kim B. Heino]

        - Updated translations:
             + Spanish [gnome-es team]

             + German [gnome-de team]

             + Czech [gnome-cz team]

             + Malay [gnome-ms team]

             + Slovenian [gnome-sl team]

        - Updated OPTIONS file [Christopher Bratusek]

1.8.0 "思いやり (Omoiyari)"
===============================

   * Incompatible changes
        - Infinite-desktop and edge-flip needs updates.

          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.

        - Renamed functions [Teika kazura]
             * Popup of operations-menu on a window, renamed from
               `popup-window-menu' to `popup-window-ops-menu' (both the
               function and command). Old names are still available.

             * Renamed window rename, from `rename-window-func' to
               `rename-window'. (Old name is still avialable.) The
               function `rename-window-interactive' is deleted. Use
               `(call-command 'rename-window)' instead.

          Even if the old names still remain, it is highly recommended
          to update.

        - Syntax-change in `jump-or-exec' [Christopher Bratusek]

          The previous `class' and `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
          class, set `#:match-class t' and pass the class name to the
          argument `regex'. (*note Application Invocation::)

        - Apps-menu options `apps-menu-show-all' is deleted. See below
          for more.

        - User option `focus-ignore-pointer-events' is deleted. [Teika
          kazura]
          In fact, it's for internal use, and should not have been a
          user option. Use your favorite focus mode instead.

        - Animation related modules are renamed [Teika kazura]

          All are collected under `sawfish/wm/animation'.
          `window-anim.jl' -> `setup.jl', `outline.jl' -> `main.jl',
          `util/window-outline.jl' -> `modes.jl'.


   * Build and Installation
        - Fixed installation for non-root users [Stefano Sabatini]

          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.

        - Session files installation [Christopher Bratusek]

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

        - Spec-File compatibility for RHEL 6 beta [Kim B. Heino]

        - Debian-Scripts (mostly) updated to the new specification
          [Christopher Bratusek]

   * Bug fixes
        - Poweroff-menu fix [Teika Kazura, Christopher Bratusek]

          In Sawfish-1.7.0, poweroff related items in the popup menu
          couldn't be invoked, if run without any desktop environment.
          Fixed it.

        - Correctly build SawfishPager [Christopher Bratusek]

          It is ensured that SawfishPager builds correctly, by
          improving `sawfish.pc' file.

        - At focus in/out, correctly reports the mode [Timo Korvola]

          When `focus-in-hook' / `focus-out-hook' are called, Sawfish
          wrongly reported a focus change during a grab as "ungrabbed".
          Now it's reported as `while-grabbed'.

        - Window cycle among groups [Teika Kazura]

          Some windows were skipped in window cycles among groups. This
          is fixed.

        - No more crash at loading wrong theme code [Teika Kazura]

          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.

        - Cancellation of `call-command' [Teika kazura]

          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.

        - KDE *.desktop files location [Teika Kazura]

          Previously, user's change of the variable
          `kde-desktop-directories' was ignored, but this is fixed.

   * New Features
        - Edge Actions [Christopher Bratusek]

          "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:
             * Viewport-drag and edge-flip (of course hot-spot, too)
               can be chosen per direction, top-bottom and left-right.
               It's also possible to enable / disable dragging of a
               window for each of them.

             * It means a window can be dragged during viewport-drag,
               which was not possible.

             * There're two delay timers now, for edge-flip and
               hot-spot.

          Internal changes:
             * Codes are found in `sawfish.wm.edge.*'. You don't have
               to import them for ordinary use.

             * Low-level functions now have API in
               `sawfish.wm.edge.util' written in Lisp.

        - Replace running window manager with Sawfish [Timo Korvola]
          New command line option `--replace' is 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 wrapper added to Jump-Or-Exec [Christopher
          Bratusek]

          `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 hidden.

          See the file `jump-or-exec.jl' for more detailed examples.

        - `iconify-on-leave' window-matcher [Christopher Bratusek]

          This new window-matcher is a companion to `toggle-or-exec'.
          When a window matched loses the focus, it gets hidden. Use
          this together with `toggle-or-exec' for greater toggle-window
          experience.

        - Error printing during initialization [Teika Kazura]

          When an error occurs during initialization, and if you don't
          customize the option `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.

        - New function `report-commands' [Teika kazura]
          It returns the list of all commands. (*note Operations on
          Commands::).

   * Misc Changes
        - Tabs and themes [fuchur]

          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 default theme.

          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.

        - Application menu is fully customizable [Matthew Love]

          With the new option `apps-menu-filter', you can fully
          customize the application menu. For the full description, see
          *Note Applications Menu::.

          It replaces former options like `apps-menu-show-all' or
          `apps-menu-ignore-no-display'.

        - Per-window animation mode [Teika kazura]

          From the configurator "Window Rules" you can set the animation
          mode when iconified. (*note Animating Windows::)

        - Behavior modification at focus-in [Harald van Dijk]

          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.

        - Revised `get-window-by-*' functions [Christopher Bratusek]

          For the details, see *Note Window Attributes::, and *Note
          Getting Windows::.
             * Added functions `window-role' and `get-window-by-role'
               (return NET_WM_ROLE)

             * Deleted `get-window-by-name-re' and
               `get-window-by-class-re'. Use instead
               `get-window-by-name' or `get-window-by-class' with the
               new boolean option `#:regex'. (The old name is still
               supported.)

             * added `#:icon' switch to `get-window-by-name' to get a
               window via NET_WM_ICON_NAME (can be used with #:regex
               switch, too)

             * Commands to resize a window [Christopher Bratusek, Teika
               kazura]

               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.

        - Window-operation menu improvements [Christopher Bratusek]

             + The window-operation menu now honours window rules
               better.  For example, if you have a window with
               `fixed-size' flag, the window-operations menu-entry
               `Resize' becomes unclickable.

             + The entries for moving and copying windows to another
               workspace are now bundled in the new `Workspace'
               sub-menu.

        - Translation related changes [Teika Kazura]
             + Added translator instructions in `po/README' file.

             + Before you run `po/make-pot' to generate `sawfish.pot',
               you now have to do `make all' at the top directory.
               Previously it was possible to produce wrong
               `sawfish.pot'.

             + Translation updates: Spanish [gnome-es team], German
               [gnome-de team], Simplified-Chinese [gnome-zh_CN team,
               Wang Lei], Norwegian/bokmål [gnome-no team] French
               [gnome-fr team], Czech [gnome-cs team] and Slovenian
               [gnome-sl team].

             + Updated `sawfish.pot' and subsequently all `*.po'.
               Banished some bogus items in `sawfish.pot'.
               (Developer's personal extensions had sneaked in.)

        - Emacs sawfish-mode now indents `let-fluids' and let-loop
          correctly, provided by `sawfish.el' [Teika Kazura]

        - Turn `focus-ignore-pointer-events' into an internal variable
          (has wrongly been a user-option before) [Teika Kazura]

        - Documentations [Teika kazura]
             * Section on popup menus is rewritten. (*note Popup
               Menus::)

             * Functions which return window geometry are now clarified
               in the point of frames.

             * Correction: The function `commandp' can only take
               symbols as its argument. (*note Operations on Commands::)

        - SawfishConfig "Window rules" section changes [Teika Kazura]

          Category `Placement' is renamed to `Geometry'.  The item
          `shade-hover' is moved to `appearance' category, and
          `fixed-size' to `geometry'.

        - Deletion of outdated features in command definition [Teika
          Kazura]

          Function `define-command-args' is deleted. In `define-command'
          function, the keyword argument `doc-key' is dropped.

1.7.0 "Frozen Flame"
====================

   * Update dependencies
        - librep 0.90.5 -> 0.91.0

        - rep-gtk 0.90.2 -> 0.90.4

   * Notes
        - When you report a crash, please add the backtrace, by
          invoking Sawfish with the command line option "--interp".

          Read the file `CONTRIBUTING' for more infos.

        - Prompt API change [Jeremy Hankins]

          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 code. See `sawfish.wm.util.prompt' for details.

        - Mouse-button support state

          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.

        - Functions `maybe-raise-window' and `maybe-lower-window' are
          now obsolete. [Teika Kazura]

          Replace them with `raise-window*' and `lower-window*' defined
          in `sawfish.wm.util.stacking'. Only difference is that the
          obsolete version supports a feature of Nautilus (GNOME file
          manager) which was dropped long ago.

   * Build and Installation
        - Configure-option `--with-nine-mousebuttons' is dropped.
          See the item "Keyboard layout switching support" below.

   * Bug Fixes
        - Maximized windows wrongly covering other windows on startup
          [Jeremy Hankins]

          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.

        - Viewport initialization bugfix [Jeremy Hankins]

          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.

        - Keyboard-layout switching support [Teika Kazura]

          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
          commandline-option `--5-buttons'. It is assumed that modifiers
          are common among keyboard groups.

          More precisely, what's supported is switching by
          `ISO_Next_Group' 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.

        - Atom handling fix on 32-bit architecture (Java fix). [Teika
          Kazura]

          Function `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.)

        - Applications menu bugfix [Matthew Love]

          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.

        - Edge-flip and infinite-desktop now work after
          screen-resolution change. [Christopher Bratusek]

        - Sawfish now starts up correctly when receiving a session-id or
          session-prefix from GNOME-Session [Clinton Ebadi, Christopher
          Bratusek]

        - Draft animator bugfix. [Christopher Bratusek]

          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
          `x-draw-text' function described below.

        - Resurrection of two variables [Teika Kazura]

          User options `workspace-boundary-mode' and
          `workspace-send-boundary-mode' couldn't be set from the
          configurator, but this is fixed.

        - Command `xterm' fix [Teika kazura]
          It couldn't be invoked as a key binging if the optional
          "command" argument was unset by the configurator, i.e. an
          empty string.

   * New Features
        - Desktop-environment integration [Christopher Bratusek]

          Support for XFCE integration was added. It's just like
          GNOME/KDE4 integration: it sets `xterm-program' and
          `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 (*note External Applications::).

        - Applications menu improvements [Matthew Love]

          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 `apps-menu-filter'.]

          If `apps-menu-show-all' is `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 described below.

          Technically, fields `NotShowIn' and `OnlyShowIn' in files
          `/usr/share/applications/*.desktop' tell under which desktop
          environment that application wants to be shown. If
          `apps-menu-show-all' is `nil' or `maybe', they are respected.

          Items with field `Hidden' or `NoDisplay' are usually not to
          be shown. They are respected if `apps-menu-show-all' is `nil'.

          The KDE specific directory is now searched, too while menu
          generation.

        - New window rules [Christopher Bratusek]

             * `fixed-size': this disables resizing, or more precisely,
               functions `resize-window-interactively',
               `halve-window-size' and `double-window-size'.
               (Maximization is still possible.  Use `never-maximize'
               to prevent maximization.)

             * `never-delete': this disables closing. Only interactive
               closing is prevented, and you can delete windows with
               `never-delete' property from a lisp program.

        - Update of emacs major mode `sawfish.el' [Teika kazura]

          It is now distributed with Sawfish window manager.
          Improvements are:

             * Evaluation used to choke when it encountered `#f' or
               `#t'. This is fixed.

             * Highlighting of the keywords like `define' works again.

             * `describe-function' have been broken, but it works again.

             * In `describe-variable', the value of the variable is
               pretty-printed.

             * `sawfish-load-symbols' can be called interactively to
               update the cached symbols.

             * Better introductory part.

        - New frame-parts `border-width' and `border-color' [Alexey I.
          Froloff]

          A "border" of a window surrounds the window and all other
          frame parts. (*note Frame Part Definition::)

        - New commandline-option `--5-buttons'
          See the item "Keyboard-layout switching support" above.

        - `x-draw-text' function [Christopher Bratusek]

          It is similar to `x-draw-string'. Generally, if you use a
          `display-message' like message, call `x-draw-string'.  If you
          want to draw on the screen directly use `x-draw-text' (*note
          X Drawing::.)

   * Translation updates

     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]

   * Miscellaneous Changes
        - More error and backtrace printing [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.)

        - Pointer warping in window cycling [Teika Kazura]

          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.

        - Configurator changes (user visible parts) [Christopher
          Bratusek]

          Icon is now provided. (If it doesn't show up, first run
          `gtk-update-icon-cache'.)

          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
          `--single-level' which has been broken.

        - Doc improvements

          FAQ items, on how to hide the mouse-pointer, and on
          application execution.
          Manuals (1) describe all options. KEYBINDINGS file was revised

          Newly described functions are: `grab-keymap' and
          `ungrab-keymap' (*note Keymaps::), `x-raise-window' and
          `x-lower-window' (*note Raising and Lowering Windows::),
          `frame-state-mutex' (*note Frame Functions::).

        - Root-Menu improvements [Christopher Bratusek]

          All menu-entries do now have accelerators. Labels for help
          entries have been improved.

        - Configurator internals [Christopher Bratusek]

          The module `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 `simple-dialog.jl'

          Previously the functions `remove-newlines' and
          `beautify-symbol-name' were defined in several modules, with
          the same contents. Now they are defined (only once) in a new
          module `sawfish.cfg.utils'.

          The `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 `gtk-about-dialog'.

          `/usr/bin/sawfish-config' is now minimal, moving most of it's
          content to `sawfish.cfg.shell' [Teika Kazura]

        - Module `3d-hack' is deleted. [Christopher Bratusek]

          The `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 page "3d-hack".


1.6.3 "Hava Nagila"
===================

   * Bugfixes
        - In tabbed-windows the left/right end is no longer outside the
          window, if that is too small [Fuchur]

        - Unsupported option `ignore-window-input-hint' is deleted
          which has been invalid for long. [Teika kazura]

        - Honor the user option `maximize-raises' in
          `maximize-window-fullscreen' and
          `maximize-window-fullxinerama', too, not just in
          maximize-window [Nolan Leake]

        - More robustness in applications menu [Teika Kazura, Matthew
          Love]

          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.

        - Allow compilation with -DDEBUG flag passed [Alexey I. Froloff]

   * New Features
        - XRandR events (eg resolution changes) call the new hook
          `randr-changed-notify-hook' [Daniel M. German]
          See *Note RandR and Xinerama::.

        - Tabbed windowing system improvements [Fuchur]
             + Support for transient tab-frames

             + New frame classes:
                  x tab-s (side tab)

                  x tab-ls (side tab, left/bottom end)

                  x tab-rs (side tab, right/top end)

             + Tabgroups now support a set of new properties and
               actions: `type', `set-frame-style', `fixed-position',
               `iconify'. In addition, new tabs gain those properties
               from their parent window.

        - New command `display-window-position' [Teika kazura]

          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 `sawfish.wm.util.display-wininfo'.

        - New function `window-pid' [Teika kazura]

          It returns the process ID of a window. (*note Window
          Attributes::

        - Window instance name is now accessible [Teika kazura]

          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. (*note Window Attributes::)

        - Customizable lisp directory [Teika kazura]

          User can add lisp directories to be read with the
          environmental variable `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 `sawfish.wm.super-hack', then
          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.

   * Other Changes
        - Info improvements [Teika kazura]
             + "Windows" chapter is partly revised. Function
               `display-window' is documented. Difference between
               `window-wants-input-p' and `window-really-wants-input-p'
               is described. Short description on the root window.

             + In past few versions we made more changes which were not
               described in the news, including clarification in
               viewport, workspace and event, and window matching lisp
               functions.

             + Added a faq item on multi-head and workspace.

             + Edition number and the date of last change are dropped
               from the info.  We now edit the info often, so they are
               not so much meaningful.

        - Pressing the lock-button does the state-change of the window
          accordingly. [Fuchur]
          No theme shipped with Sawfish does have the lock-button yet,
          though.

        - Make xinerama an optional dependency [original patch from
          Gentoo]

1.6.2 "Mighty Disco King"
=========================

   * The 1.6.2 release has some improvements.

   * Bugfixes
        - Application menu is more robust now.  [Matthew Love,
          Christopher Bratusek]

          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.

        - Minor fix of window placement by direction [Teika kazura]

          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.

   * New features
        - New command `maximize-discard' [Teika kazura]

          The command `maximize-discard' stops a maximized window to be
          treated as maximized any more, so that you can move and
          resize the window.

          The functinon `maximize-discard' has existed, and now it's
          exported.

        - New command `jump-or-exec' [Christopher Bratusek]

          The user uploaded module "jump-or-exec" has been merged. It
          provides `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.

   * Misc
        - Improved ebuild and specfile [Christopher Bratusek] [Kim B.
          Heino]

        - Updated documentation [Christopher Bratusek] [Teika Kazura]

        - Removed `frame-style-editable-p' and all other remaining
          sawfish-themer fragments, as it's dead. [Christopher Bratusek]

1.6.1 "Astral"
==============

   * The 1.6.1 release brings several bugfixes and improvements

   * Build and Installation
        - New/Updated requirements:
             + librep 0.90.4 -> 0.90.5

             + rep-gtk 0.90.0 -> 0.90.2

        - The configure option `--without-nine-mouse-buttons' is not
          allowed to have 4 hyphens, therefore it's renamed to
          `--without-nine-mousebuttons'.  [Christopher Bratusek]

        - Reworked configures help-message for better readability.
          [Kim B. Heino]

        - Configure now uses `kde4-config --install data' rather 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]

        - Majorly improved debian and rpm packaging scripts.
          [Christopher Bratusek] [Kim B. Heino]

        - The spec has been reworked to detect kde4/librep directories
          while runtime, instead of hardcoding those paths from
          configure, which makes it more portable.  [Kim B. Heino]

        - Our own implementation of dlmalloc is disabled since 2002, as
          it breaks sawfish on several architectures. From this version
          on, we don't ship it anymore.  [Kim B. Heino]

        - Export the imageloader being used by sawfish in the .pc file.
          [Christopher Bratusek]

        - Don't remove the .pot file upon `make distclean'.
          [Christopher Bratusek]

        - Install Sawfishs header files to $includedir/sawfish/.
          [Christopher Bratusek]

        - Autotools improvements (Makefile, autogen.sh & Co.)
          [Christopher Bratusek]

   * Bugfixes
        - Fixed a bug where the gnome-panels pager gets confused about
          the current viewport when displaying all workspaces.  [Jeremy
          Hankins]

        - Fixed minor bugs in viewport.jl.  [Jeremy Hankins]

   * Doc
        - Fixed a small doc misstake (referred to window-set instead of
          window-put).  [Christopher Bratusek]

        - Fixed the docstrings of shrink and yank.  [Timo Korvola]

   * Misc
        - Last 3 instances of "sawmill" replaced by "sawfish".  [Kim B.
          Heino]

1.6.0 "Sound Of Thunder"
========================

   * The 1.6.0 release has new features and bugfixes

   * Build and installation changes
        - New/Updated requirements:
             + librep 0.90.0 -> 0.90.4

             + rep-gtk 0.18.4 -> 0.90.0

        - Removed requirements: LibAudioFile and ESounD

        - Mouse buttons 6 - 9 support is now optional

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

          `--without-nine-mousebuttons'

          If you drop it, then you can't use mouse button 8 to, for
          example, drag windows.

        - Installation directory change

          Directory `libexec' is not used anymore for library files
          installation. Instead, they go into `lib' by default.

   * Incompatible user visible changes:
        - Configurator's binary, `sawfish-ui', is renamed to
          `sawfish-config' [Christopher Bratusek]

          Its window class is changed to `sawfish-configurator' /
          `Sawfish-Configurator', too. The lisp module is renamed from
          `sawfish.ui' to `sawfish.cfg'.

        - Infinite Desktop boundary behavior and option

          In `infinite-desktop', the option to specify the boundary
          behavior has changed. If `viewport-boundary-mode' is
          `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,
          `infinite-desktop.stop-at-workspace-borders', which is used
          for this purpose, no longer exists.

        - User config file changes

          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 `~/.sawmillrc' to `~/.sawfishrc', if the former does
          exist on your system, but the latter doesn't.

        - In configurator, the "Matched Windows" group has been renamed
          to "Window Rules"

        - Sound support has changed. [Christopher Bratusek]

          Sawfish used to rely on ESounD and LibAudioFile to play
          sound, but we dropped that. If you want sound, set the
          variable `play-sample-program' to the path of the program
          capable of playing *.wav file. You can set the variable from
          the Configurator, too. By default `paplay' is being 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. (*note FAQ::, "Sound support" section.)

        - GNOME integration updates [Christopher Bratusek]

          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 `quit'
          and `restart' from menu now. GNOME help is available in menu.

          Unless set by user, gnome-terminal.wrapper and
          gnome-www-browser are used for user options `xterm-program'
          and `browser-program'.

          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]

        - xterm and browser changes

          Module `sawfish.wm.commands.xterm' is renamed to
          `sawfish.wm.commands.launcher'. Option `xterm-args' is
          dropped. If you use it, simply append its value to
          `xterm-program'.

          Customization-group is changed from `misc' to `External
          Applications'.

          The functinon `display-url' is renamed to `browser', now
          defined in the module cited above. Variable
          `display-url-command' is renamed to `browser-program'.

        - Sawfish pager

          If you've been using Sawfish-pager, then you have to
          recompile it, due to library files location change.

        - Deletion of `user-level' property

          (This affects almost none.) There has been a defcustom
          property `user-level'. It has been deprecated for years, and
          it's now deleted.

   * Bugs fixed:
        - Prevents crashes for quick window destructions, especially
          under high load

          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
          collection with `rep_PUSHGC' / `rep_POPGC'. It also prevents
          `add_window_hook' from being called with uninitialised
          argument.  [Timo Korvola, Janek Kozicki]

        - Random window disapperance prevention

          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]

        - Build and Installation:
             + Library check: Fix in `SMlib' and `libICE' check on
               x11r7 [Christopher Bratusek]

             + `.desktop' files fixes: typos fixed and unneeded entries
               removal [Christopher Bratusek]

             + In spec file, repexecdir definition is fixed
               [Christopher Bratusek]

             + In `po/Makefile.in', a wrong call of make-pot is fixed
               [Christopher Bratusek]

             + Always build the FAQ upon make [Christopher Bratusek]

             + Expand REP_ENVIRON in scripts/Makefile.in [Luis Rodrigo
               Gallardo Cruz]

             + Add `--tag=CC' to libtool where necessary. It unbrakes
               compilation on some arches [Gentoo Linux]

             + Use $prefix/lib instead of $prefix/libexecdir, to
               satisfy the FHS [Christopher Bratusek]

        - In configurator,

          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]

        - Fixed Focus issues with KDE4 Menu/Run-Dialog [Timo Korvola]

        - Fix cursor-warping in conjunction with Infinite-Desktop
          [Jeremy Hankins]

        - Fixed group of the stagger options [Christopher Bratusek]

        - Fixed a call of `select-workspace-from-first' [Michal
          Maruška]

        - In `Simple' theme, windows are now resizable from the right
          border [Christopher Bratusek]

        - Missing exports are now supplied, for shrink-yank functions
          and `send-to-workspace'. [Christopher Bratusek]

        - Commands `maximize-window-fullscreen' and
          `maximize-window-fullxinerame' work. [Teika kazura]

        - Variable `this-command' is `nil' outside of command call.

        - Customization option `uniconify-to-current-viewport' has been
          undeprecated. [Teika kazura]

   * New features:
        - New application menu [Matthew Love, Timo Korvola]

          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]

        - Added options to change the font color of window title,
          independent of the theme in use [Matthew Love, Christopher
          Bratusek, Timo Korvola]

          Internally, a new function `remove-frame-part-value' which
          allows to change/remove values from frame-parts is used.
          [Timo Korvola]

        - Sawfish does now support theme-tarballs compressed with XZ
          (aka LZMA2) and LZMA [Christopher Bratusek]

        - Xinerama support for Grow/Pack [Nolan Leake]

          Make grow/pack Xinerama aware. The support still remains
          basic, as shrink/yank still lacks it.

        - Window rules can be set by lisp

          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, *Note 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.

        - Keymap translation [Scott Scriven]

          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.

        - New window rules
             + Maximizations `fullscreen' and `full-xinerama' are
               available now (*note Maximizing Without Borders::)
               [Jeremy Hankins]

             + Window position can also be specified by the direction,
               like north or east, instead of the coordinates. [Jeremy
               Hankins]

             + New window rules `new-workspace' and `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]

               If `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. `new-viewport' is 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-name' can change the window's name. [Christopher
               Bratusek]

        - New commands [Christopher Bratusek]

          5 new move-cursor commands, 4 diagonals and 1 to center.
          (*note Pointer Functions::

          Three window manipulation commands, `double-window-size',
          `halve-window-size', and `move-window-center'.  The former
          two are based on the `resize-by-factor' metafunction.

          `browser' invokes a browser instance.

        - New functions `rename-window' changes 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' and `get-window-by-class-re'
          [Christopher Bratusek]

        - Dynamic Viewport-Boundary-Mode [Jeremy Hankins]

          When you set `viewport-boundary-mode' to `dynamic', then the
          workspace grows and shrinks dynamically so that it contains
          all windows and the current viewport. For the details, *Note
          Dynamic Viewport::.

        - KDE4 integration module [Christopher Bratusek]

          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 `xterm-program' and `browser-program'.

        - Poweroff from menu

          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
          *Note 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.

        - New Frame Classes [Christopher Bratusek]
          A "frame class" defines frame component and are used by
          themers to add buttons or frames to their theme in charge.
          There are no user visible changes.

             + `sticky-button', a button to toggle window `sticky' or
               `viewport-sticky'

             + `lock-button', a button to toggle window position `fixed'

             + `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

   * Widget Transition [Christopher Bratusek]
        - Custom make-url-widget replaced by GtkLinkButton

        - Custom about-dialog replaced by GtkAboutDialog

        - GtkButton + GtkPreview + GtkColorSelection trio replaced by
          single GtkColorButton

   * Other Changes:
        - Startup window placement improvement [Jeremy Hankins]

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

        - Renamed `after-add-window' to `maxmize-after-add-window'
          This function is only used in a hook [Teika Kazura]

        - Don't let `cycle-class' and `cycle-class-backwards' ignore
          WINDOW-ORDER [Daniel M. German]

        - Docks/panels are unframed, and window type is set to `dock'
          by default [Timo Korvola]

        - You can exit from sawfish-client with `,quit' (also `C-d'),
          unlike `C-c' it won't kill the WM [Teika Kazura, Timo Korvola]

        - Number widget (GtkSpinButton) can take optional initial value
          [Teika Kazura]

        - Changing `raise-tabs-on-hover' takes effect immediately now
          [Christopher Bratusek]

        - Inactive windows in Crux theme do now have black text for
          better readability [Christopher Bratusek]

        - With new option `customize-redirect', configurator's output
          can be redirected. [Teika Kazura]

        - Grow/Pack and Shrink/Yank options are in the same group now
          [Christopher Bratusek]

          These commands are now available from window operation menu,
          too.

        - When moving a window the cursor shape is now `hand2', when
          resizing `crosshair' [Christopher Bratusek]

        - In the theme document in the configurator, the cursor is
          invisible and the wrap mode is set to word-char [Christopher
          Bratusek]

        - Build, installation and source
             + Improved ebuild [Christopher Bratusek]

             + Encoding is unified to utf-8 for all distributed files
               [Teika Kazura]

             + Squashed all bytecompiler warnings [Matthew Love]
               Some warnings were superfluous, though.

             + To info file `dir' the section `sawfish' has been added
               [Luis Rodrigo Gallardo Cruz]

             + Distclean rule for po/Makefile.in [Christopher Bratusek]

             + Removed ancient sawmill removal fragments from Makefile
               [Christopher Bratusek]

             + Block comments in lisp files are now semicolons
               Sorry, without reason. Block comment remains allowed.

        - Docs
             + Added man-pages for `sawfish', `sawfish-client' and
               `sawfish-config' [Debian]

             + News items for 1.5.0 are rewritten in a more readable
               fashion [Teika Kazura]

             + Info manual updates [Christopher Bratusek, Jeremy
               Hankins, Teika Kazura]

             + Added new contributors to `THANKS' section of
               `CONTRIBUTING' [Christopher Bratusek]

             + Updated OPTIONS and KEYBINDINGS [Christopher Bratusek]

             + Fixed the license header of tabbed-windowing files
               [Christopher Bratusek]


1.5.0 "The Hardstyle Factory"
=============================

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.

   * The 1.5.0 release has new features and bugfixes

   * New/Updated requirements:
        - librep 0.17 -> 0.90.0

        - rep-gtk 0.18.3 -> 0.18.4

   * User visible changes:
        - Fully renamed from "sawmill" to "sawfish"

          If your `.sawfishrc' has a line `(require 'sawmill-defaults)',
          then change it to `(require 'sawfish-defaults)'.

          If your configuration file is named `~/.sawmillrc', then
          rename it to `~/.sawfish/rc' or `~/.sawfishrc'.

        - Configurator GUI's default style is tree view of categories.

          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.

   * Bugs fixed:
        - Fixed an compilation-error caused by glib [Michal Jaegermann]

        - Make building with imlib1 instead of gdk-pixbuf work again
          [Michal Jaegermann]

        - Create src/build.h, since it has been missing before
          [Christopher Bratusek]

        - Fixed an "unknown remote error" that might appear [Alexey I.
          Froloff]

        - Make "make uninstall" work again [Christopher Bratusek]

        - Fixed the issue that apps did not start iconified, even if
          requested [Ian Zimmerman, Teika Kazura]

        - First create $datadir/applications, then install the desktop
          file [Christopher Bratusek]

        - Fixed default animation outline coordinates [Christopher
          Bratusek]

        - Don't ignore datarootdir setting [Christopher Bratusek]

        - Make Sawfish more error-tolerant if an app has an icomplete
          WM_CLASS [Martin Mares]

        - Make sure we don't mix Super and Hyper [Denis Barbier]

        - Fixup the last incomplete AC_DEFINE [Christopher Bratusek]

        - Fixed a speed-issue with "microGUI" theme [Christopher
          Bratusek]

        - Make properly use of WM_NAME in "Elberg-tabbed" theme
          [Christopher Bratusek]

        - UTF-8 Support in window menus [Wang Diancheng]

        - UTF-8 Support in GTK Widgets [Christopher Bratusek]

   * New features:
        - Tabbed Windowing Support [Yann Hodique, Scott Scriven, Nathan
          Froyd, Christopher Bratusek], Raise Tabs on hover
          [Christopher Bratusek]

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

        - Focus enhancements [Timo Korvola]

          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 `focus-revert'
          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, *note Input Focus::.) This makes
          the modes' policy clear, and programmable.

        - cursor warp enhancements. [Christopher Bratusek]

          During window cycling, cursor is warped to the current top
          window if `warp-to-window-enabled' and `cycle-raise-windows'
          are non-nil.

          When the window gets unmaximized, the cursor is retained in
          that window when `warp-to-window-enabled' is non-nil.

        - 3 New Window-Animators for moving and resizing: cross,
          elliptical and draft [Christopher Bratusek, Teika Kazura
          (draft fixups)]

        - Shrinking/Yanking Support [Timo Korvola]

          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 to keys.

        - "Infinite Desktop" Feature [David T. McWherter]

          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.

        - In configurator GUI, viewport commands and history appear.
          Under matched-window, fixed-position, never-iconify,
          never-maximize are available. [Christopher Bratusek]

        - Added cycle-among-groups(,-backwards) commands (cycle among
          the most recently used window of groups) [Fernando Carmano
          Varo]

        - Interactive placement-mode now also for transients
          [Christopher Bratusek]

        - Improved prompt.jl (allows changing font, fg and bg color)
          [Sergey I. Sharybin]


   * Other changes:
        - To build with XFree86/X.Org < 7.0 add -without-xorg-x11r7
          flag [Christopher Bratusek]

        - To build without Pango add -without-pango flag [Christopher
          Bratusek]

        - To prevent installing translations add -without-nls flag
          [Christopher Bratusek]

        - Set RestartStyleHint to 2 [Christian Marillat]

        - When matching window to alist try WM_NAME if WM_CLASS is
          unset [Christian Marillat]

        - Major Documentation update [Derek Upham, Teika Kazura]

        - New Sound Theme [glh Pimenta]

        - Added ebuild [Harald van Dijk]

        - Added session desktop file [Christopher Bratusek]

        - rep.m4 has been dropped use librep.pc/rep-gtk.pc instead
          [Christopher Bratusek]

        - Added sawfish.pc [Christopher Bratusek]

        - Improved Makefile's distclean rule [Christopher Bratusek]

        - Updated .desktop files for gnome-session >=2.23 [Christopher
          Bratusek]

        - Fixed autogen for libtool >2.2 [Christopher Bratusek]

        - Major configure script rework [Christopher Bratusek]

        - Don't ship config.sub config.guess and install-sh in
          $srcdir/etc [Christopher Bratusek]

        - Reworked Sawfish-UI [Christopher Bratusek]

        - Dropped libgnome|gnomeui|gnomecanvas widgets, use pure gtk
          instead [Christopher Bratusek]

        - Merged changes from sawfish-pager [Christopher Bratusek]

        - Major update of the spec file [Christopher Bratusek, Michal
          Jaegermann, Ritz]

        - Print useful stuff at the end of configure [Christopher
          Bratusek]

        - Add distclean rule to all Makefiles [Christopher Bratusek]

        - Add KEYBINDINGS file, containing a list of all default
          keybindings [Christopher Bratusek]

        - Updated OPTIONS for all new options [Christopher Bratusek]

        - Cleaned Up Makedefs.in [Christopher Bratusek]

        - Move 'avoid' window-matcher from placement to state [Teika
          Kazura]

        - Updated compat.jl [Teika Kazura]

        - Removed all old ChangeLog files [Christohper Bratusek]

        - Make move-cursor.jl export all functions described in the doc
          [Christopher Bratusek]

1.3.5
=====

   * The 1.3.5 version has new features and bugfixes

   * New/Updated requirements:
        - librep 0.14 -> 0.17

        - rep-gtk 0.18 -> 0.18.3

   * New features:
        - Support _NET_WM_USER_TIME by Hellmut Eller

        - Added ATK-A11Y Support by Shobbit Marthur

        - Added Viewport-Boundary by Christopher Bratusek

        - Added Error-Handler "both" by Christopher Bratusek

        - Added 2 new Buttonlayouts to Crux "complete" and "complete
          inverse" by Christopher Bratusek

        - Honour ICCCM Aspect Ratio by Andrea Vettorello

        - Expose all Keybindings in SawfishUI by Christopher Bratusek

        - Added Animated Viewport Scrolling by Fernando Carmona Varo

        - Also expose the "Stagger" and "Off-Center" placement-modes

        - Add a new hook: "before-slide-hook" by Andrea Vettorello

        - Expose all smart placement-modes, "Best-Fit",
          "Best-Fit-Group", "First-Fit-Or-Interactively" by Christopher
          Bratusek

        - Better GNOME Integration by Christian Marillat

   * Bugfixes:
        - Minimum pango version is 1.8.0 not 1.16.0 by Christopher
          Bratusek

        - Fix Installation of mxflat by Michal Jaegermann

   * Other Changes:
        - Remove all ^L in the source by Teika Kazura

        - Small Code-cleanup to make build with "-Wall -ansi -pedantic"
          possible again (also requires recent librep for this to work)

        - Major Documentation Update by Derek Upham

        - updated the shipped config.sub and config.guess by
          Christopher Bratusek

1.3.4
=====

   * The 1.3.4 version has new features and bugfixes

   * New features:
        - "Enter-Click focus mode" by Dagfinn I. Mannsake, Christopher
          Bratusek and Timo Korvola: windows get focus only when mouse
          enters it or if it is clicked and was unfocused.

        - "Parallel make" by Harald van Dijk: allows building using
          more processors.

        - Improved window property handling by Teika Kazura.

        - Added new themes: mxflat, get-S-tabbed and elberg-tabbed.

        - Added new binding to maximize window fullscreen on all
          xinerama screens, by Jonathan Sambrook.


   * Bug fixes:
        - Fixed raise-lower window bug when using transparent windows
          with xcomposite extension, by Timo Korvola.

        - "Refresh icons" by Timo Korvola: when window changes its
          icon, the frame gets updated.

        - Major C part cleanup, removing compilation warnings, by
          Christopher Bratusek.

        - "Keep Focus on move-window-'direction'" by Mark Schreiber:
          allows moving windows around viewports without losing focus.

        - "Selfdefine xterm command" by Dagfinn I. Mannsaker: allow
          using custom xterm instead of hardcoded one.

        - "Update the Spec-file" by Ian Dall: update deprecated
          keywords.

        - "Fix make-pot" by Christopher Bratusek: the make-pot script
          works again.

        - Themer was removed, because rep-glade is not yet ported to
          glade2.

        - Added missing keyboard accelerators in window menu and Move
          and Resize entries, issue reported by Fernando Carmona Varo.


1.3.3
=====

   * The followup 1.3.3 version is released with bugfixes' fixes

   * Bug fixes:
        - "Utf 8 names fix" by Timo Korvola: window titles with UTF-8
          working and no openoffice crashes

        - "Pango draw() ignores font" by Yuuki Harano and Rodrigo
          Gallardo: allows using pango fonts correctly.

        - "Titlebar updates" by Harald van Dijk and Timo Korvola: don't
          forget to tell the running theme that window title length has
          changed.

        - "KDE tray fix 2" by Timo Korvola: KDE is not always using
          freedesktop.org protocol so we need to adjust a few glitches.


1.3.2
=====

   * The 1.3.2 version is released with bugfixes submitted by sawfish
     community

   * Strings are re-encoded in UTF-8. Window titles will be set
     correctly regardless of title encoding (Rodrigo Gallardo)

   * updated documentation to v0.12 (Derek Upham)

   * added Occitan Lanaguage (Yannig Marchegay)

   * Bug fixes:

        - Nautilus desktop window can now restore its size properly
          (Rodrigo Gallardo)

        - Sawfish.desktop file now complies with freedesktop.org
          standard (Rodrigo Gallardo)

        - Fix select workspace to make sure it calls with right
          arguments (GSR)

        - Fix 64 bit client messages (Thadeu Lima de Souza Cascardo)

        - Don't display unneeded blank lines when window is opened by
          prompt function (Sven Schoenung)

        - KDE system tray no longer fighs with sawfish to reparent a
          tray icon (Timo Korvola)

        - Add bounds checking on _NET_CURRENT_DESKTOP requests (Timo
          Korvola)

        - QT applications no longer lose focus when menu is active
          (Harald van Dijk)

        - Corrected window placement in xinerama/dualhead when using
          centered/centered-on-parent (Fuchur, with comments by Andrea
          Vettorello)


1.3.1
=====

   * The 1.3.1 version is released to let people know that Sawfish is
     being revived by the community, and we are awaiting patches to be
     submitted for incoming 1.3.2 release

   * John Harper resigns from Sawfish maintainership and Sawfish
     community takes over. Janek Kozicki has SVN access, applies
     patches and makes releases.

   * new official Sawfish website `http://sawfish.wikia.com/'

   * updated documentation to v0.11 from Derek Upham

   * updated FAQ from Sawfish wiki

   * added tool for automatic screenshot generation for huge number of
     themes (Scott Scriven)

   * Add detection for Xrandr extension (Philip Langdale)

   * added Punjabi Lanaguage (Amanpreet Alam)

   * Makefile.in: install Sawfish.desktop unconditionally (John Harper)

   * generate sawfish.gtk.widgets.font from font.jl.in, define
     have_pango_xft in the substitutions (John Harper)

   * Bug fixes:

        - fixed possible buffer overflow in src/fonts.c (Yoshiaki
          Kasahara)

        - Updated Swedish translation (Daniel Nylander)

        - check for pango libs and flags (optional dependency)


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


File: sawfish.info,  Node: Colors,  Next: Fonts,  Prev: News,  Up: Top

4 Colors
********

Sawfish provides a primitive type allowing colors to be represented.
Each color object allows a single color value to be named and passed
between Lisp functions.

 -- Function: colorp arg
     Returns `t' when ARG is a member of the color type.

 -- Function: get-color name #!optional alpha
     Returns the color object representing the color specified by the
     string NAME. This is according to the standard X11 color
     specifiers, either a named color from the `rgb.txt' database, or a
     string defining the red, green and blue components of the color,
     either eight or sixteen bits in hexadecimal, i.e. `#RRGGBB' or
     `#RRRRGGGGBBBB'.

     Optional argument ALPHA becomes the alpha value of the returned
     color.  It is passed through to `get-color-rgb'.

     Signals an error if no known color has the name NAME.

 -- Function: get-color-rgb red green blue #!optional alpha
     Return the color object representing the color with RGB components
     as specified (each component ranging from 0 to 65535).

     Optional argument ALPHA becomes the alpha value of the returned
     color.  Use an integer value in the range from 0 to 65535.
     Integers outside that range are not supported, while non-integers
     such as `nil' are silently converted to 65535 (fully opaque).

   Given a color object, it's possible to find both the actual rgb
values defining the color and one of the names that X11 uses to refer
to the color.

 -- Function: color-rgb color
     Return a list of integers `(RED GREEN BLUE ALPHA)', the actual
     color values of the color represented by object COLOR.  The
     individual values range from 0 to 65535.

 -- Function: color-rgb-8 color
     Return a list of integers `(RED GREEN BLUE ALPHA)', just like
     `color-rgb'.  However, the color values are scaled to fit a range
     from from 0 to 255.

 -- Function: color-name color
     Return the name of the color represented by the color object
     COLOR.  Note that this picks one name from the set of valid names
     for this color; it may well be different to the name used when the
     color was originally allocated.

     The X11 name does not include alpha information.

   Where a color object is used to define the foreground color of a
piece of text, the `default-foreground' color provides the default value
used if no actual color is specified.

 -- Variable: default-foreground
     The color used for text where no other color is defined.


File: sawfish.info,  Node: Fonts,  Next: Images,  Prev: Colors,  Up: Top

5 Fonts
*******

Lisp font object allows manipulation of correspondig X11 fonts.

 -- Function: fontp arg
     Returns `t' if ARG is a font object.

   Sawfish supports three "types" of fonts: X11 old core fonts (fontsets
and fontstructs), Xft fonts, and if supported, Pango fonts. In lisp,
type is represented by a string, `"xlfd"', `"Xft"', or `"Pango"'.

 -- Function: font-type-exists-p type
     Returns true if fonts of TYPE are available, false otherwise.

 -- Function: get-font-typed type name
     Returns a font object which represents an X11 font. It's specified
     by the string NAME, and string TYPE. Signals an error if the
     specified font is not available.

     "Safe" examples are:
          (get-font-typed "xlfd" "fixed")
          (get-font-typed "Xft" "Sans")
          (get-font-typed "Pango" "Sans")

 -- Function: get-font name
     Return a font object representing the X11 core font (fontset or
     fontstruct) specified by the string NAME.

     Signals an error if no font named NAME is available among the X11
     core fonts.

   Several functions allow the attributes associated with a font object
to be found.

 -- Function: font-name font
     Returns the name, in string, of the X11 font represented by object
     FONT.

 -- Function: font-type font
     Returns the font's type. It is one of `"xlfd"', `"Xft"', and
     `"Pango"'.

 -- Function: font-height font
     Returns the bounding height of glyphs in the font represented by
     object FONT.

 -- Function: font-ascent #!optional font
     Returns the ascent of glyphs rendered using the font represented by
     FONT.  If no font argument is given, use the default font.

 -- Function: font-descent #!optional font
     Returns the descent of glyphs rendered using the font represented
     by FONT.  If no font argument is given, use the default font.

 -- Function: text-width string #!optional font
     Returns the number of horizontal pixels that would be required to
     display the text STRING using font object FONT (or the value of
     the `default-font' variable if FONT is undefined).

   As with colors, a default font may be specified, to be used where no
other font is specified.

 -- Variable: default-font
     Font object used when no other font has been specified.

   Fonts can have Lisp properties associated with them (similar to the
property lists associated with symbols). Currently these aren't
actually used by the window manager.

 -- Function: font-put font property value
     Associate the lisp object VALUE with the property named by the
     symbol PROPERTY of the font object FONT.

 -- Function: font-get font property
     Return the value of the property named by the symbol PROPERTY of
     the font FONT, or `nil' if no such property exists.

 -- Variable: fonts-are-fontsets
     True if the X fonts in use are fontsets.  This will be false if
     `setlocale' fails, or returns an ASCII locale, or if X doesn't
     support the locale.


File: sawfish.info,  Node: Images,  Next: Cursors,  Prev: Fonts,  Up: Top

6 Images
********

The image type allows arbitrary 24-bit images to be manipulated by the
window manager. Images may be both loaded from files, and rendered
dynamically.

 -- Function: imagep arg
     Returns `t' when ARG is a member of the image type.

 -- Function: make-image file-name #!optional plist
     Creates and returns an image object containing the image defined
     by the contents of the file named FILE-NAME (a string). The
     `image-load-path' directory provides the search path used while
     trying to find a directory containing the file named FILE-NAME.

     All common image formats will likely be able to be loaded. But PNG,
     JPEG and XPM should always be supported.

     Argument PLIST becomes the property list of the returned image.

     Signals an error if file called FILE-NAME may be found, or if an
     image may not be constructed from the file.

 -- Variable: image-directory
     Directory containing built-in Sawfish images.  By default, this is
     `SAWFISH-DIRECTORY/images'.

 -- Variable: image-load-path
     A list of directory names. This defines the search path used when
     loading images.  By default, this is `("."  IMAGE-DIRECTORY)'.
     Modifying IMAGE-DIRECTORY does not modify IMAGE-LOAD-PATH.

 -- Function: make-sized-image width height #!optional color
     Create and return a new image, of size WIDTH,  HEIGHT. If COLOR is
     defined it specifies the color of all pixels in the image. If
     undefined, all pixels will be black.

 -- Function: make-image-from-x-drawable id #!optional mask-id
     Create and return an new image.  The image is constructed by
     copying an X Drawable (identified by ID) into a Sawfish image
     object.  The function automatically handles depth conversion.

     If MASK-ID is given, it identifies another X Drawable.  Black
     pixels in this drawable indicate transparent pixels in the image
     object (non-black pixels have no effect on the image object).

 -- Function: copy-image image
     Returns a newly allocated image object, an exact copy of the image
     object IMAGE.

 -- Function: image-dimensions image
     Returns a cons-cell `(WIDTH . HEIGHT)' defining the dimensions of
     the image represented by IMAGE.

 -- Function: flip-image-horizontally image
     Flip the contents of IMAGE about the vertical axis.  This is a
     mutating operation that returns the modified argument.

 -- Function: flip-image-vertically image
     Flip the contents of IMAGE about the horizontal axis.  This is a
     mutating operation that returns the modified argument.

 -- Function: flip-image-diagonally image
     Flip the contents of IMAGE about an axis running from the top-left
     corner to the bottom-right corner of the image.  This is a
     mutating operation that returns the modified argument.

   As with many of the other types, arbitrary state may be associated
with image objects.

 -- Function: image-put image property value
     Set the property named PROPERTY (a symbol) of IMAGE to VALUE.

 -- Function: image-get image property
     Return the property named PROPERTY of IMAGE, or `nil' if no such
     property exists.

   The only predefined property is the symbol `tiled', used when an
image is displayed in a window decoration. When set to a non-nil value
the image is not scaled to the size of the decoration (the default),
but is tiled across the decoration.

   When images are scaled across border decorations the pixels that are
actually scaled are defined by the "border" of the image. The border
defines the outer rectangle of pixels that are left as-is, and the
inner rectangle which is scaled.

 -- Function: image-border image
     Returns a list of integers `(LEFT RIGHT TOP BOTTOM)', the border
     of the image object IMAGE.

     The number associated with each edge of the image defines the
     number of pixels adjacent to that edge that _will not_ be scaled.

 -- Function: set-image-border image left right top bottom
     Sets the border of IMAGE.

     The number associated with each edge of the image defines the
     number of pixels adjacent to that edge that _will not_ be scaled.

   The shape of the image may also be specified, this defines which
pixels are treated as being transparent. Each image may define a single
color as marking transparent pixels.

   Image shapes are not supported under GDK Pixbuf.  Sawfish will print
a diagnostic message to `STDERR' if the function is called without
being supported.

 -- Function: image-shape-color image
     Return the color marking transparent pixels in IMAGE, or `nil' if
     no such color has been specified.

 -- Function: set-image-shape-color image color
     Specify that COLOR marks transparent pixels in IMAGE.

   It's also possible to define "color modifiers" for each image.
These define the transformation applied to the value of each pixel when
it is displayed. Four different modifiers exist for each image, one for
each color component, and one for the image as a whole.

 -- Function: image-modifier image type
     Return the modifier defined by the symbol TYPE of IMAGE, a list of
     integers `(GAMMA BRIGHTNESS CONTRAST)'.  Each integer has a value
     between zero and 255 representing the weight applied to the
     associated attribute when rendering the image.

     The four types are `red', `green', `blue' and `nil' (all colors).
     The argument must be `eq' to one of those symbols.

 -- Function: set-image-modifier image type gamma brightness contrast
     Set the image modifier of IMAGE defined by TYPE.  TYPE may be one
     of the values of (not the symbols) `red', `green' or `blue'.

   There are also several other functions manipulating images:

 -- Function: bevel-image image border upwards #!optional bevel-percent
     Transform the edgemost pixels of IMAGE to give it a "bevelled"
     effect. BORDER is an integer defining the width of the bevel. If
     UPWARDS is non-nil the bevel is raised, otherwise it is lowered.

     If BEVEL-PERCENT is defined it specifies the height or depth of
     the drawn bevel. When undefined, the value of the parameter is
     taken from the `default-bevel-percent' variable.

 -- Variable: default-bevel-percent
     Default height of drawn bevels, as a percentage.  Normally 50%.

 -- Function: clear-image image #!optional color
     Set all pixels in IMAGE to COLOR (or black if COLOR is undefined).

 -- Function: tile-image dest-image source-image
     Tiles SOURCE-IMAGE into DEST-IMAGE, starting from the upper-left
     corner, working outwards.

 -- Function: scale-image image width height
     Return a copy of IMAGE, scaled to WIDTH by HEIGHT pixels.

 -- Function: composite-images image1 image2 #!optional x y
     Copy the contents of IMAGE2 into IMAGE1.  IMAGE2 is cropped to
     fit.  Arguments X and Y indicate the position in IMAGE1 of the
     top-left corner of IMAGE2.  If not supplied, they default to 0.

 -- Function: crop-image image x y width height
     Return a new image that is a rectangular section of IMAGE.  The
     result image starts at pixel (X, Y) in IMAGE, and extends over
     WIDTH and HEIGHT pixels in IMAGE.

     When the cropped image extends beyond the boundary of IMAGE, the
     behavior is undefined.

   The following functions allow users to manipulate images on a
pixel-by-pixel level.  They all use a list representation for pixels:
(R, G, B, A) indicating the red, green, blue and alpha components

 -- Function: image-ref image x y
     Return a list (R, G, B, A) of the red, green, blue and alpha
     components of the pixel (X, Y) in IMAGE.

     When the pixel position extends outside the bounds of the image,
     the behavior is undefined.

 -- Function: image-set image x y pixel
     Set the pixel at (X, Y) in IMAGE to PIXEL.  PIXEL is a list of
     four numbers (R, G, B, A), the red, green, blue and alpha
     components.

     When the pixel position extends outside the bounds of the image,
     the behavior is undefined.

 -- Function: image-map xform image
     Transform each pixel in IMAGE in place by calling XFORM on each
     pixel in the image.

     XFORM takes a single argument, a four element list (R, G, B, A)
     indicating the red, green, blue and alpha components of a pixel.
     XFORM should return the new value for the pixel it was given.  The
     return format is the same four-element list.

     XFORM is allowed to return `nil'.  In this case, `image-map'
     immediately returns an invalid object.

 -- Function: image-fill generator image
     Set each pixel in IMAGE based on the results of calling GENERATOR.

     GENERATOR takes two arguments: the X and Y coordinates of a pixel.
     It returns a four element list (R, G, B, A) indicating the red,
     green, blue and alpha components of a pixel.  This new pixel
     replaces the current pixel contents at (X, Y).

     GENERATOR is allowed to return `nil'.  In this case, `image-map'
     immediately returns an invalid object.

 -- Function: pixmap-cache-control max
     Tell Sawfish to cache no more than MAX pixels.  Returns a
     four-element list indicating the current cache status:
     `(MAX-CACHED-PIXELS, CACHED-PIXELS, HITS, MISSES)'.


File: sawfish.info,  Node: Cursors,  Next: Windows,  Prev: Images,  Up: Top

7 Cursors
*********

Cursors define the shape and hot-spot of the mouse pointer's image.  A
lisp type is provided for manipulating these objects. For pointer
related functions, *Note Pointer Functions::.

 -- Function: cursorp arg
     Returns `t' if ARG is a member of the cursor type.

 -- Function: get-cursor data
     Returns the cursor object representing the cursor defined by DATA.
     If DATA is a symbol, it's replaced by its `cursor-shape' property.

     Possible DATA values are an integer representing a glyph in the
     standard X11 cursor font, or a four-element vector.

     The format for a vector is `[IMAGE MASK FG BG]' where IMAGE and
     MASK are the filenames of standard X11 bitmaps, and FG and BG are
     colors (or names of colors). All bitmap files are searched for
     using the `image-load-path' variable.

 -- Function: recolor-cursor cursor fg bg
     Change the colors of the cursor object CURSOR to FG and BG (either
     color objects or the names of colors).

 -- Function: default-cursor #!optional cursor
     Set the cursor object displayed in the root window, and in parts of
     window frames that have no other cursor specified, to CURSOR.

     If called with no argument, simply return the current such cursor
     object.

   So that the integer indices of glyphs in the X11 cursor font do not
have to be remembered, the `cursor-shape' properties of the following
symbols are automatically set:

`X_cursor', `arrow', `based_arrow_down', `based_arrow_up', `boat',
`bogosity', `bottom_left_corner', `bottom_right_corner', `bottom_side',
`bottom_tee', `box_spiral', `center_ptr', `circle', `clock',
`coffee_mug', `cross', `cross_reverse', `crosshair', `diamond_cross',
`dot', `dotbox', `double_arrow', `draft_large', `draft_small',
`draped_box', `exchange', `fleur', `gobbler', `gumby', `hand1',
`hand2', `heart', `icon', `iron_cross', `left_ptr', `left_side',
`left_tee', `leftbutton', `ll_angle', `lr_angle', `man',
`middlebutton', `mouse', `pencil', `pirate', `plus', `question_arrow',
`right_ptr', `right_side', `right_tee', `rightbutton', `rtl_logo',
`sailboat', `sb_down_arrow', `sb_h_double_arrow', `sb_left_arrow',
`sb_right_arrow', `sb_up_arrow', `sb_v_double_arrow', `shuttle',
`sizing', `spider', `spraycan', `star', `target', `tcross',
`top_left_arrow', `top_left_corner', `top_right_corner', `top_side',
`top_tee', `trek', `ul_angle', `umbrella', `ur_angle', `watch', `xterm'.

   The glyphs associated with these names are shown in Appendix I, of
Volume Two, `Xlib Reference Manual'.


File: sawfish.info,  Node: Windows,  Next: Customization,  Prev: Cursors,  Up: Top

8 Windows
*********

One of the most important data types in sawfish is the window type. All
managed client windows have a single window object associated with them.

 -- Function: windowp arg
     Returns `t' if ARG is a member of the window type, and has a
     client window associated with it.

   Since the root window is not a managed client window, it is not
represented by a window object. Sometimes functions' arguments and
return value treat the symbol `root' as the root window. Window hooks
are so. But sometimes not.

* Menu:

Basics:
* Window Attributes::
* Getting Windows:: Get window by name, class, all, etc.
* Window Property Lists:: Plist attached by Sawfish.
* Window Types::  Some windows have type, like transient.
* Input Focus::
* X Properties::
* Window Groups::

Operations on windows:
* Activating Window:: Make a window ready for use.
* Window Stacking::
* Moving and Resizing Windows::
* Showing and Hiding Windows::
* Destroying Windows::
* Shading Windows::
* Maximizing Windows::
* Cycling Between Windows::
* Window Rules by Matching::
* Animating Windows::
* Iconifying Windows::

Windows with special properties:
* Window Stickiness::
* Ignored Windows::
* Avoided Windows::


File: sawfish.info,  Node: Window Attributes,  Next: Getting Windows,  Up: Windows

8.1 Window Attributes
=====================

Many attributes are described in the related sections.

   First, basic attributes, like name, class, ID, etc.

 -- Function: window-name window
     Return the name associated with WINDOW.

 -- Function: window-full-name window
     Return the full-name associated with WINDOW. This may or may not
     be the same as the normal name.

   Sawfish provides functions to ensure that window names are unique.

 -- Function: uniquify-name proposal existing
     Uniquify the string PROPOSAL against the list of strings EXISTING.
     Uses the format string `uniquify-name-format' to generate unique
     names.

 -- Variable: uniquify-name-format
     Format to create unique window names.  Defaults to `"%s [%d]"'.

 -- Function: uniquify-window-name window
 -- Command: uniquify-window-name window
     Force WINDOW to have a unique title.

 -- Function: rename-window win name
     Change the window's name to NAME. This works in practice, but
     technically ICCCM doesn't suppose window name changes.

 -- Function: window-class window #!optional spec
     If the optional argument SPEC is `nil', returns the class that
     WINDOW belongs to as a string, or nil if WINDOW has no associated
     class.

     ICCCM class consists of "Instance" and "Class". If SPEC is the
     symbol `cons', then the cons of the form `(INSTANCE . CLASS)' is
     returned. If SPEC is the symbol `configurator', then the string of
     the form "INSTANCE/CLASS" is returned.

 -- Function: window-role window
     Return the window role set by `NET_WM_ROLE'.

 -- Function: window-id window
     If window object WINDOW has a client window associated with,
     return an integer defining its xid, otherwise return `nil'.

 -- Function: root-window-id
     Returns the numeric ID of the root window of the managed screen.

 -- Function: window-dimensions window
     Returns the size of the window WINDOW in a cons cell `(WIDTH .
     HEIGHT)'. This does _not_ include the frame. The size including
     the frame is returned by `window-frame-dimensions'. (*note Frame
     Functions::)

 -- Function: window-position window
     Returns the position of the window decorated with the frame in a
     cons-cell `(X . Y)'.

 -- Function: display-window-position #!optional window
     Display WINDOW's position and size in a popup. If the argument is
     `nil' or called as a command, user chooses the window by cursor
     and click.

     This function is defined in `sawfish.wm.util.display-wininfo'.

 -- Function: get-window-wm-protocols window
     Return a list of symbols defining the X11 window manager protocols
     supported by client WINDOW.

 -- Function: window-supports-wm-protocol-p window atom
     Return true if WINDOW includes ATOM in its `WM_PROTOCOLS' property.

 -- Function: window-pid window
     Returns the window process ID, or nil if not available.

Listed here are window visibility predicates: `stacking-visibility',
`window-obscured' (*note Stacking Visibility::), `window-visible-p'
(*note Showing and Hiding Windows::), `window-shaped-p' (*note Shading
Windows::), `window-iconified-p' (*note Iconifying Windows::),
`window-in-workspace-p' (*note Workspaces and Windows::),
`window-outside-viewport-p' (*note Windows and Viewports::).

Various predicates:

 -- Function: window-mapped-p window
     Return `t' if the client window associated with object WINDOW is
     mapped. (Note that this doesn't necessarily mean that it is
     visible.)

 -- Function: window-shaped-p window
     Return `t' if WINDOW is shaped (possibly not rectangular).

 -- Function: window-urgent-p window
     Return `t' if the "Urgency" hint of the window associated with
     WINDOW is set.

 -- Function: window-wants-input-p window
 -- Function: window-really-wants-input-p window
     See *Note Input Focus::.


File: sawfish.info,  Node: Getting Windows,  Next: Window Property Lists,  Prev: Window Attributes,  Up: Windows

8.2 Getting Windows
===================

First, functions which treat all windows.

 -- Function: managed-windows
     Returns a list containing all managed window objects, in the order
     that they were adopted by the window manager (first to last).

 -- Function: map-windows function
     Call `(FUNCTION WINDOW)' on all existing windows.  Returns the
     value of the last FUNCTION invocation.  If any FUNCTION returns
     `nil', `map-windows' returns `nil' immediately.

Functions to get specific windows.

 -- Function: get-window-by-id xid
     Return a window object with ID XID, or `nil'.

 -- Function: get-window-by-name name #!key regex icon
     Return a window object with name NAME, or `nil'.  Even if multiple
     windows are matched, one of them is returned.

     If `regex' is non-nil, NAME is treated as a regex, and matched
     against window names.

     If `icon' is non-nil, window's icon name (set by
     `NEW_WM_ICON_NAME', _not_ EWMH `_NET_WM_ICON_NAME') is searched,
     instead of the window's name.

 -- Function: get-window-by-class class #!regex
     Same as the above, but the match is done against the window class.
     Here, the class does not include the "instance". (See
     `window-class' in *Note Window Attributes::.)

     The option `regex' is boolean, not a regex, like
     `get-window-by-name'.

 -- Function: get-window-by-role role
     Same as the above, but the match is done against the window role.

     The option `regex' is boolean, not a regex, like
     `get-window-by-name'.


 -- Function: filter-windows pred
     Return the list of windows (mapped or unmapped) that match the
     predicate function PRED.


File: sawfish.info,  Node: Window Property Lists,  Next: Window Types,  Prev: Getting Windows,  Up: Windows

8.3 Window Property Lists
=========================

Many window manager extensions need to be able to associate Lisp data
with individual windows. For example, the module handling iconification
needs to associate a boolean value with each window--whether that
window is iconified or not.

   To solve this problem, Sawfish gives each window a property list.
These are exactly analogous to the property lists stored with each
symbol (*note Property Lists: (librep)Property Lists.); they allow
values to be associated with Lisp symbols, for a particular window.

   Note that these properties are different to the properties that X
stores with each window, since these properties are internal to the
window manager (*note X Properties::).

   For a list of the standard window properties, see *Note Standard
Properties::.

 -- Function: window-put window property value
     Set the lisp property named PROPERTY (a symbol) associated with
     window object WINDOW to VALUE.  Note that these are Lisp
     properties not X properties.

 -- Function: window-get window property #!optional checker
     Return the window property named PROPERTY (a symbol) associated
     with the window object WINDOW, or `nil' if no such property
     exists.  Note that these are Lisp properties not X properties.

     If the optional third argument CHECKER is non-nil, then CHECKER is
     returned if the requested property does not exist. This is used to
     distinguish the assigned value of `nil' from property's absence.
     A symbol is usually a good choice for CHECKER.

 -- Function: map-window-properties function window
     Call `(FUNCTION PROPERTY VALUE)' on each of the Lisp properties
     bound to WINDOW.  Returns the value of the last FUNCTION
     invocation.  If any FUNCTION returns `nil',
     `map-window-properties' returns `nil' immediately.

 -- Function: window-plist window
     Returns the property list of the window WINDOW which is of the form
     `(prop value prop value ...)'.

     Do not attempt to change properties by modifying the property list
     in place.  Use window-put instead.

 -- Function: window-remprop window property
     Remove PROPERTY of WINDOW. Returns `t' for success, `nil' if the
     property did not exist.


File: sawfish.info,  Node: Window Types,  Next: Input Focus,  Prev: Window Property Lists,  Up: Windows

8.4 Window Types
================

Some window "types" are defined. They represent the window's special
nature based on the role. Defined types are "transient", "desktop", and
"dock".

   A type is usually set by applications through hints when the window
appears. Many windows do not have any types.

   "Transient" windows are pop-up or dialog windows associated with a
main application.  They tend to have less window decorations, and are
intended to last a short time only.

 -- Function: window-transient-p window
     Returns `nil' if WINDOW isn't marked as a transient window.
     Otherwise returns an integer, the xid of the parent window.

 -- Function: mark-window-as-transient w
     Mark that the window associated with object W is a transient
     window.

 -- Function: transient-of-p child parent
     Return true if window CHILD is directly a transient for window
     PARENT, false otherwise.

 -- Function: indirect-transient-of-p descendant ancestor
     Return true if window DESCENDANT is (directly or indirectly) a
     transient for window ANCESTOR, false otherwise.

 -- Function: transient-parents child #!optional indirectly
     Return the list of windows that window CHILD is a transient for.
     If INDIRECTLY is true, then return the list of all ancestors
     rather than parents.

 -- Function: transient-children parent #!optional indirectly
     Return the list of windows that are transients for window PARENT.
     If INDIRECTLY is true, then return the list of all descendants
     rather than children.

 -- Function: transient-group window #!optional by-depth
     Return the list of windows which is either a transient window for
     window WINDOW, or a window which WINDOW is a transient for.  This
     always includes W.  The `transient window for' relation holds for
     windows which are direct or indirect transients of the parent
     window in question.

     If the BY-DEPTH argument is true, then the retrurned list is in
     stacking order.

 -- Function: map-transient-group fun window
     Map the single argument function FUN over all windows in the same
     transient group as window WINDOW.

 -- Function: raise-window-and-transients window
     Raise window WINDOW to its highest allowed position in the
     stacking order.  Also raise any transient windows that it has.

 -- Function: lower-window-and-transients window
     Lower window WINDOW to its lowest allowed position in the stacking
     order.  Also lower any transient windows that it has.

 -- Function: raise-lower-window-and-transients window
     If window WINDOW is at its highest possible position, then lower
     it to its lowest possible position.  Otherwise raise it as far as
     allowed.  Also changes the level of any transient windows it has.

 -- Customizable: focus-windows-when-mapped
     Focus on application windows when they first appear.  Defaults to
     true, must be true or false.

 -- Variable: decorate-transients
     Decorate dialog windows similarly to application windows.
     Defaults to false.

   "Desktop" windows are root windows or viewport windows. They accept
keys as if it is a root window. (I.e., `root-window-keymap' is used.)
They don't have a frame.

 -- Function: desktop-window-p arg
     Returns `t' if ARG represents a desktop window.

 -- Function: mark-window-as-desktop w
     Mark that the window associated with object W is a desktop window.

 -- Variable: desktop-window-properties
     List of properties set (to true) on windows when they are marked as
     desktops.  Defaults to
          '(fixed-position sticky sticky-viewport)

 -- Variable: desktop-window-depth
     The stacking depth of desktop windows.  Defaults to -4.

   "Dock" windows are docks or panels. They don't have frame by default.

 -- Function: dock-window-p arg
     Returns `t' if ARG represents a dock window.

 -- Function: mark-window-as-dock w
     Mark that the window associated with object W is a dock window.

 -- Variable: dock-window-properties
     List of properties set (to true) on windows when they are marked as
     docks. Defaults to
          '(window-list-skip cycle-skip fixed-position focus-click-through
            avoid no-history never-iconify never-maximize sticky
            sticky-viewport placed)

 -- Variable: dock-window-depth
     The stacking depth of dock windows.  Defaults to 0.


File: sawfish.info,  Node: Input Focus,  Next: X Properties,  Prev: Window Types,  Up: Windows

8.5 Input Focus
===============

The input focus defines exactly which client window will receive events
generated by the keyboard.

 -- Function: input-focus
     Returns the window object of the currently focused window, or
     `nil' if no window is focused.

 -- Function: set-input-focus window
     Sets the focus to the client window associated with WINDOW.

     If WINDOW is `nil', then no window will have the focus.

 -- Function: window-wants-input-p window
     If you're unsure, use `window-really-wants-input-p' function
     described below.

     Return `t' when the window WINDOW wants input focus in X sense,
     i.e. if it has asked for the input focus to be assigned to,
     through the `input' field of its `WM_HINTS' property.

 -- Function: window-really-wants-input-p window
     Like `window-wants-input-p', but in addition, this function also
     takes into account user option provided by Sawfish, i.e. if the
     window has `never-focus' property or not.

   The window manager is responsible for switching the input focus from
client window to client window.  Sawfish implements several "focus
modes" that provide this behavior.  Each focus mode is bound to a
symbol; the implementation is bound to that symbol's `focus-mode'
property slot.

 -- Variable: focus-mode
     Defines the current method of using the mouse to assign the input
     focus.  This is a symbol from the list `focus-modes'.

 -- Variable: focus-modes
     A list containing all names of focus modes.  The built-in values
     are `enter-exit', `enter-only', `enter-click' and `click'.

   Focus mode `enter-exit' changes focus when the pointer enters a
window or leaves the focused window.  Focus mode `enter-only' changes
focus when the pointer enters a window, but not when it leaves the
focused window.  Focus mode `click' changes focus when you click on a
window.  Focus mode `enter-click' is the union of `enter-only' and
`click', and changes focus on any of their conditions.

   It is possible to add additional focus modes by defining your own
handler function.  The handler function must obey a
"focus-mode-handler" protocol.

 -- Function Protocol: focus-mode-handler window event-name #!optional
          args
     A function that implements the `focus-mode-handler' protocol can
     be used to define a focus mode.  A `focus-mode-handler' responds
     to events associated with windows.

     Argument WINDOW is the window that received this event.

     Argument EVENT-NAME is one of the following symbols:

    `pointer-in'
    `pointer-out'
          The pointer has entered or exited the window.  The handler is
          responsible for checking whether an entered window wants
          input events.  The desktop never receives `pointer-in' or
          `pointer-out'; only normal windows do.

    `enter-root'
    `leave-root'
          The pointer has entered or exited the desktop (which is the
          WINDOW argument).  Normal windows never receive `enter-root'
          or `leave-root'.

    `focus-in'
    `focus-out'
          The window argument has gotten or lost focus.  Note that the
          `focus-in' handler is not responsible for updating the
          window-order list.

    `before-mode-change'
    `after-mode-change'
          Sawfish sends these synthetic events to each window
          before/after changing that window's focus mode.  When the
          global focus mode changes, all windows get these events.

    `add-window'
          Sawfish sends this event to every window immediately after
          mapping it.  Handlers can use this to initialize
          window-internal data structures.

    `warp-if-necessary'
          Warp the cursor to the window if doing so would make the
          cursor position "consistent" with the focus mode.  For
          example, in `enter-exit' mode we warp the cursor if it is not
          already in this window.  In `enter-only' mode, we warp the
          cursor if it is in another window, but not if it is over the
          desktop--a window would not lose focus when the cursor moved
          from it to the desktop.

          This event is implemented via `warp-cursor-to-window', so
          Sawfish will not warp unless `warp-to-window-enabled' is true.

    `focus-revert'
          The focused window has disappeared (the WINDOW argument is not
          used here).  The focus mode may react by setting focus to
          some other window.  If a focused transient window disappears,
          focus normally reverts to the window that the disappearing
          window was transient for.  `focus-revert' is not invoked in
          that case.

     The protocol allows for any number of additional arguments, but
     does not define any.  Any handler function must be prepared to
     receive and ignore them.

     Unsupported events may be ignored.  The return value of this
     function is ignored.

 -- Function: define-focus-mode name fun
     Defines a new focus mode called NAME (a symbol).  The focus-mode
     handler FUN implements this focus mode.

     See the documentation for `focus-mode-handler' for more
     information.

 -- Function: set-focus-mode window mode
     Set the focus mode of window WINDOW to MODE.  This triggers
     `before-mode-change' and `after-mode-change' focus-mode events on
     WINDOW.

 -- Function: warp-pointer-if-necessary window
     Generate a `warp-if-necessary' event and sends it to the window's
     focus function.

     Various functions call `warp-pointer-if-necessary' if they move
     the focused window out from underneath the pointer.

 -- Variable: focus-click-through
     When in `click' focus mode, the focus-assigning click is only
     passed through to the client window if this variable is `t' (the
     default).

     This option may be set on a per-window basis by setting the
     `focus-click-through' property of the window (using the
     `window-put' function).

 -- Variable: focus-within-click-event
     When true, the current command is being called from within a
     click-to-focus button press event.

     This is a fluid object, not an ordinary variable.

   Sawfish also maintains the order in which windows were recently
focused.

 -- Function: window-order #!optional workspace allow-iconified
          all-viewports
     Return a list of windows, in most-recently-focused order.

     If WORKSPACE is an integer, then only windows on that workspace
     are included, otherwise all workspaces are searched.

     If ALLOW-ICONIFIED is non-nil, iconified windows are included. If
     `all-viewports' is non-nil, then all viewports of the workspace(s)
     are scanned.

 -- Function: window-order-push window
     Push window object WINDOW onto the top of the focus stack.

 -- Function: window-order-pop window
     Remove window object WINDOW from the focus stack.

 -- Function: window-order-most-recent #!optional windows
     Return the most-recently focused window in the current workspace.
     If the optional argument WINDOWS is given, it must be a list of
     windows.  In that case, the function will return the most-recently
     focused window from that list.

 -- Function: window-order-focus-most-recent
     Focus the most-recently-focused window of the current workspace.

 -- Variable: focus-dont-push
     When true, focusing a window doesn't change it's position in the
     stack of most-recently focused windows.

Other focus related functions:

 -- Function: window-in-cycle-p window &keyword ignore-cycle-skip
     Returns `t' if the window WINDOW should be included when cycling
     between windows.  Desktop windows and those with the `cycle-skip'
     property should normally not be included.

     When `t', the IGNORE-CYCLE-SKIP keyword argument forces the
     function to include windows with the `cycle-skip' property.

 -- Function: focus-push-map window keymap
 -- Function: focus-pop-map window
     Maintain a two-element keymap stack for WINDOW.

     `focus-push-map' makes KEYMAP current for WINDOW, but saves the
     existing keymap.  We can restore this existing keymap with
     `focus-pop-map'.

     These functions are intended to support click-to-focus.  They
     enforce certain sanity rules: pushing into a two-element stack
     will only overwrite the top element, while popping a one-element
     stack has no effect.

 -- Function: autoload-focus-mode name func
     MISSING.  This does not seem to be used anywhere, and its behavior
     is unclear.

 -- Function: select-window
     Waits for the user to left-click on a window, and returns that
     window.  The mouse cursor changes shape, and all normal input
     events are suppressed until a window is selected. For root window,
     `nil' is returned.

 -- Variable: select-window-cursor-shape
     The cursor shape to use when selecting a window.  Defaults to
     `crosshair'.


File: sawfish.info,  Node: X Properties,  Next: Window Groups,  Prev: Input Focus,  Up: Windows

8.6 X Properties
================

The X window system associates properties with windows (these are
totally separate to the properties that sawfish associates with window
_objects_, *note Window Property Lists::). Most inter-client
communication is performed through manipulation of these properties.

   All functions defined below, that operate on X properties, accept
their WINDOW parameter as either a window object (denoting the
associated client window), the numeric xid of a window, or the symbol
`root' denoting the root window.

   Sawfish represents X atoms (both the names and data types of  X
properties) as symbols. There is an exact correspondence between the
names of atoms and the name of the symbol representing them. For
example, the X atom `STRING' is represented by the lisp symbol `STRING'.

 -- Function: list-x-properties window
     Return a list of symbols defining the X properties set on WINDOW.

 -- Function: delete-x-property window property
     Deletes the X property named PROPERTY (a symbol) associated with
     WINDOW.

 -- Function: get-x-property window property
     Returns a list `(TYPE FORMAT DATA)' representing the X property
     PROPERTY of WINDOW. If no such property exists, return nil.

     TYPE is the atom defining the type of the property. FORMAT is an
     integer, either 8, 16 or 32, defining the number of bits in each
     of the data items. DATA is an array, either a string for an 8-bit
     format property, or a vector of integers otherwise.

     If TYPE is `ATOM' and FORMAT is 32, then DATA will be a vector of
     symbols, representing the atoms read.

 -- Function: set-x-property window property data type format
     Set the X property PROPERTY of WINDOW to the array DATA, either a
     string or a vector of integers.

     TYPE is a symbol representing the atom defining the type of the
     property; FORMAT is either 8, 16 or 32 defining the number of bits
     in the data values.

     If TYPE is `ATOM' and FORMAT is 32, then any symbols in DATA will
     be converted to their numeric X atoms.

   The standard X property formats don't allow for an array of strings
to be stored, so these are often encoded as the strings concatenated,
separated by zero characters. These are usually called "text
properties". Sawfish has two functions for manipulating them:

 -- Function: get-x-text-property window property
     Similar to `get-x-property', but returns either `nil' or a vector
     of strings.

 -- Function: set-x-text-property window property data
     Sets the X text property PROPERTY of WINDOW to the array of
     strings DATA.

   It's also possible to detect when the value of any property
associated with a managed window changes, using the
`property-notify-hook'.  *Note Standard Hooks::.  The following
convenience function takes advantage of this hook:

 -- Function: call-after-property-changed prop fun
     Arrange for function FUN to be called with arguments `(window
     property state)' when the X11 property named PROP (a symbol)
     changes.  PROP may also be a list of property names to monitor.


File: sawfish.info,  Node: Window Groups,  Next: Activating Window,  Prev: X Properties,  Up: Windows

8.7 Window Groups
=================

Sawfish provides extra tools and commands for dealing with ICCCM
groups.  Most "normal" groups work the same way as they do in the ICCCM
standard: windows have a group property that is set to the X window ID
of the group leader.  These are "group IDs", and they are always
positive integers.  In addition, Sawfish allows group IDs to be:

negative integers
     These are anonymous user-defined groups.

symbols
     These are named user-defined groups.  Named user-defined groups are
     saved as part of window properties when saving sessions.

 -- Function: window-group-id window
     If WINDOW is part of a group, return the X window id of the leader
     of that group.  Otherwise return `nil'.

 -- Function: window-group-ids
     Return the list of all group ids.

   There may be certain named groups that always exist, whether or not
any window belongs to them.

 -- Variable: peristent-group-ids
     A list of symbols naming groups that always exist.

   In any case, a window is limited to belonging to one group, and
always belongs to one group.

* Menu:

* Assigning Windows to Groups::
* Operations on Groups::


File: sawfish.info,  Node: Assigning Windows to Groups,  Next: Operations on Groups,  Prev: Window Groups,  Up: Window Groups

8.7.1 Assigning Windows to Groups
---------------------------------

It is possible to change the group of a window in Sawfish.  Use
`add-window-to-group', or if necessary you can set the window's `group'
property explicitly.

 -- Function: add-window-to-group window group-id
     Place WINDOW in group GROUP-ID, replacing any previous group
     membership.  If GROUP-ID is `nil', then Sawfish returns the window
     to whatever group membership was supplied by ICCCM.

 -- Function: add-window-to-new-group window
     Place WINDOW into a new group, which will have WINDOW as its sole
     member.  This is an anonymous user-defined group.  The new group
     ID is returned.

   The Sawfish group assignment never overrides the ICCCM group
assignment, just suppresses it.  The `window-actual-group-id' function
implements this overriding.

 -- Function: window-actual-group-id window
     Return the (Sawfish) group ID for WINDOW.  This is, in order of
     preference:
        * The group ID assigned by Sawfish

        * The group ID passed in by ICCCM.

        * The corresponding values for an owning window, if the given
          window is transient.

        * The window's own window ID.

     This means that a window is, at the very least, part of its own
     group.

   Each of the following functions operates on the "actual group ID" as
returned by the above function.

 -- Function: windows-by-group group-id #!optional by-depth
     Return the list of windows in the group with id GROUP-ID.  If
     BY-DEPTH is non-nil, then return the windows in order of stacking,
     from topmost to bottommost.

 -- Function: windows-in-group w #!optional by-depth
     Return the list of windows in the same group as window W.  If
     BY-DEPTH is non-nil, then return the windows in order of stacking,
     from topmost to bottommost.

 -- Function: map-window-group fun w
     Map the single argument function FUN over all windows in the same
     group as window W.  Note that FUN needs to operate using
     side-effects, rather than returning values.

 -- Function: map-other-window-groups fun w
     Map the single argument function FUN over all windows not in the
     same group as window W.  Note that FUN needs to operate using
     side-effects, rather than returning values.

 -- Function: window-group-menu #!optional w
     Return a menu definition suitable for `popup-menu'.  This menu
     will allow the user to assign the window W into any group of a
     managed window, or into a brand new group.  The window's current
     group is checked or otherwise marked.


File: sawfish.info,  Node: Operations on Groups,  Prev: Assigning Windows to Groups,  Up: Window Groups

8.7.2 Operations on Groups
--------------------------

Most of the window manipulation functions that operate on windows are
also available for window groups.  Each of these functions takes a
window as argument; the affected group is that window's group.

 -- Function: iconify-group w
 -- Function: uniconify-group w
 -- Function: iconify-transient-group w
 -- Function: uniconify-transient-group w
     These operate like their single-window counterparts.  They work by
     temporarily rebinding `iconify-group-mode' and
     `uniconify-group-mode'.

 -- Function: make-group-sticky w
 -- Function: make-group-unsticky w
     These operate like their single-window counterparts.

 -- Function: toggle-group-sticky w
     If window W is sticky, all windows in its group have their
     stickyness removed.  Otherwise all windows in its group become
     sticky.

 -- Function: send-group-to-workspace w workspace
 -- Function: send-group-to-next-workspace w count
 -- Function: send-group-to-previous-workspace w count
     These operate like their single-window counterparts.

 -- Function: send-group-to-current-workspace w
     All windows in the group of W are moved from their existing
     workspaces to the nearest workspace that W is in.  Sticky windows
     are not affected.  If the window had the input focus and it is
     visible after the move, it retains the input focus.

 -- Function: move-group-to-current-viewport w
 -- Function: move-group-viewport w

 -- Function: move-group-left w
 -- Function: move-group-right w
 -- Function: move-group-up w
 -- Function: move-group-down w
     These operate like their single-window counterparts.

 -- Function: raise-group w
 -- Function: lower-group w
 -- Function: raise-lower-group w
 -- Function: raise-group-depth w
 -- Function: lower-group-depth w
     These operate like their single-window counterparts.

 -- Function: set-group-frame-style w style
     This operates like its single-window counterpart.


File: sawfish.info,  Node: Activating Window,  Next: Window Stacking,  Prev: Window Groups,  Up: Windows

8.8 Activating Window
=====================

When user wants to use a window, displaying, focusing, raising, etc,
are necessary. Functions in this section do such jobs.

 -- Function: display-window window
     Roughly speaking, do everything necessary to make WINDOW ready for
     user.

     The operations are done in the following order. If the window is
     iconified, it gets un-iconified. The workspace and the viewport in
     which the window lies is selected. Unshade if necessary. (See
     `unshade-selected-windows' variable below.) Then call the
     `activate-window' function described below.

     It is defined in `sawfish.wm.util.display-window' module.

 -- Function: activate-window window
     Raise, focus, warp pointer if necessary, and mark the window as the
     top of window order. Don't focus if the window doesn't allow that
     operation.

 -- Customizable: unshade-selected-windows
     When non-nil, unshade windows when selected.


File: sawfish.info,  Node: Window Stacking,  Next: Moving and Resizing Windows,  Prev: Activating Window,  Up: Windows

8.9 Window Stacking
===================

The stacking order of the display defines the order in which windows
are shown, from topmost to bottommost. It's Sawfish that maintains this
list.  Raising or lowering windows changes their positions in this list.

* Menu:

* Stacking Order::
* Stacking Visibility::
* Raising and Lowering Windows::


File: sawfish.info,  Node: Stacking Order,  Next: Stacking Visibility,  Prev: Window Stacking,  Up: Window Stacking

8.9.1 Stacking Order
--------------------

 -- Function: stacking-order
     Return a list of window objects defining the current stacking
     order of all client windows, from top-most to bottom-most.

 -- Function: mapped-stacking-order
     Similar to `stacking-order', but only returns windows that are
     mapped.

 -- Function: restack-windows list
     Restack all client windows specified in the list of window objects
     LIST in the order they occur in the list (from top to bottom).
     The stacking order of any unspecified windows isn't affected.

   Sawfish allows the stacking order to be managed as a sequence of
layers, with windows being assigned a particular depth within the
order. For any given window with depth D, it will be above all windows
with depth less than D, and below all windows with depth greater than
D. It may be above or below any other windows with depth D.

   The `depth' property of each window is used to store this depth. A
depth of zero is "normal", with negative depths stacked below, and
positive depths stacked above this normal level.

 -- Function: stacking-order-by-depth depth
     Similar to `stacking-order', but only returns windows with depth
     DEPTH.

 -- Function: window-depth window
     Returns the depth of WINDOW.

 -- Function: set-window-depth window depth
     Sets the stacking depth of WINDOW to DEPTH, then restacks the
     windows to reflect this change.

   Functions to change stacking order.

 -- Function: window-on-top-p window
     Returns `t' if WINDOW is at the top of its stacking depth.

 -- Function: stack-window-below below above
     Change stacking order of window BELOW so that it is immediately
     below window ABOVE. This function alone does not raise / lower
     windows.

 -- Function: stack-window-above above below
     Change stacking order of window ABOVE so that it is immediately
     above window BELOW. This function alone does not raise / lower
     windows.

 -- Macro: save-stacking-order &rest forms
     Evaluate FORMS in an implicit `progn', then restore the original
     window stacking order, returning the value of the `progn'.

 -- Function: restack-window w
     Assuming that the current stacking order is in a consistent state
     except, possibly, for the position of window W, restore the
     consistent state including window W. This is achieved by raising
     or lowering window W as appropriate.


File: sawfish.info,  Node: Stacking Visibility,  Next: Raising and Lowering Windows,  Prev: Stacking Order,  Up: Window Stacking

8.9.2 Stacking Visibility
-------------------------

There're functions which tell how the window is covered by others.

 -- Function: stacking-visibility window
     Returns `unobscured' if `window' is unobscured, `fully-obscured'
     if one or more windows completely obscure `window', or
     `partially-obscured' if one or more window partially obscure
     `window'.

     Deciding between fully and partially obscured can be expensive.  If
     `window-obscured' satisfies your needs, use that in preference to
     `stacking-visibility'.

 -- Function: window-obscured window
     Returns `nil' if `window' is unobscured, `t' if `window' is
     completely obscured by exactly one other window, or a list of
     windows that partially obscure `window'.

     If a list of partially obscuring windows is returned, taken
     together they may or may not fully obscure `window'.

 -- Obsolete Function: window-visibility window
     Returns a symbol defining the current visibility of WINDOW.
     Possible returned symbols are `fully-obscured',
     `partially-obscured' or `unobscured'.

     `window-visibility' is deprecated.  It is unreliable when using
     the Composite extension, as every window is reported unobscured.
     Use `window-obscured' and `stacking-visibility' instead.


File: sawfish.info,  Node: Raising and Lowering Windows,  Prev: Stacking Visibility,  Up: Window Stacking

8.9.3 Raising and Lowering Windows
----------------------------------

Over time, Sawfish has accumulated several subtle variations of
functions for raising and lowering windows.  One set of functions
operates on single windows. Notice how the function name and command
name for each pair differs slightly.

 -- Function: lower-window window
 -- Command: lower-single-window window
     Lower WINDOW to the bottom of its stacking depth.

 -- Function: raise-window window
 -- Command: raise-single-window window
     Raise WINDOW to the top of its stacking depth.

 -- Function: raise-lower-window window
 -- Command: raise-lower-single-window window
     If WINDOW is the highest in its stacking level, lower it to the
     bottom of this level, otherwise raise it to the top of its level.

 -- Function: x-raise-window win ref
 -- Function: x-lower-window win ref
     Raise / lower window WIN so that it is above / below window REF.
     If REF is undefined, WIN is put at the top / bottom of the
     stacking order.

   Another set of functions supports operating on multiple windows
simultaneously. You have to import `sawfish.wm.util.stacking' to use
them.  Again, the function name and command name for each pair is
different.

 -- Function: lower-window* window
 -- Command: lower-window window
     Lower WINDOW and possibly associated windows to the bottom of
     their stacking depths.

 -- Function: raise-window* window
 -- Command: raise-window window
     Raise WINDOW and possibly associated windows to the top of their
     stacking depth.

 -- Function: raise-lower-window* window
 -- Command: raise-lower-window window
     If WINDOW is the highest in its stacking level, lower it and
     possibly associated windows to the bottom of their level, otherwise
     raise them to the top of their level.

 -- Customizable: user-raise-type
     This user option indicates which windows the `lower-window*',
     `raise-window*' and `raise-lower-window*' functions affect.  This
     variable can be

    `none'
          Only the specific argument window is affected.

    `transients'
          The specific argument window and all of its transients are
          affected.  This is the default.

    `group'
          The specific argument window and all windows in its group are
          affected.

   Sawfish has more general operations that raising a window to the top
or lowering it to the bottom.  It can place a window relative to one or
more other managed windows.

 -- Function: raise-windows w order
 -- Function: lower-windows w order
 -- Function: raise-lower-windows w order
     Raise (or lower) all windows in ORDER, such that items earlier in
     the list are higher (or lower) than later items.  The window W is
     special, always being the highest or lowest window, even if appears
     in the middle of ORDER.

     For `raise-lower-windows', if W would be raised or lowered, then
     all the other windows are also raised or lowered.

   There are also functions (and associated commands) to change a
window's depth.

 -- Function: lower-window-depth window
 -- Command: lower-window-depth window
     Decrement the stacking depth of WINDOW.

 -- Function: raise-window-depth window
 -- Command: raise-window-depth window
     Increment the stacking depth of WINDOW.

   Sawfish provides special support for "click-to-focus" mode, where
you may or may not want to raise the window or pass the click to the
underlying application.

 -- Function: raise-and-pass-through-click w
     Raise the window that received the current event with
     `maybe-raise-window'.  Then replay any pointer events that invoked
     the command.

 -- Function: raise-and-pass-through-click-if-focused w
     Raise the window that received the current event (if it's focused)
     with `maybe-raise-window'.  Then replay any pointer events that
     invoked the command.

 -- Function: raise-or-pass-through-click w
     If the window that received the current event is not on top, raise
     it with `maybe-raise-window'.  Otherwise replay any pointer events
     that invoked the command, sending them to the window.

   When the above commands are called interactively, Sawfish will try to
invoke them on the window that received the current event.  Failing
that, Sawfish will invoke them on the currently focused window.


File: sawfish.info,  Node: Moving and Resizing Windows,  Next: Showing and Hiding Windows,  Prev: Window Stacking,  Up: Windows

8.10 Moving and Resizing Windows
================================

As noted above (*note Window Attributes::), the `window-dimensions' and
`window-position' functions return the current configuration of a
window.

 -- Function: move-window-to window x y
     Move the top-left corner of the window frame of WINDOW to (X, Y).

 -- Function: resize-window-to window width height
     Set the dimensions of the client window associated with object
     WINDOW to (WIDTH, HEIGHT).

 -- Function: move-resize-window-to window x y width height
     Move the top-left corner of the window frame of WINDOW to (X, Y),
     and set the dimensions of the frame to (WIDTH, HEIGHT).

 -- Function: resize-window-with-hints window cols rows #!optional hints
 -- Function: resize-window-with-hints* window width height #!optional
          hints
     Resize the window WINDOW respecting the hints (see below).  For
     the first function, the dimensions are COLS columns and ROWS rows.
     For the second function, the dimensions are WIDTH pixels and
     HEIGHT pixels.

     The HINTS parameters is either the size hints alist to use, or
     `nil' in which case the `window-size-hints' function is used to
     retrieve the window's hints.

     Hints can specify minimum or maximum value of each dimension, and
     also increase step, as far as these two functions are concerned.

 -- Function: window-size-hints window
     Return an alist defining the size-hints structure specified by the
     client window associated with WINDOW. Possible keys in the alist
     are `min-height', `max-height', `min-width', `max-width',
     `height-inc', `width-inc', `min-aspect', `max-aspect',
     `base-height', `base-width', `user-position', `program-position',
     `user-size', `program-size', `window-gravity', `border-size'.

   Usually, however, it is left to the user to configure windows. The
following functions may be called interactively: their sole argument is
then either the window that received the current event or the currently
focused window.

   Sawfish honors the `min-aspect' and `max-aspect' window hints when
interactively resizing a window.

 -- Function: move-window-interactively window
 -- Command: move-window-interactively window
     Move WINDOW interactively using the mouse. Releasing any mouse
     button places the window at its current position.

 -- Function: resize-window-interactively window
 -- Command: resize-window-interactively window
     Resize WINDOW interactively using the mouse. Releasing any mouse
     button places the window at its current position.

     Note that this function selects the edge or edges of the window to
     move from the current position of the mouse when the resizing
     begins. The window is divided into a three-by-three grid; the
     rectangle containing the mouse pointer gives the direction to
     resize in. If the pointer is in the central rectangle the bottom
     and right edges are moved.

 -- Command: resize-window-to-preset-size
 -- Command: resize-window-to-preset-height
 -- Command: resize-window-to-preset-width
     For these commands, first you specify a window dimension(s) in the
     configurator. The focused window will be resized to that preset
     size on invocation.

 -- Command: resize-window-prompt window
     You're prompted to enter the new window size, and the window will
     be resized.

 -- Function: move-selected-window
 -- Command: move-selected-window
     Wait for the user to select a window using the mouse, then
     interactively move that window.

 -- Function: resize-selected-window
 -- Command: resize-selected-window
     Wait for the user to select a window with the mouse, then
     interactively resize that window.

 -- Command: double-window-size window
 -- Command: halve-window-size window
     Double / halve the size of WINDOW in both direction, i.e.  the
     area will be 4 or 1/4 times.

   Sawfish supports increasing the windows size until it touches another
window. This is called "grow". "Shrink" achieves the opposite, i.e. it
decreases the windows size, until it does no longer overlap any other
window. More precisely, the grow can be done repeatedly, each time
until the edge meets another edge, and shrink is done so that it
overlaps with one less window.

 -- Function: grow-window-up window #!optional arg
 -- Function: grow-window-down window #!optional arg
 -- Function: grow-window-left window #!optional arg
 -- Function: grow-window-right window #!optional arg
     Grows WINDOW upwards / downwards / left / right until it touches
     another window.  If that edge is beyond the screen edge, it is
     brought back in. With a universal prefix ARG, maximize in that
     direction instead. With a numeric prefix ARG, grow by that many
     increments specified by window or pixels instead.

     There are commands, too, with the same name.

 -- Function: shrink-window-up window
 -- Function: shrink-window-down window
 -- Function: shrink-window-left window
 -- Function: shrink-window-right window
     Shrinks WINDOW by moving one edge upwards / downwards / left /
     right until it intersects with one window less than before. (So,
     in `shrink-window-up' for example, the lower edge is moved.)

     Window won't be made smaller than the minimum size, or
     `shrink-window-minimum-size'. More precisely, size truncation may
     make the window smaller than these values.

     There are commands, too, with the same name.

   Moving counterparts, instead of resizing of "grow" and "shrink", are
"pack" and "yank". So, "pack" moves until the window touches another,
and "yank" moves until the overlap reduces.

 -- Function: pack-window-up window #!optional arg
 -- Function: pack-window-down #!optional arg
 -- Function: pack-window-left window #!optional arg
 -- Function: pack-window-right window #!optional arg
     Moves WINDOW upwards / downwards / left /right until it touches
     another window.  If that edge is beyond the screen edge, it is
     moved back in.  With a universal prefix ARG, move in that direction
     maximally instead.  With a numeric prefix ARG, move by that many
     pixels instead.

     There are commands, too, with the same name.

 -- Function: yank-window-up window
 -- Function: yank-window-down window
 -- Function: yank-window-left window
 -- Function: yank-window-right window
     Yanks WINDOW upwards / downwards / left / right until it overlaps
     with one less window than before.

     There are commands, too, with the same name.

   Grow, pack, shrink and yank behavior can be customized through the
following variables:

 -- Variable: grow-is-maximize
     Whether growing is considered to be maximization.  The default
     value is `t'.

 -- Variable: pack-warp-pointer
     Whether and how to move the pointer, either `always' `maybe' or
     `never'. The default value is `maybe'

     `maybe' means that the pointer is moved along with the window, if
     the pointer was within the window area before packing. `always'
     warps the pointer to the center of the window if it isn't already
     in the window, then does like `maybe'. `never' means not to warp
     the pointer.

 -- Variable: grow-pack-bump-obscured
     Whether to bump into fully obscured windows.  The default value is
     `nil'.

 -- Variable: grow-pack-bump-other-depth
     Whether to bump into windows on a different depth, either `always'
     `maybe' or `never'. The default value is `always'.

     `maybe' means only `avoided' windows (*note Avoided Windows::).

 -- Variable: grow-pack-bump-ignored
     Whether to bump into ignored windows.  The default value is `t'.

 -- Variable: shrink-window-minimum-size
     The minimum height or width to which a window may be shrunk.  The
     default value is `10'.

 -- Variable: yank-window-minimum-visible
     The minimum amount of window left visible, if yanked over the
     screen edge. The default value is `10'.

 -- Function: move-window-center window
 -- Command: move-window-center window
     Place WINDOW in the middle of the screen (frame-size is respected
     while calculating position)

   The interactive move and resize behavior can be customized through
the following variables:

 -- Variable: move-outline-mode
     A symbol defining the visual method of interactively moving
     windows.  Current options include `box' for a wire-frame grid, and
     `opaque' for full redisplay.

 -- Variable: resize-outline-mode
     A symbol defining the visual method of interactively resizing
     windows.  Current options include `box' for a wire-frame grid, and
     `opaque' for full redisplay.

 -- Variable: move-show-position
     When non-nil, the current window position is shown in the center
     of the screen.

 -- Variable: resize-show-position
     When non-nil, the window size is shown in the center of the screen.

   When you move a window and it comes close to another, sawfish adjusts
its position so that its edge fits to the other, or "snaps". (It may be
dubbed as "interactive tiling".) Snapping also takes place against
screen boundary.

 -- Variable: move-snap-epsilon
     The distance in pixels before snapping together two edges. The
     bigger the value, the more adhesive windows get.

   Windows have a "gravity" property, which affect how they are placed
in particular positions.

 -- Function: window-gravity window #!optional hints
     Returns the gravity of window.  The order of precedence is Sawfish
     `gravity' window property, explicit HINTS argument, X window size
     hints.  The default gravity when nothing else is specified is
     `north-west' (specified by ICCCM).


File: sawfish.info,  Node: Showing and Hiding Windows,  Next: Destroying Windows,  Prev: Moving and Resizing Windows,  Up: Windows

8.11 Showing and Hiding Windows
===============================

Sawfish provides two low-level functions for (un)withdrawing client
windows from the display. These are used to implement both workspaces
(*note Workspaces::) and iconification (*note Iconifying Windows::).

 -- Function: hide-window window
     Prevent object WINDOW from being displayed.

     This function is low-level and mainly for internal use. You should
     probably use `iconify-window'. (*note Iconifying Windows::)

 -- Function: show-window window
     Ensure that WINDOW is visible, (provided that it has been mapped,
     and is within the screen boundary).

     This function is low-level and mainly for internal use. For
     interactive use, you should probably use `display-window'. (*note
     Activating Window::)

 -- Function: window-visible-p window
     Returns `t' if object WINDOW has not been hidden by the
     `hide-window' function.


File: sawfish.info,  Node: Destroying Windows,  Next: Shading Windows,  Prev: Showing and Hiding Windows,  Up: Windows

8.12 Destroying Windows
=======================

There are several methods through which X11 client windows may be
removed from the display. These differ in the level "politeness" they
show the window and its owning application.

 -- Function: delete-window window
 -- Command: delete-window window
     Delete WINDOW, i.e. send a `WM_DELETE_WINDOW' client-message if
     possible, or just kill the associated X11 client if not.  WINDOW
     may be a window object or a numeric window id.

 -- Function: delete-window-safely window
 -- Command: delete-window-safely window
     If the application owning WINDOW supports it, send a
     `WM_DELETE_WINDOW' message to WINDOW. Otherwise just emit a beep.

 -- Function: destroy-window window
 -- Command: destroy-window window
     Destroy WINDOW without giving the owning application any warning.
     WINDOW may be a window object or a numeric window id.

 -- Function: x-kill-client window
 -- Command: kill-client window
     Force a close down of the X11 client that created the window
     specified by WINDOW (a window object, or numeric id).

   When a managed window is destroyed, the `destroy-notify-hook' will
subsequently be invoked (*note Standard Hooks::).


File: sawfish.info,  Node: Shading Windows,  Next: Maximizing Windows,  Prev: Destroying Windows,  Up: Windows

8.13 Shading Windows
====================

Many window managers allow a window to be "shaded"; when in this state
only the title bar of the window is visible.

 -- Function: window-shaded-p window
     Returns true when WINDOW is shaded, false otherwise.

 -- Function: shade-window window
 -- Command: shade-window window
     Arrange for only the title bar of WINDOW to be visible.

 -- Function: unshade-window window
 -- Command: unshade-window window
     If the window is shaded, restore it to it's original state.

 -- Function: toggle-window-shade window
 -- Command: toggle-window-shaded window
     Toggle the shaded state of the window.

 -- Variable: raise-windows-when-unshaded nil
     When true, raise windows when they are unshaded.  Defaults to
     false.

   The `shaded' property of a window is set to `t' when the window is
shaded. If a window is added with this property already set, then the
window will appear in its shaded state.


File: sawfish.info,  Node: Maximizing Windows,  Next: Cycling Between Windows,  Prev: Shading Windows,  Up: Windows

8.14 Maximizing Windows
=======================

The dimensions of a window may be temporarily "maximized", stretching
as far as possible within the screen in one or two dimensions.

   If you have multiple monitors, maximization is done within a head,
unless stated explicitly that it's xinerama.

 -- Function: window-maximizable-p window #!optional direcion hints
     Return `t' when WINDOW is maximizable. The window property
     NEVER-MAXIMIZE prevents maximization.

     If defined, DIRECTION is a symbol, either `vertical' or
     `horizontal', and maximization will only occur for that direction.

     The optional argument HINTS overrides the window's hints.

 -- Function: window-maximized-p window
     Return `t' when WINDOW is maximized in any direction.

 -- Function: window-maximized-vertically-p window
     Return `t' when WINDOW is vertically maximized, regardless if it's
     horizontally maximized or not.

 -- Function: window-maximized-horizontally-p window
     Return `t' when WINDOW is horizontally maximized, regardless if
     it's vertically maximized or not.

* Menu:

* Basic Maximizations::
* Maximizing Without Overlap::
* Maximizing Without Borders::
* Unmaximizing::


File: sawfish.info,  Node: Basic Maximizations,  Next: Maximizing Without Overlap,  Prev: Maximizing Windows,  Up: Maximizing Windows

8.14.1 Basic Maximizations
--------------------------

Ordinary maximization occurs on the current screen, and possibly
rounding down to fit character sizes.

 -- Function: maximize-window window #!optional direction only-1d
 -- Command: maximize-window window
     Maximize both dimensions of WINDOW on the screen.

     If defined, DIRECTION is a symbol, either `vertical' or
     `horizontal', and maximization will only occur for that direction.

     The optional argument ONLY-1D is for internal use. Don't use it.

 -- Function: maximize-window-vertically window
 -- Command: maximize-window-vertically window
 -- Function: maximize-window-horizontally window
 -- Command: maximize-window-horizontally Windows
     Maximize the vertical or horizontal dimension of WINDOW in the
     screen.

 -- Function: maximize-window-toggle window #!optional direction
 -- Command: maximize-window-toggle window
     Toggle the state of WINDOW between maximized and unmaximized in
     the screen.

     If defined, DIRECTION is a symbol, either `vertical' or
     `horizontal', and maximization will only occur for that direction.

 -- Function: maximize-window-vertically-toggle window
 -- Command: maximize-window-vertically-toggle window
     Toggle the state of WINDOW between vertically maximized and
     unmaximized in the screen.

 -- Function: maximize-window-horizontally-toggle window
 -- Command: maximize-window-horizontally-toggle window
     Toggle the state of WINDOW between horizontally maximized and
     unmaximized in the screen.

 -- Customizable: move-lock-when-maximized
     When true (the default), Sawfish will not allow the user to
     manually resize maximized windows.  It will also prevent the user
     from moving the windows along their maximized axes.

     For example, a vertically maximized window is vertically locked,
     so a user can slide it left and right, but cannot move it up or
     down.

     If you set this to `nil' and resize a maximized window, then you
     can't unmaximize it any more.

 -- Function: window-locked-vertically-p window
     Return `t' when WINDOW is vertically locked.

 -- Function: frame-part-movable-p window part
     Return `t' if the PART of WINDOW can be moved.

     PART is one of the symbols: `top-border', `bottom-border',
     `left-border', `right-border', `top-left-corner',
     `top-right-corner', `bottom-left-corner', `bottom-right-corner', or
     `title'

 -- Variable: maximize-raises
     When true (the default), maximizing a window raises it as well.

 -- Variable: maximize-always-expands
     In general, if a window's dimension is larger than the screen size,
     maximizing that dimension can actually shrink it to fit into the
     screen.  When this variable is true (default false), maximizing a
     window's dimension will never shrink it.


File: sawfish.info,  Node: Maximizing Without Overlap,  Next: Maximizing Without Borders,  Prev: Basic Maximizations,  Up: Maximizing Windows

8.14.2 Maximizing Without Overlap
---------------------------------

It is possible to maximize a window where it gets only large enough not
to overlap with other windows.

 -- Variable: maximize-avoid-avoided
     When true (the default), maximized window does not cover avoided
     windows. (*note Avoided Windows::)

   The "fill" category of maximizing commands provides a convenient way
to maximize without overlap to any other windows, except "ignored" ones.
(*note Ignored Windows::)

   In addition, they don't shrink the window even if it is already
bigger than the screen size.

 -- Function: maximize-fill-window window #!optional direction
 -- Command: maximize-fill-window window
     Maximize both dimensions of WINDOW without overlapping other
     windows.

     If defined, DIRECTION is a symbol, either `vertical' or
     `horizontal', and maximization will only occur for that direction.

 -- Function: maximize-fill-window-vertically window
 -- Command: maximize-fill-window-vertically window
     Maximize the vertical dimension of WINDOW in the screen without
     overlapping other windows.

 -- Function: maximize-fill-window-horizontally window
 -- Command: maximize-fill-window-horizontally window
     Maximize the horizontal dimension of WINDOW in the screen without
     overlapping other windows.

 -- Function: maximize-fill-window-toggle window
 -- Command: maximize-fill-window-toggle window
     Toggle the state of WINDOW between maximized and unmaximized in
     the screen without overlapping other windows.

     If defined, DIRECTION is a symbol, either `vertical' or
     `horizontal', and maximization will only occur for that direction.

 -- Function: maximize-fill-window-vertically-toggle window
 -- Command: maximize-fill-window-vertically-toggle window
     Toggle the state of WINDOW between vertically maximized and
     unmaximized in the screen without overlapping other windows.

 -- Function: maximize-fill-window-horizontally-toggle window
 -- Command: maximize-fill-window-horizontally-toggle window
     Toggle the state of WINDOW between horizontally maximized and
     unmaximized in the screen without overlapping other windows.

 -- Variable: maximize-ignore-when-filling
     For "filling" maximization, "ignored" windows are ignored when true
     (the default). (*note Ignored Windows::)


File: sawfish.info,  Node: Maximizing Without Borders,  Next: Unmaximizing,  Prev: Maximizing Without Overlap,  Up: Maximizing Windows

8.14.3 Maximizing Without Borders
---------------------------------

The "fullscreen" and "fullxinerama" categories of maximizing commands
maximize the window to some extent and remove all the window's
decorations.  If necessary, Sawfish will pad the bottom and right
window edges to make the window fill the complete extent.  (This is
usually required for terminal windows, for example.)

   The "fullscreen" category maximizes the window to the current screen.

 -- Function: maximize-window-fullscreen window state
 -- Command: maximize-window-fullscreen window
     Maximize both dimensions of WINDOW on the screen, removing window
     decorations and making the window edges flush with the screen
     sides.

     If STATE nil, it unmaximizes. Else, it maximizes. If called as a
     command, it always maximizes.

 -- Function: maximize-window-fullscreen-toggle window
 -- Command: maximize-window-fullscreen-toggle window
     Toggle the state of WINDOW between maximized and unmaximized in
     the screen, removing window decorations and making the window edges
     flush with the screen sides.

   The "fullxinerama" category maximizes the window to the entire
Xinerama display.

 -- Function: maximize-window-fullxinerama window state
 -- Command: maximize-window-fullxinerama window
     Maximize both dimensions of WINDOW across all Xinerama screens,
     removing window decorations and making the window edges flush with
     the screen sides.

     If STATE nil, it unmaximizes. Else, it maximizes. If called as a
     command, it always maximizes.

 -- Function: maximize-window-fullxinerama-toggle window
 -- Command: maximize-window-fullxinerama-toggle window
     Toggle the state of WINDOW between maximized and unmaximized
     across all Xinerama screeens, removing window decorations and
     making the window edges flush with the screen sides.


File: sawfish.info,  Node: Unmaximizing,  Prev: Maximizing Without Borders,  Up: Maximizing Windows

8.14.4 Unmaximizing
-------------------

One command restores windows from all the different types of
maximization.

 -- Function: unmaximize-window window #!optional direction
 -- Command: unmaximize-window window
     Restore the position and dimensions of WINDOW to their original,
     unmaximized, states.

     If the window is maximized for example vertically but not
     horizontally, then only vertical position and dimension are
     restored.

     If defined, DIRECTION is a symbol, either `vertical' or
     `horizontal', and unmaximization will only occur for that
     direction.

 -- Function: window-unmaximized-position window
     Returns a cons-cell `(X . Y)' indicating the position that the
     `window' would unmaximize to.

     If the window is maximized for example vertically but not
     horizontally, then Y is the y coordinate before maximization, but
     X is the window's current x coordinate.

 -- Function: window-unmaximized-dimensions window
     Returns a cons-cell `(W . H)' indicating the dimensions that
     `window' would unmaximize to.

     If the window is maximized for example vertically but not
     horizontally, then Y is the height before maximization, but X is
     the window's current width.

 -- Function: maximize-discard window #!optional direction
     Don't treat window as maximized any more, keeping the size and the
     position. You'll be able to move and resize, but won't be able to
     unmaximize.

     If the optional argument `direction' is `vertical' or `horizontal',
     then only that direction is unmaximized.

     When WINDOW is not maximized, nothing happens.


File: sawfish.info,  Node: Cycling Between Windows,  Next: Window Rules by Matching,  Prev: Maximizing Windows,  Up: Windows

8.15 Cycling Between Windows
============================

Sawfish provides two categories of commands for cycling between
windows.  The first category cycles between windows in an order that is
essentially fixed.  The second category cycles between windows in a
dynamic order.

* Menu:

* Fixed Window Cycles::
* Dynamic Window Cycles::


File: sawfish.info,  Node: Fixed Window Cycles,  Next: Dynamic Window Cycles,  Prev: Cycling Between Windows,  Up: Cycling Between Windows

8.15.1 Fixed Window Cycles
--------------------------

These commands organize the set of mangaged windows into loops.  A loop
may consist of all windows in a workspace, or it may consist of all
windows anywhere.  The positions of windows in this loop do not change,
except when a new window is managed or unmanaged.

 -- Function: next-workspace-window
 -- Function: previous-workspace-window
     Switch focus to the "next" or "previous" window in the current
     workspace.

 -- Function: next-window
 -- Function: previous-window
     Switch focus to the "next" or "previous" window in this workspace.
     If this function reaches the "end" of the windows in this
     workspace, it switches to the next workspace and displays the
     first window there.


File: sawfish.info,  Node: Dynamic Window Cycles,  Prev: Fixed Window Cycles,  Up: Cycling Between Windows

8.15.2 Dynamic Window Cycles
----------------------------

These commands implement something much close to Microsoft Windows'
<Alt-TAB> mechanism, working with a stack of recently used windows.

 -- Function: cycle-windows
 -- Function: cycle-windows-backwards
     Cycle through all cycleable windows.

 -- Function: cycle-group
 -- Function: cycle-group-backwards
     Cycle through all windows inside the same group. This is somewhat
     comparable to the <Control-TAB> behavior of Windows OS.

 -- Function: cycle-among-groups
 -- Function: cycle-among-groups-backwards
     Cycle through windows at the top of each group.

 -- Function: cycle-prefix
 -- Function: cycle-prefix-backwards
     Cycle through all windows whose titles match that of the initial
     window (up to, but not including, the first colon).

 -- Function: cycle-class
 -- Function: cycle-class-backwards
     Cycle through all windows whose classes match that of the initial
     window.

 -- Function: cycle-dock
 -- Function: cycle-dock-backwards
     Cycle through all windows in the dock, even those with the
     `cycle-skip' property.

   Each of these cycling commands may include windows that are not
visible on-screen.

 -- Variable: cycle-include-iconified
     If true, Sawfish includes iconified windows when cycling.
     Defaults to true.

 -- Variable: cycle-all-workspaces
     If true, Sawfish includes windows on all workspaces when cycling.
     Defaults to false.

 -- Variable: cycle-all-viewports
     If true, Sawfish includes windows on all viewports when cycling.
     Defaults to false.

   It is possible to configure the cycling to get more feedback during
the process.

 -- Variable: cycle-show-window-names
     If true, Sawfish displays window names and icons while cycling
     through windows.  Defaults to true.

 -- Variable: cycle-raise-windows t
     If true, Sawfish raises windows while they're temporarily selected
     during cycling, and invokes `warp-pointer-if-necessary'.  Defaults
     to true.

   It is also possible for you to define your own stacking cycle
commands, or even to alter the window stack to suit your tastes.

 -- Function: define-cycle-command name body &rest rest
     Create a command that will not cause the current cycle operation
     to abort before execution.

     All arguments are passed to define-command.

 -- Function: define-cycle-command-pair forward-name reverse-name
          selector &rest rest
     Create a pair of commands for cycling through windows. The command
     named FORWARD-NAME cycles forwards, while the command named
     REVERSE-NAME cycles backwards.

     SELECTOR is called when initializing the cycle environment, it
     should return the list of windows to cycle through, or the symbol
     `t' to denote all cyclable windows.

     Any extra arguments are passed to each call to define-command.

 -- Function: window-order #!optional workspace allow-iconified
          all-viewports
     Return managed windows in most-recently used order.

     If WORKSPACE is non-nil, then only managed windows in that
     workspace will be returned.

     If ALLOW-ICONIFIED is non-nil, then iconified windows will be
     returned instead of ignored.

     If ALL-VIEWPORTS is non-nil, then windows in all viewports will be
     returned, instead of just the current viewport.

 -- Function: window-order-push w
     Push window W onto the top of the cycle stack.

 -- Function: window-order-pop w
     Remove window W from the cycle stack.

 -- Function: window-order-most-recent &key windows
     Return the most-recently focused window in the current workspace.
     If the WINDOWS argument is given it should be a list of windows, in
     this case the function will restrict its search to the elements of
     this list.

 -- Function: window-order-focus-most-recent
     Switch input focus to the most-recently focused window in the
     current workspace.


File: sawfish.info,  Node: Window Rules by Matching,  Next: Animating Windows,  Prev: Cycling Between Windows,  Up: Windows

8.16 Window Rules by Matching
=============================

Sawfish can trigger actions particular to each window. More precisely,
if the window's properties match to the user set rule, then it is
executed when the window appears. Check is done in
`before-add-window-hook'. (*note Standard Hooks::)

   These rules can easily be set by configurater GUI, but there're
functions to manipulate them. They're defined in
`sawfish.wm.ext.match-window'.

 -- Function: add-window-matcher rules actions
     Let us see an example first:

          (add-window-matcher '((WM_NAME . "^root$")
                                (WM_CLASS . "^XTerm/xterm$"))
                              '((ignore-program-position . t)
                                (maximize . vertical)))

     RULES is an list where each element is a `(property . regex)' or a
     `(function . arguments)' cons.  In the first form, specified
     property is matched against the regular expression.  Allowed
     properties are any of `WM_NAME', `WM_CLASS', `WM_ICON_NAME',
     `WM_WINDOW_ROLE', `WM_CLIENT_MACHINE', `WM_COMMAND', and
     `WM_LOCALE_NAME'.  In the second form, specified function is
     called with window as first argument and list of arguments
     specified in the cons as remaining arguments.  Windows are
     selected if all of these rules match.

     ACTIONS is an alist. For possible keys and values, see
     `lisp/sawfish/wm/ext/match-window.jl'.

     Check for invalid arguments are not done.

 -- Function: remove-window-matcher rules props
     Opposite of `add-window-matcher', but unlike it, PROPS are list of
     properties. Example:

          (remove-window-matcher '((WM_NAME . "^root$"))
                                 '(place-mode ignore-program-position))

   The best place to use `add-window-matcher' is in `~/.sawfish/rc'.
It's because rules modified by these commands are not necessarily
saved, depending on how you run the configurator.

   The rules are stored in variable `match-window-profile'. Use the
above functions to modify its value. It is not recommended to directly
manipulate it.


File: sawfish.info,  Node: Animating Windows,  Next: Iconifying Windows,  Prev: Window Rules by Matching,  Up: Windows

8.17 Animating Windows
======================

Sawfish provides certain window animation capabilities.  They have been
described as "lame", so they are off by default.

 -- Variable: default-window-animator
     The animation mode when an window is iconified. The default is
     `none'.

     You can set the animation mode for each window from the
     configurator "Window Rules", or via window property. (*note
     Standard Properties::)

   Here are listed functions to define and invoke animator.

 -- Function: define-window-animator name fun
     Define a window animator called NAME (a symbol) that is managed by
     function FUN. FUN is called as `(fun window op [action])' when it
     should change the state of an animation sequence.  OP may be one
     of the symbols `start', `stop'.

 -- Function: autoload-window-animator name struct
     Construct an autoloader for window animator NAME from structure
     STRUCT.

 -- Function: run-window-animator window action
     Invoke an animation for action ACTION on WINDOW.  ACTION may be
     one of the symbols `start', `stop'.

 -- Function: record-window-animator window animator
     Note that WINDOW currently has an animation running, being
     controlled by animator function ANIMATOR.

