This lists the user-visible changes made to Sawfish, and which releases
they occurred between. For more detailed information see the
ChangeLog files in the Sawfish source tree.
cycle-command-backwards, e.g.
cycle-windows-backwards (Merlin, me)
window-urgent-p and
window-state-change-hook is called with urgency state
when it changes
shade-hover mode (adapted from Eli
Barzilay)
window-list-skip. Unified with GNOME
skip-winlist hint
:tooltip tag
dimensions property in window matching was called
size by mistake
sp-cost: functions from
the sawfish.wm.placement.smart module
disable-auto-raise correctly
move-window-foo commands
(Yoshiki Hayashi)
WM_TAKE_FOCUS message, only focus the window
if its `Input' hint is set
sawfish.wm.gnome.integration and
sawfish-themer (Christian Marillat)
0.13
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
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
add-window-menu-toggle to add items to the
Toggle sub-menu of each window
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
sawfish.wm.util.x plugin
(Ryan Pavlik)
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)
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
scale-image, composite-images, and
crop-image.
maximize-avoid-avoided (Jonas Linde)
sawfish.wm.ext.tooltips module:
display-tooltip, remove-tooltip
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.
get-visible-window-edges function to
use proper keyword parameters, and added some new keywords
help:about and gnome-about. Added a
sawfish-about script to implement the first of these. Added
associate menu items to the `Help' menu
cycle-skip, defines whether the window
is included when cycling the focused window. (Dave Dribin, me)
.sawfishrc prevent customization
settings being loaded
throw out the top of the program by
mistake
find-head function, to allow Xinerama support to
work
synthesize-event to scan the window tree for a child
window accepting button events (E. Jay Berkenbilt)
image-set and related functions will add an alpha channel
to the image when necessary (when using gdk-pixbuf)
sawfish.wm.ext.match-window
quote-menu-item function to help with this)
set method of the icon widget
hidden attribute, ignore it
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
:require keyword in defcustom always causing
the module to be loaded, not just when the option is non-nil
quote-event command now works with applications that
ignore synthetic events (adapted from code by Timo Korvola)
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)
variable-customized-p; use this to avoid
redefining user-modified options
:type (optional color) weren't being converted when passed
between the wm and the configurator, leading to reader errors
A side-effect of this is that updated custom files will not be compatible with previous versions of the wm (though old custom files will work with new versions)
map-windows and filter-windows
default-bevel-percent was being ignored)
move-window-to-viewport command to correct for
1... indexing
activate-viewport-column,
activate-viewport-row
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
WM_TRANSIENT_FOR property to the
root window denotes that the window is a transient for the whole group
image-ref,
image-set, image-fill, image-map. New color
accessor function color-rgb-8. New function
root-window-id
sawfish-ui: optionally use some GNOME
widgets, more lisp widget types, some bug fixes
command-sequence. Allows individual bindings
to invoke a sequence of commands
iconify-group-mode and uniconify-group-mode
replace iconify-whole-group and uniconify-whole-group.
New commands iconify-transient-group, and
uniconify-transient-group
:type* key to defcustom, like :type,
but value is left unquoted
WM_NORMAL_HINTS (was using base-size
instead of min-size in places)
window-history module won't resize a window to a size that
violates its size constraints
run-shell-command command)
match-window options). Also, extra widget types and containers
may be added as extra Lisp modules
Try
button to be pressed
nil
scale-foreground. The
cursor attribute may now be a function
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
window-history options to placement group.
Fixed some more bugs and sub-optimal default option values
SKIP_FOCUS window hint sets never-focus
property on window, as well as the ignored property
--visual=TYPE and
--depth=DEPTH. These tell the window manager to use a
different visual than the default
window-history module behave more sanely (don't
save iconified or shaded state; include window name when generating
keys for transient windows)
beos-window-module the standard window menu (require
old-window-menu to get the original version). Also made this
display the windows' class names
window-history--automatically saves window
attributes when they are explicitly set by the user, then copies these
attributes to windows with the same WM_CLASS as they are
created. This is loaded automatically if you have no .sawfishrc
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.)
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
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)
edge-flip-warp-pointer, whether or not to warp
the pointer after edge-flipping (Paul Warren)
display-window:uniconify-to-current-workspace,
controls whether windows uniconified by display-window should be
moved to the current workspace (John N S Gill)
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
Help item to the root menu
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)
LANG=de_DE look for both de_DE and
de translations)
enter-root and leave-root
raise-groups-on-focus option, it caused unstable
window flickering in certain cases
sawmill to sawfish; all
user-visible binaries have been renamed appropriately, the old programs
will still work for now...
current-head,
current-head-dimensions, current-head-offset. Some
placement modes should handle multiple heads sensibly, as should window
maximization and edge snapping.
map-window-properties (me),
window-icon-image (Bruce Miller)
raise-group and lower-group to
preserve the stacking of the group, then change the selected window.
Added new command raise-lower-group
raise-groups-on-focus
below-client frame-part attribute
workspace-menu to add the focus-marking asterisk
(John N S Gill)
WM_STATE property is set each time a window is
mapped, not just the first time
selection, adds functions
x-selection-active-p and x-get-selection for retrieving X
selections (Mark Probst)
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)
xterm-program to decide which terminal program to
use (James Antill)
toggle-window-iconified (Jens-Ulrik Petersen)
raise-windows-when-unshaded
ko and zh languages need FontSets
random
mode; also increased sp-avoided-windows-weight by an order of
magnitude (Dan Winship)
get-cursor to use the correct background color when
creating cursors from vectors (Alexander Barinov)
get-font to set `descent' property correctly
x plugin, also only
support this if configure finds the correct header files
synthesize-event to generate correct relative
pointer positions
cp to install GNOME desktop files
input-focus to theme-callable functions
display-window when it's applied to iconified
windows
fonts-are-fontsets and
fontset-languages-re to work around broken X servers
ws-move-window to not remove the window if source
and dest are the same (Rob Hodges)
sp-prune-points function (Dan Winship)
move-viewport-to-window to only flip viewports if
window isn't already on the current viewport (Merlin)
x-raise-window; added symmetrical
function x-lower-window
x module
/ in themes to be the quotient function
(integer division), which is what they expect. The divide
function can be used for real division
x, a basic Xlib binding for creating and
drawing in windows (Merlin, me)
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)
call-command-with-output-to-screen, prompts
for and invokes a command, then displays any output it emitted (bound
to A-x in default keymaps)
multi-click-delay, maximum time in
milliseconds between button presses to count as click2 or
click3 events (Martin Blais)
edge-flip-only-when-moving (Yaron M. Minsky)
cycle-prefix,
cycle-class (Kai Großjohann); can now be bound to events with
more than one modifier (Timo Korvola)
uniquify-window-name; new property
unique-name. Forces the window to have a unique name
size-window-add-column,
size-window-subtract-column, size-window-add-row,
size-window-subtract-row
magnetism
(the old method), attraction and resistance. (Merlin, me)
grow-window-{left,right,up,down} and
pack-window-{left,right,up,down} (Kai Großjohann)
WM_COLORMAP_WINDOWS protocol
synthesize-event, font-ascent,
font-descent, call-with-keyboard-grabbed
define-placement-mode and
define-focus-mode--make defining these things easier. Focus
modes are now settable for each window individually
current-event-string function
x-cycle command
configure-request-hook. The new configure handler respects
window gravity when resizing
configure-auto-gravity. When enabled the window
gravity is implied by the position of the center of the window. (e.g.
try placing the GNOME control center in the bottom right corner of the
screen, then click on an item that causes it to resize)
XCreateFontSet causes--fall back to
XLoadQueryFont if possible
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
focus-when-mapped, and
gravity (overrides the hinted gravity value)
under-pointer and
centered-on-parent
resize-edge-mode, replaces
resize-by-frame-class and resize-add-edges>. Also allows
twm-style resizing (Mark Probst, me)
default-cursor,
synthetic-configure-mutex, frame-draw-mutex,
frame-state-mutex are now functions
x-keysym-name, x-lookup-keysym,
decode-event, encode-event.
move-resize-inhibit-configure
fp->win == 0 assertion, it should be harmless and
was triggering for some people
ws-insert-workspace (Kirk
Saranathan)
-clientId option from restart
parameters
sawmill-defaults.jl, by calling custom-add-required. If
you have a .sawmillrc you'll need to do this manually
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)
after-add-window-hook. Called with a single
parameter, the window that's has just been adopted
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
error-handler, implements a simple alternative
error handler (and allows the much-maligned beep to be turned off),
requires rep 0.11+
shade-hover, unshades windows while the pointer
is over them
window-menu,
shorten sticky entries as usual (James Antill)
TryExec field in GNOME desktop files (Ian)
raise-or-pass-through-click,
raise-and-pass-through-click-if-focused
move-cursor, various commands for moving the
mouse pointer; these commands are bound to the cursor keys when moving
or resizing windows
WM_NAME is a
null text property
skip-winlist and
skip-tasklist properties I'd stupidly broken
move-workspace-forwards and
move-workspace-backwards commands
uniconify-to-current-viewport option
delete-empty-workspaces command
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
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
call-after-property-changed function can now be given
a list of properties to monitor (James Antill)
call-after-state-changed, monitors a list of
window states (i.e. things like iconified, shaded, ...) and calls a
function when any of them change. The window-state-change-hook
now has a second argument (apart from the window), the list of symbolic
states that changed (James Antill)
skip-winlist and skip-tasklist to
the window matcher when GNOME support is enabled (Ben Liblit)
mono theme
display-message function update background color,
and gracefully handle invalid color specifiers (Matt Krai)
window-keymap. (Matt Krai)
inactive, focused,
highlighted, clicked, inactive-highlighted,
inactive-clicked. (Last two are new)
sawmill-themer. A GUI for creating simple
themes (those without any parts defined by functions)
gnome-int, loaded by sawmill-defaults if
GNOME is around, sets up some GNOME'ish things
toggle-single-window-mode
make-image now
always returns a new image
call-command accept closures
(cursor . nil) work correctly in frame definitions
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
ungrouped. Means to put
the window in a group on its own
commandp function when applied to autoload stubs
gnome-logout command (Jens Finke)
raise-window-and-pass-through-click command to pass
<click2>, etc, events through to frame parts
Type=directory, but actually a file)
Grab... button to match-windows dialogue, grabs
the value of an X property from a window
frame-part-get, server-grabbed-p,
forget-button-press, resize-window-with-hints,
window-in-workspace-p, windows-share-workspace-p
never-focus, raise-on-focus
size, in terms
of the window's size hints
popup-apps-menu command (Gérard Milmeister)
define-frame-class when creating keymaps
(set ...) custom types
raise-window-and-pass-through-click command to
pass-through subsequent clicks
move-resize-raise-window is set
Matched Windows
customize group
auto-foo-alist and
bar-windows-re variables, they're obsoleted by the general
match-windows mechanism
prefix/share/sawmill/themes. Use this for system-wide
themes (don't use the version specific directory)
mono
show-message function, replaced by
display-message with a better calling interface; also displays
multi-line strings
Hyper modifier, prefix is H-
resize-add-edges)
fixed-position property as sticky-viewport,
and focus-proxy-click as focus-click-through
New option --disable-nls to disable i18n
call-after-property-changed and
gtkrc-call-after-changed to allow themes to receive these events
(hooks are now off-limits to themes)
raise-window-and-pass-through-click; bind it
to a mouse button in the window-keymap to get the "raise window
on click" behaviour that seems popular
slide-window-x and slide-group-x for x
one of: left, right, up, down
ignored property of windows
(Julian Missig)
stacking-order function
bevel-image function (Scott Sams)
gnome-menu code when GNOME binaries aren't in
the first $PATH item; also accept non-alphanumeric language codes
AnyModifier and a
specific button
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
gnome-share-directory, also look in
/etc/X11/applnk for menu entries
edge-flip-type)
after-framing-hook: called whenever a window's
frame is changed or recalibrated
first-fit-or-interactive
move-cursor-shape, resize-cursor-shape,
select-window-cursor-shape)
cycle-windows only
finds a single window; also, abort immediately if there's no windows to
cycle through at all
WM_NORMAL_HINTS property is read after it's
been updated
maximize-fill functions to respect the
maximize-ignore-when-filling option
avoid property instead of the
maximize-avoid property; new functions window-avoided-p
and avoided-windows; new regexp avoided-windows-re
delete-empty-workspaces
microGUI
window-id and
window-frame-dimensions functions. Replaced
query-last-pointer function by query-button-press-pointer
while-moving-hook, while-resizing-hook
WM_TRANSIENT_FOR property changes
window-outside-viewport-p (Andreas Degert)
sawmill-client -- with long inputs
SM_CLIENT_ID or WM_COMMAND has to match
resize-by-frame-class, when enabled (the
default), the resized window edges are chosen to match the class of the
clicked frame part (i.e. matching the cursor shape)
/tmp
window-moved-hook, window-resized-hook,
after-initialization-hook, shape-notify-hook.
centered placement style
highlight-when-unfocused)
sm-after-restore-hook
set-frame-part-value--makes customizing the
frame-part-classes variables easier
_WIN_CLIENT_LIST property not being set properly (both
missing windows immediately after they're adopted, and of intentionally
skipping ignored windows)
cycle-disable-auto-raise); option to restrict cycling to the
current viewport (cycle-all-viewports)
lock-first-workspace is now enabled by default, and
prevents both the first and last interesting workspaces being moved
inwards
--with-readline option to configure (from Christopher P Goller
goller@eng.utah.edu)
below-client
root-window-keymap is
searched for key-press events
Type
fields
shaped-transient
window types (make the window completely unframed)
decorate-transients enabled
cycle-windows could leave a window
originally under the pointer that's unfocused, drawn as though it is
focused
lock-first-workspace, prevent the first
workspace from being deleted when it's empty
ignore-window-input-hint, to always give
windows the focus, whether they say they will accept it or not
cycle-warp-pointer and
cycle-focus-windows
move-viewport-x and move-window-x commands
(for x being left, right, up, or
down)
microGUI by Ryan Lovett
ryan@ocf.berkeley.edu, based on the QNX Photon screenshots
Grab key button in the bindings widget, replaces
the current binding with the next pressed key
(require 'gnome-menu) to your
~/.sawmillrc file to load it
transients-above-parents)
workspace-send-boundary-mode)
send-to-workspace:x for x from 1
to 9
--prefix option has a trailing slash
foreground property of each frame part may now be an
image instead of a piece of text
smaker, uses the foreground images capability to
do a somewhat WindowMaker-like theme (with the absolute-e images). This
theme is extensively customizable--all images, colors, dimensions,
etc...
PseudoColor visuals
xterm command to launch an xterm
Copy button to insert a copy of the current binding
next-workspace-row and previous-workspace-row
commands. Together with the workspace-columns variable these
mimic a 2d desktop
cycle-through-workspaces option, there's now
workspace-boundary-mode--one of stop, wrap-around
or keep-going
move-snap-ignored-windows)
override_redirect
attribute while unmapped
focus-windows-on-uniconify)
preallocated-workspaces option
override-frame-part-classes variable--allows all
frame properties to be overridden on a per-class basis
auto-window-type-alist variable mapping window
names to border types
eval-modifier-events and
eval-key-release-events to allow catching these types of
keyboard events, disabled by default
alt-keysyms and meta-keysyms describe the virtual
modifier assignments
frame-part-classes variable). This should ensure that different
themes have the same feel (but a feel that may be customized by the
user)
removable property). Nothing makes use of this yet
--enable-capplet configure option to build it
gtk theme, draw bevels on window decorations
focus-proxy-click controlling whether to pass
the focus-inducing button-press event to the underlying window (in
click-to-focus mode)
sm-window-save-functions and
sm-restore-window-hook hooks). See lisp/workspace.jl for
an example
move-show-position,
resize-show-dimensions)
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
preallocated-workspaces, the number of
workspaces to create at startup
README file that
will be displayed in the configuration tool
~/.sawmill/custom instead of
~/.sawmill-custom. The old file will be moved to the new
location if it exists
sawmill-menu under libexec since it
shouldn't be run manually
gradient theme to create full-sized gradient
images, trading memory for quality
menus and custom customize
options into normal variables (they're not particularly intuitive)
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)
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
gradient theme uses these and on-the-fly rendering to do
afterstep-like window titles
customize:group for each
group.
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.
select-workspace:X for X between
1 and 9
-c COMMAND to sawmill-client; invokes
the named interactive function
unframed window type
place-transient-mode)
window-ops-menu could be displayed from
one window but then affect a different window
move-snap-edges and move-snap-epsilon)
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)
keymap property of
the window under the pointer, not the focused window (as with keypress
events)
sawmill-client program can now communicate inter-host,
since it uses X properties not raw sockets
before-exit-hook, called immediately before
shutting down
sawmill-ui program, or from
the Customize... entry in the main menu. All changes are stored
in the Lisp script ~/.sawmill-custom
raise-selected-windows)
warp-to-selected-windows)
brushed-metal and simple themes now define all
four standard frame types
prefix/share/sawmill/version/lisp/themes) so that
the list of all available themes can be made automatically
simple frame style can now be
customized (simple-normal-color and simple-active-color)
sawmill-defaults.jl script enables GNOME compliance
unconditionally (since it has no ill-effects even if GNOME isn't being
used)
decorate-transients)
transients-get-focus)
focus-windows-when-mapped)
foreground, background and font
attributes of each frame part may now refer to a function
First proper release