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