1999-12-21  John Harper  <john@dcs.warwick.ac.uk>

	* edge-flip.jl (edge-flip-while-moving): fixed for new
	ws-move-window function; also, let edge-flip-delay be zero, to
	avoid nasty delayed effects

1999-12-20  John Harper  <john@dcs.warwick.ac.uk>

	* match-window.jl (match-window-grab-x-property): if a string,
	quote regexp meta-characters

1999-12-19  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.20

	* match-window.jl (match-window): fix bug when matching against
	zero-element vectors

	* match-window.jl: added new pseudo property `ungrouped'
	meaning to put windows in their own anonymous group

	* menus.jl (window-ops-menu): removed/shortened a few items

1999-12-18  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl: define copy-to-workspace:N commands.
	Fixed some problems with the merge-when-empty feature

1999-12-17  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (delete-window-instance): new command

	* viewport-linear.jl: new file, based on code posted by Eric
	Kidd <eric.kidd@pobox.com> to the mailing list

	* sawmill.jl: require iconify, set define-value if unbound

	* menus.jl (menu-preprocessor): removed the deprecated
	variable-expansion thing

	* iconify.jl: new file, extracted from workspace.jl

	* frames.jl, custom.jl, workspace.jl: use closures to create
	dynamic commands

1999-12-16  John Harper  <john@dcs.warwick.ac.uk>

	* move-resize.jl (move-resize-pos): move the position
	calculation to a separate function, fixes the problem of
	showing incorrect details while snapping (from merlin@merlin.org)

	* move-resize.jl (move-resize-apply): check that the window
	isn't being placed totally off-screen in either dimension

1999-12-15  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (workspace-swap-in): handle frame-style
	specially (use knowledge that if frame-style property isn't
	set, then we should use the default-frame-style)
	(add-swapped-properties): new function
	* sawmill.jl: require 'workspace earlier

	* window-order.jl, stacking.jl, shading.jl, maximize.jl,
	frames.jl: use add-swapped-properties

	* gnome.jl (gnome-set-workspace): show windows on the workspace
	theyre currently swapped into, not the closest to the current one

	* sm-init.jl (sm-add-saved-properties): only add properties once

1999-12-14  John Harper  <john@dcs.warwick.ac.uk>

	* tooltips.jl (tooltips-delay): reduced to 500ms

	* gnome.jl (gnome-set-workspace): don't set _WIN_WORKSPACE
	property of sticky windows

	* workspace.jl: rewritten to use a cleaner set of abstractions,
	but more importantly to allow windows to appear on multiple
	workspaces (and to have different properties on each)

	* x-cycle.jl, window-order.jl, smart-placement.jl, menus.jl,
	match-window.jl, gnome.jl: updated to use the new workspace
	interface

	* viewport.jl (window-absolute-position): new function

	* functions.jl (map-windows): new macro, map a function over
	all windows

1999-12-13  John Harper  <john@dcs.warwick.ac.uk>

	* gnome-menu.jl (gnome-menu-read-desktop-entry): recurse into
	directories if the desktop file is called ".directory", not if
	it has Type=directory (these may actually be files)

	* tooltips.jl: ignore null keymaps; yellow background color

	* sawmill-defaults.jl: turn on tooltips by default

	* tooltips.jl: massively simplified how we know when to remove
	the tooltip window--just hook into pre-command-hook and
	frame-part-leave-hook

	* stacking.jl (raise-window-and-pass-through-click): only call
	forget-button-press if a frame part isn't clicked

	* gnome-commands.jl (gnome-logout): should be --kill not --quit
	(from Jens Finke <pearl@darkride.net>)

1999-12-12  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.19

	* x-cycle.jl: disable tooltips while cycling

	* tooltips.jl: new file, implements tooltips for frame parts
	with keymaps

	* window-order.jl: hack around the annoying behaviour when
	switching workspace with sticky windows existing

	* move-resize.jl (move-resize-window): if
	move-resize-raise-window is set, and mode is not opaque, then
	raise the window _after_ the move/resize

1999-12-10  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (window-in-workspace-p,
	windows-share-workspace-p): new functions, first attempt at
	abstracting workspace interface; only gnome.jl groks the
	`workspace' property now (though others use it as a black box)

	* x-cycle.jl, window-order.jl, stacking.jl, smart-placement.jl:
	use window-in-workspace-p and windows-share-workspace-p

	* select-window.jl, move-resize.jl: the foo-cursor-shape
	variables may now contain actual cursor objects

	* custom.jl (custom-menu): gettextized a string

1999-12-09  John Harper  <john@dcs.warwick.ac.uk>

	* gnome-menu.jl (gnome-menu-read-directory): sort entries whose
	order wasn't specified by a `.order' file

	* keymaps.jl (custom-set-keymap): ensure that we ungrab the
	keymap _before_ destructively modifying the original value, not
	afterwards

	* workspace.jl (ws-set-client-state): WM_STATE property should
	have two values, not only one

	* customize.jl (default-bevel-percent): defcustom for this new
	built-in variable

1999-12-08  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill.jl: recognize -clientId as a synonym for
	--sm-client-id; always look for --disable-nls option

	* menus.jl (window-ops-toggle-menu): into a separate variable

	* match-window.jl: added `never-focus'; added `size' pseudo
	property; negative `position' components count in from the
	right/bottom

	* gnome.jl (gnome-honour-client-state): recognize panel and gmc
	icons by WM_CLASS. Set `never-focus' property of icons

	* gnome-commands.jl (gnome-logout): new command

	* functions.jl (window-really-wants-input-p): look for a
	property `never-focus'
	(resize-window-with-hints): resize window by increments

	* focus.jl: add `never-focus' to the properties saved with the
	session

	* stacking.jl (raise-window-and-pass-through-click): call
	forget-button-press so that double-clicks pass through okay

1999-12-07  John Harper  <john@dcs.warwick.ac.uk>

	* auto-raise.jl (raise-windows-on-focus): this may no longer be
	a regexp, instead there's a window property `raise-on-focus'
	allowing per-window settings
	* move-window.jl, x-cycle.jl (move-resize-window,
	cycle-windows): disable auto-raising when appropriate
	* match-window.jl: added new property `raise-on-focus'

	* frames.jl (define-frame-class): if creating a keymap, make
	its variable special

	* match-window.jl (match-window-grab-x-property): new function,
	used by the ui to grab properties

	* custom.jl (custom-declare-variable): fix conversion of old
	`set' types to the new method

1999-12-06  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (define-frame-class): if creating a keymap, add it
	to the gaolled environment

	* menus.jl (popup-apps-menu): fixed (from Grard Milmeister
	<gemi@bluewin.ch>)

1999-12-05  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.18

	* x-cycle.jl, move-resize.jl, keymap.jl: replaced show-message
	by display-message

	* menus.jl (window-ops-menu, root-menu): just use function
	names of dynamic sub-menus, don't create closures

1999-12-04  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (rebuild-frames-with-style,
	reframe-windows-with-style): new functions

	* maximize.jl (maximize-window): respect the window's size
	hints, both to see if the window is maximizable, and to
	truncate the maximized dimensions to an integral size

1999-12-03  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (select-workspace): only hide/show windows whose
	`placed' property is set

	* x-cycle.jl (x-cycle-modifier-alist): support the Hyper
	modifier

	* workspace.jl (ws-after-removing-window): fix the logic
	deciding when it's necessary to switch workspaces after merging

	* x-cycle.jl (cycle-windows): grab the keyboard to the
	currently focused window, prevents the ``lose focus with a
	single bug''

	* move-resize.jl (resize-add-edges): new option, controls
	whether single direction resizes can be upgraded to two
	directions

	* smart-placement.jl (sp-max-queued-events): increased from 20
	to 256, seems to still have the desired effect (passes the
	`gimp /usr/share/pixmaps/*.png &' test)

1999-12-02  John Harper  <john@dcs.warwick.ac.uk>

	* match-window.jl: added pseudo-properties: position and
	viewport

	* workspace.jl, viewport.jl, gnome.jl, focus.jl: changed
	property names: fixed-position => sticky-viewport, and
	focus-proxy-click => focus-click-through

	* menus.jl (menu-preprocessor): deprecated the ``expand
	variables when first in list'' behaviour, it's too crufty to
	live. Now we have lisp-1 behaviour it's possible to expand
	variables when the list is dotted to them, as was previously
	done only for functions
	* gnome-menu.jl: changed how apps-menu is hijacked

	* workspace.jl, transient.jl, stacking.jl, group-funs.jl,
	functions.jl, frames.jl: removed all the auto-foo-alist and
	bar-windows-re variables -- match-window can do all this stuff
	in one place

	* frames.jl (site-theme-directory): new variable, put in the
	theme-load-path, set to ${prefix}/share/sawmill/themes by default

1999-12-01  John Harper  <john@dcs.warwick.ac.uk>

	* match-window.jl: added customize support

	* custom.jl: deprecated the `(set SYMBOLS..)' type, replaced by
	`symbol' with an extra tag `:options (SYMBOLS...)'
	(custom-get-options, custom-add-option): new macros for
	extending symbol-type defcustom's

	* workspace.jl, stacking.jl, place-window.jl, move-resize.jl,
	focus.jl, edge-flip.jl, customize.jl: work with the new
	`symbol' custom type

1999-11-30  John Harper  <john@dcs.warwick.ac.uk>

	* match-window.jl: new file, a method of matching windows (by
	their X properties) to sawmill window properties without the
	need for custom hook functions. Will get a GUI at some point

1999-11-29  John Harper  <john@dcs.warwick.ac.uk>

	* functions.jl (warp-cursor-to-window): rewritten in lisp; also
	when given no position it focuses on the inside top-left corner
	of the frame, should overlay more frame styles

	* maximize.jl (maximize-expand-edges): fix typos from updates
	for single namespace (Grard Milmeister <gemi@bluewin.ch>)

	* workspace.jl: reworked the map-notify and unmap-notify hook
	functions; they work again now

	* compat.jl (show-message): implemented in terms of the new
	display-message function

1999-11-28  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.17

	* menus.jl (window-ops-menu): added some more `Toggle' items

	* ignore-window.jl: new file, mostly by Julian Missig
	<julian@linuxpower.org> (X-ViRGE) controls the `ignored'
	property of windows on-the-fly

	* gnome.jl: call gnome-set-client-list from the
	workspace-state-change-hook

	* gnome-commands.jl: new file, a few commands to toggle the
	skip-tasklist and skip-winlist hints

1999-11-26  John Harper  <john@dcs.warwick.ac.uk>

	* keymaps.jl (custom-set-keymap): catch and ignore errors when
	parsing event descriptions

	* place-window.jl (place-window): adjust position for window
	gravity (mostly from merlin <merlin@merlin.org>)

	* slide-window.jl: new file, commands to move windows/groups
	incrementally

1999-11-25  John Harper  <john@dcs.warwick.ac.uk>

	* x-cycle.jl, workspace.jl, window-order.jl, viewport.jl,
	transient.jl, stacking.jl, smart-placement.jl, sm-save.jl,
	sm-load.jl, sm-init.jl, shading.jl, server.jl, sawmill.jl,
	sawmill-gaol.jl, rects.jl, place-window.jl, open-look.jl,
	mwm.jl, move-resize.jl, menus.jl, maximize.jl, keymaps.jl,
	keymap.jl, gtkrc.jl, groups.jl, group-funs.jl, gnome.jl,
	gnome-menu.jl, functions.jl, frames.jl, focus.jl, edges.jl,
	edge-flip.jl, customize.jl, custom.jl, auto-raise.jl: updated
	for single namespace and scheme-like function semantics

1999-11-20  John Harper  <john@dcs.warwick.ac.uk>

	* x-cycle.jl, workspace.jl, move-resize.jl, maximize.jl,
	group-funs.jl, frames.jl, edge-flip.jl, customize.jl: rewrote
	documentation for some options

1999-11-19  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill.jl: check LC_ALL and LC_MESSAGES before LANG

	* gnome-menu.jl (gnome-menu-lang): look in LC_ALL before LANG
	(gnome-menu-read-desktop-entry): accept wider language types

	* sm-init.jl (sm-init): use process-id instead of getpid

	* viewport.jl, custom.jl: remerged viewport and workspace
	custom groups

	* viewport.jl (window-outside-workspace-p): fixed for off left
	or top of workspace

	* sawmill.jl: load i18n support when $LANG is defined and != `C'

1999-11-18  John Harper  <john@dcs.warwick.ac.uk>

	* transient.jl, auto-raise.jl: change some custom docs

	* workspace.jl, menus.jl, keymap.jl, group-funs.jl,
	gnome-menu.jl, frames.jl, customize.jl: mark strings for i18n

	* frames.jl (find-all-frame-styles): sort case-insensitively

1999-11-17  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-gaol.jl (sawmill-safe-functions): removed window-put

	* stacking.jl (raise-window-and-pass-through-click): new
	command

1999-11-15  John Harper  <john@dcs.warwick.ac.uk>

	* gtkrc.jl: call gaol-rebuild-environment after being loaded

	* sawmill-gaol.jl: added the gradient functions to the list
	(since the gaol now handles non-fboundp functions)

1999-11-11  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (themes-are-gaolled): new variable, set it to nil
	to remove the gaol around loaded themes

	* sawmill-gaol.jl: new file, customize rep's gaol for sawmill
	* sawmill.jl: require sawmill-gaol

	* functions.jl (call-after-property-changed): new function, a
	safe alternative to property-notify-hook (only accepts closures)

	* gtkrc.jl: add safe functions and variables to the gaol
	(gtkrc-call-after-changed): safe alternative to gtkrc-changed-hook

1999-11-10  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl, menus.jl, group-funs.jl, gnome-menu.jl,
	frames.jl, custom.jl: updated for lexically scoped rep

1999-11-09  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (ws-window-mapped): call ws-add-window to move
	the window to the correct workspace

	* place-window.jl: fix interactive placement

	* gnome-menu.jl (gnome-share-directory): fix PATH searching

1999-11-07  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.16

	* gtkrc.jl: moved some code back to the gtk theme, since it's
	pretty non-reusable; don't load bg pixmaps unless asked to by
	the theme; new variable gtkrc-base

1999-11-06  John Harper  <john@dcs.warwick.ac.uk>

	* group-funs.jl: added a third type of group id: symbols for
	user defined named groups, only these are session-managed
	(auto-group-alist, persistent-group-ids): new variables

	* functions.jl (get-window-by-id): deleted, now a subr

	* group-funs.jl: moved all window groups functions froms
	functions.jl to this new file. Added support for user-defined
	groups--the `group' property may define the group-id of a
	window (so far always an integer, but eq is okay)
	* sawmill.jl: require 'group-funs

	* menus.jl (window-ops-menu): slightly reorganised, added a
	submenu for the window's group

1999-11-05  John Harper  <john@dcs.warwick.ac.uk>

	* x-cycle.jl (cycle-group): new command, cycle through all
	windows in the group of the current window

	* x-cycle.jl (x-cycle-next): abort immediately if there's no
	windows to cycle through

	* place-window.jl: placement modes are now defined by symbols
	having the `placement-mode' property--a function to call

	* smart-placement.jl (place-window-first-fit-or-interactive):
	new placement mode, fall back to interactive placement if
	there's not enough space for the window

	* move-resize.jl (move-cursor-shape, resize-cursor-shape): new
	variables
	* select-window.jl (select-window-cursor-shape): new variable

1999-11-04  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (iconify-whole-group, uniconify-whole-group):
	new options
	(make-window-sticky, make-window-unsticky): new commands
	(uniconify-to-current-workspace, raise-windows-on-uniconify,
	focus-windows-on-uniconify): moved to iconify group

	* groups.jl: new file, provides window-group variants of many
	window commands

	* functions.jl (transients-are-group-members): new option, put
	transient windows in the same group as their parent window

	* custom.jl: added `iconify' group
	* viewport.jl (uniconify-to-current-viewport): moved to iconify
	group

	* menus.jl (popup-menu): when specifying a position, ensure
	that it's not less than zero

	* functions.jl (windows-in-group, map-window-group): new
	functions

	* menus.jl (popup-menu): ungrab the keyboard as well as the
	pointer

1999-11-03  John Harper  <john@dcs.warwick.ac.uk>

	* gtkrc.jl (gtkrc-background-colors): new variable, always set
	to the list of background colors

	* frames.jl (theme-suffix-regexps): fixed for `.tar' suffix

1999-11-02  John Harper  <john@dcs.warwick.ac.uk>

	* edge-flip.jl: reinstated the separate edge-flip custom group

	* gnome-menu.jl: scan $PATH for gnome-share-directory, added
	/etc/X11/applnk to list of directories, added code to merge
	duplicated sub-menus

	* move-resize.jl (move-resize-window): don't abort if it's not
	possible to grab the keyboard, only the ESC binding depends on it

	* edge-flip.jl (edge-flip-type): new option, allows the user to
	choose to flip workspaces, not viewports

1999-11-01  John Harper  <john@dcs.warwick.ac.uk>

	* gnome-menu.jl: catch and ignore errors when opening files

	* maximize.jl (maximize-fill-window): use dont-avoid-ignored
	variable instead of non-existent avoid-ignored

	* functions.jl (dont-avoid-ignored): set to t by default

	* frames.jl (find-all-frame-styles): ignore duplicates

1999-10-31  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.15

	* move-resize.jl (move-resize-motion): use call-window-hook to
	invoke the while-moving-hook and while-resizing-hook

	* sawmill.jl (fallback-frame-style): now set to microGUI

	* keymaps.jl (custom-set-keymap): preserve eq-ness of old and
	new keymap when overwriting an existing keymap definition

1999-10-30  John Harper  <john@dcs.warwick.ac.uk>

	* custom.jl: added a viewport customization group
	* viewport.jl, edge-flip.jl: options now in viewport group

	* edge-flip.jl: only require things when they're actually
	needed

	* menus.jl: removed the unneeded custom-require autoload

	* edge-flip.jl: let this be enabled/disabled via customization

	* frames.jl (frame-style-directory): themes in tar files are
	now expected to have a top-level directory with the same name
	as the theme

1999-10-29  John Harper  <john@dcs.warwick.ac.uk>

	* move-resize.jl (move-resize-motion): when only one edge is
	being resized, and the pointer moves past the end of that edge,
	start resizing that edge as well

	* workspace.jl (delete-empty-workspaces): new command

	* focus.jl (focus-push-map, focus-pop-map): functions for
	installing and remove the click-to-focus map, they preserve the
	original keymap

1999-10-28  John Harper  <john@dcs.warwick.ac.uk>

	* smart-placement.jl (sp-make-grid): sort the grid (so
	first-fit always works from top-left)

	* viewport.jl (window-outside-viewport-p): don't include
	windows at the left border of the next viewport (from Andreas
	Degert <ad@papyrus-gmbh.de>)

	* custom.jl: removed support for old-style ~/.sawmill-custom
	files

	* focus.jl (click-to-focus-keymap): only bind the first three
	mouse buttons (the others are often apparently used for the
	wheel thing)

1999-10-27  John Harper  <john@dcs.warwick.ac.uk>

	* rects.jl (rectangles-from-windows): replace the weight-alist
	parameter by weight-fun, an optional function to return the
	window's weight

	* functions.jl (avoided-windows-re, window-avoided-p,
	avoided-windows): moved from maximize.jl and generalized,
	property to set is now `avoid' instead of `maximize-avoid'
	* maximize.jl: use the common avoided windows mechanism
	* gnome.jl: set `avoid' property not `maximize-avoid'

	* smart-placement.jl (sp-important-windows,
	sp-auto-weight-alist): deleted these variables, any windows
	that aren't avoided-p get given weight sp-avoided-windows-weight;
	other windows can have their `placement-weight' property set

	* stacking.jl (transients-above): changed default value to none

	* move-resize.jl: use query-button-press-pointer instead of
	query-last-pointer

	* maximize.jl (maximize-avoided-windows): don't include
	unmapped windows

	* maximize.jl (maximize-expand-edges): rewrote the (not
	maximize-always-expands) case, so that it works (find the
	largest gap)

1999-10-26  John Harper  <john@dcs.warwick.ac.uk>

	* sm-load.jl (sm-match-window-to-alist): match isn't successful
	_unless_ either SM_CLIENT_ID or WM_COMMAND matches

	* move-resize.jl (move-resize-motion): call while-moving-hook
	or while-resizing-hook in between erasing the old outline and
	drawing the new one

	* edge-flip.jl (edge-flip-while-moving): make edge flipping
	work while dragging windows

	* maximize.jl (maximize-expand-edges): fix problem with
	immediately adjacent edges being ignored

	* functions.jl (uniquify-list): new function
	* edges.jl, rects.jl (grid-from-edges, grid-from-rectangles):
	uniquify the grid

1999-10-25  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.14.2

	* maximize.jl (maximize-do-both): sort grid before passing it
	to rectangles-from-grid, this stops things going _really_
	ballistic

	* edge-flip.jl: new file, viewport flipping by pushing the
	pointer against the screen edges

	* viewport.jl (set-screen-viewport, move-viewport): document
	that these now return t if they actually move the viewport

	* version 0.14.1

	* maximize.jl (maximize-do-both): only choose rectangles that
	are fully on the screen

	* rects.jl (rect-wholly-visible-p): new function

	* rects.jl (rectangles-from-grid): fixed this function (only
	traversing the list of y points once)

	* smart-placement.jl (sp-do-placement): fix for when
	sp-important-windows is nil

	* maximize.jl (maximize-do-both): deleted unused `center'
	variable
	(maximize-window): delete the window itself from the list of
	avoided windows
	(both from Rob Hodges <s323140@student.uq.edu.au>)

1999-10-24  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.14

	* workspace.jl (static-workspace-menus): expanded some items
	* menus.jl (root-menu): swapped position of Workspace and
	Window menus

	* place-window.jl (place-window-interactively): swallow any
	pending X events before doing the interactive placement

	* frames.jl: reframe the window when it's shape changes (in
	case it changed from unshaped to shaped, or vice versa)

	* move-resize.jl (resize-by-frame-class): new option, link
	edges moved when resizing to the clicked frame part, not to the
	mouse position (so the behaviour matches the cursor shape)

1999-10-23  John Harper  <john@dcs.warwick.ac.uk>

	* menus.jl (window-ops-menu): cleaned up a bit; added some more
	items

	* stacking.jl (transients-above): replaces the
	transients-above-parents option

	* viewport.jl (uniconify-to-current-viewport): new option

	* stacking.jl (raise-window-depth): add restack-by-depth to the
	after-initialization-hook

1999-10-22  John Harper  <john@dcs.warwick.ac.uk>

	* maximize.jl (maximize-avoided-windows): look for a
	maximize-avoid property

	* gnome.jl (gnome-honour-client-state): for panel windows, set
	the focus-proxy-click and maximize-avoid properties

	* menus.jl: set frame-draw-mutex while menus are popped up

	* keymaps.jl (menu-button-keymap): bind popup-window-menu to
	`Button1-Click1' instead of `Button1-Off'

	* sawmill.jl: if the root window has any property whose name
	starts with `GNOME_', then require 'gnome

	* menus.jl (popup-menu): if the menu is popped from a frame
	part whose class ends in `-button', align the menu to the
	bottom-left corner of the button

1999-10-21  John Harper  <john@dcs.warwick.ac.uk>

	* maximize.jl (maximize-ignore-when-filling): new option, other
	cleanups

	* custom.jl: added `maximize' group
	* move-resize.jl (move-lock-when-maximized): now in maximize
	group

	* maximize.jl: handle 2D maximization separately, look for the
	largest rectangle that doesn't contain any reserved windows

	* rects.jl: new file, operations on rectangles, some functions
	copied from smart-placement.jl and renamed, some new functions
	* smart-placement.jl: use rects.jl

	* edges.jl (grid-from-edges): new function

1999-10-20  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (def-frame-class): new macro

	* keymaps.jl (window-keymap): bind popup-window-menu to
	button-press not button-release event

	* move-resize.jl (move-lock-when-maximized): new option, lock
	geometry on x/y/both axes depending how the window is maximized
	* menus.jl (popup-menu): pass the server timestamp argument
	across

	* maximize.jl: discard/update maximized window state when
	window is moved or resized

	* move-resize.jl: call hooks before-move-hook, after-move-hook,
	before-resize-hook, and after-resize-hook

	* maximize.jl (maximize-avoided-windows-re): new option,
	controls which windows shouldn't be obscured when maximizing.
	Also added `maximize-fill' commands, these maximize a window
	without obscuring any other windows. 2D maximization is treated
	as two 1D maximizations, this is sub-optimal..
	* menus.jl (window-ops-menu): added maximize-fill menus

	* edges.jl (get-visible-window-edges): new arg :windows,
	supplies the list of windows to include. The edge structure is
	now (X Y1 Y2 OPEN-P) or equiv. where OPEN-P defines if the edge
	opens or closes a window

1999-10-19  John Harper  <john@dcs.warwick.ac.uk>

	* move-resize.jl (move-resize-roundup): take an optional MAX
	argument, from the window's size hints

	* place-window.j: added `centered' placement style

	* menus.jl (popup-menu): if the spec is a function, call it

1999-10-18  John Harper  <john@dcs.warwick.ac.uk>

	* viewport.jl: added window-order-focus-most-recent to the
	viewport-moved-hook

	* gtkrc.jl (gtkrc-apply-style): fall back to default-font if
	the gtk style font isn't available

1999-10-17  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.13

	* stacking.jl, transient.jl: moved the code to handle raising
	transient windows on mapping to stacking.jl, renamed
	transient-layer-delta as transient-depth, this is now the
	_minimum_ depth

	* frames.jl: support for loading themes stored in tar files

	* gnome.jl (gnome-honour-client-state): disable use of the
	_WIN_MAXIMIZED_ hints, since it doesn't work properly, and it
	breaks other stuff

1999-10-15  John Harper  <john@dcs.warwick.ac.uk>

	* transient.jl (transient-layer-delta): new variable
	(transient-map-window): don't only raise windows with parents

	* Makefile.in: use old method of compiling lisp files, just
	call compile-lib-batch

	* compat.jl: new file, provide some compatibility for obsolete
	functions
	* sawmill.jl: require 'compat

	* workspace.jl: renamed ws-workspace-limits as workspace-limits
	and ws-workspace-empty-p as workspace-empty-p

1999-10-14  John Harper  <john@dcs.warwick.ac.uk>

	* smart-placement.jl (sp-max-queued-events): new variable, acts
	as a throttle, revert to random placement when more than this
	many X events are pending

	* transient.jl (transient-unmap-window): added to
	iconify-window-hook

	* frames.jl (set-frame-part-value): new function

1999-10-13  John Harper  <john@dcs.warwick.ac.uk>

	* sm-init.jl (sm-after-restore-hook): new hook

	* window-order.jl: after loading session compress the stack
	(window-order-compress): remove `order' properties of windows
	not in the order stack

	* move-resize.jl: typing `ESC' during move/resize cancels the
	operation, restoring the original geometry

	* workspace.jl (select-workspace): only call
	window-order-focus-most-recent if not in enter-exit focus mode

	* transient.jl (transient-unmap-window): unless enter-exit
	focus mode, refocus the most recently focused window

	* smart-placement.jl (sp-prune-points): try to prune the grid
	of tested positions (otherwise the algorithm becomes
	intractable for large numbers of windows)

	* gnome.jl: don't use WIN_AREA to preserve window->viewport
	mapping during restart

	* viewport.jl: don't move all windows to single viewport on
	exit
	(move-window-to-current-viewport): only move if the window is
	really outside the viewport

	* stacking.jl: hook into map-notify-hook instead of
	reparent-notify-hook (which isn't called any longer)

	* gnome.jl (gnome-set-client-list): include ignored clients
	(gnome-ignored-windows-in-client-list): new variable, defaults
	to t

1999-10-12  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (highlight-when-unfocused): declare this option

	* viewport.jl (window-outside-workspace-p): fix bug

	* workspace.jl (ws-move-window): only move a window if it's not
	already on the destination workspace

	* viewport.jl (window-viewport): new function

	* gnome.jl: use _WIN_AREA properties on windows to preserve
	window->viewport mapping during restart

	* viewport.jl (viewport-before-exiting): add this to the
	before-exit-hook instead of an anonymous function

1999-10-10  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.12

	* workspace.jl (ws-add-window): if window is iconified hide it
	(ws-remove-workspace): twiddle first-interesting-workspace if
	necessary

	* workspace.jl (ws-saved-state): fixed

	* customize.jl (default-font): add after-setting-frame-option
	as :after-set function 

1999-10-08  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (select-workspace): grab the server while
	hiding/showing windows, should decrease the actual number of
	grabs required

	* functions.jl (ignore-window-input-hint): t by default (law of
	least-surprises..)

1999-10-07  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (window-type): handle the decorate-transients
	property here now, instead of in set-window-frame-style

	* place-window.jl (place-window): ignore-program-position may
	now be set for each window
	(place-window-randomly): handle dimensions >= the screen
	* smart-placement.jl (sp-do-placement): handle window
	dimensions near or greater the screen size better

	* workspace.jl (lock-first-workspace): enabled by default (too
	many people think the other behaviour is a bug)

	* viewport.jl (window-outside-viewport-p): new function

	* window-order.jl (window-order): new optional arg ALL-VIEWPORTS

	* x-cycle.jl (cycle-all-viewports): new option

	* workspace.jl (lock-first-workspace): this option now locks
	the last interesting workspace as well as the first
	(ws-normalize-indices): normalise the first- and
	last-interesting-workspace variables
	(ws-load-state): don't treat saved workspace indices as logical
	indices (this could merge workspaces)

	* frames.jl (frame-style-menu): affect the current-event-window
	instead of the input-focus

	* gnome.jl: map _WIN_HINTS_SKIP_FOCUS to our ignored property,
	remove hack of matching window names

1999-10-06  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (window-type-remove-title,
	window-type-remove-border): map shaped-transient to unframed

	* gnome-menu.jl (gnome-menu-read-desktop-entry): bug fix when
	type isn't specified

	* menus.jl (popup-apps-menu): new command

1999-10-05  John Harper  <john@dcs.warwick.ac.uk>

	* gnome.jl: set the _WIN_UNIFIED_AREA root property; I'm using
	this to tell desk-guide to move the viewport on all desktops at
	once, this may have to change..

	* x-cycle.jl (cycle-disable-auto-raise): new option

	* x-cycle.jl: use the new window-order code for maintaining the
	stack

	* workspace.jl (ws-move-window): new optional arg, WAS-FOCUSED,
	when t the window is refocused when moved to the new space
	(select-workspace): new optional arg DONT-FOCUS, if nil the
	most recently used window on the new workspace is focused

	* workspace.jl: when moving windows, try to preserve focus
	where desirable

	* window-order.jl: new file, generalize interface to the stack
	of most recently used windows kept by the cycle-windows
	function

	* focus.jl (focus-in-fun): unless focus-dont-push is set, add
	the focused window to the top of the order stack

	* version 0.11

	* workspace.jl (lock-first-workspace): new option

	* transient.jl: put transient-add-window in the
	before-add-window-hook instead of the add-window-hook

1999-10-04  John Harper  <john@dcs.warwick.ac.uk>

	* functions.jl (window-really-wants-input-p): new function,
	calls window-wants-input-p unless the
	`ignore-window-input-hint' option, or window property, is t
	* x-cycle.jl, workspace.jl, transient.jl, focus.jl: use
	window-really-wants-input-p instead of window-wants-input-p

	* x-cycle.jl (cycle-warp-pointer, cycle-focus-windows): new
	options

	* version 0.10.1

	* smart-placement.jl (sp-do-placement): if no position with
	padding, try without padding

	* gnome.jl (gnome-set-workspace): delete the _WIN_WORKSPACE
	property of sticky windows

	* workspace.jl (ws-add-window): ensure that sticky windows are
	added to no workspaces and are visible

1999-10-03  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.10

	* workspace.jl (auto-workspace-alist): new variable, maps
	window names to the workspace they should start on

	* gnome.jl (gnome-honour-client-state): when _WIN_WORKSPACE is
	set, just set the window's `workspace' property

	* smart-placement.jl (sp-important-windows-weight): new
	variable, also, changed the weight from 1000 to 10
	(sp-auto-weight-alist): new variable, map window names to
	overlap weights
	(sp-do-placement): truncate the window's dimensions to those of
	the screen

	* menus.jl: instead of saving and restoring the _focused_
	window while the menu is popped, save the window that gave us
	the current event, then reinstate it when dispatching the
	selected command

	* workspace.jl: replace all %f interactive decls by %W

	* keymaps.jl: noted in doc strings that certain keymaps are
	only useful for mouse-bindings

	* viewport.jl (set-viewport): call viewport-moved-hook from
	here, instead of set-screen-viewport

1999-10-02  John Harper  <john@dcs.warwick.ac.uk>

	* gnome-menu.jl: new file, read the GNOME menu entries and
	replace the apps-menu

	* workspace.jl (ws-saved-state, ws-load-state): normalize
	workspace numbers to zero when saving/loading the session

	* viewport.jl (set-window-viewport, move-window-viewport): new
	functions
	(move-window-left, move-window-right, move-window-up,
	move-window-down): new commands

1999-10-01  John Harper  <john@dcs.warwick.ac.uk>

	* viewport.jl (move-viewport-to-window): new function
	* x-cycle.jl, workspace.jl: call move-viewport-to-window when
	necessary

	* frames.jl (set-window-frame-style): if decorate-transients is
	set and the window is a transient, only upgrade the type if it
	hasn't been set explicitly

	* keymap.jl (read-event): new function, grab the keyboard then
	return the next event

1999-09-30  John Harper  <john@dcs.warwick.ac.uk>

	* gnome.jl (gnome-exit): delete _WIN_AREA and _WIN_AREA_COUNT
	from the root window

	* keymaps.jl (global-keymap): removed the C-Up and C-Down
	bindings

	* viewport.jl: new file, support virtual workspaces
	* workspace.jl: deleted the workspace-columns hack, set
	fixed-position property of sticky windows
	* gnome.jl: handle _WIN_AREA properties
	* sawmill.jl: require viewport

	* transient.jl (transient-add-window): set fixed-position as
	well in sticky windows

	* sm-save.jl, sm-load.jl: don't save position of windows,
	handled by viewport module

	* workspace.jl (workspace-send-boundary-mode): new option
	(send-to-workspace:X): new commands, 0 < X < 10

1999-09-29  John Harper  <john@dcs.warwick.ac.uk>

	* server.jl (server-eval): function to evaluate a string to a
	result string
	(server-net-init, server-net-exit): functions to enable/disable
	the X property based server, disabled by default

	* auto-raise.jl: in the focus-out-hook as well now, disable any
	pending timer

	* workspace.jl (workspace-names): new variable, not yet
	customizable
	* gnome.jl (gnome-set-workspace): set _WIN_WORKSPACE_NAMES if
	necessary

1999-09-28  John Harper  <john@dcs.warwick.ac.uk>

	* customize.jl (customize-group-opt, customize-args): new
	variables, control how the cutomize-program is called

	* x-cycle.jl (cycle-windows): stop the cycling when the
	invoking modifier is released with _any_ other modifiers held

	* x-cycle.jl, workspace.jl, transient.jl, focus.jl: only give
	windows the focus if they've said they want it (through the
	input field of their WM_HINTS property)

	* sm-init.jl (sm-init): don't set the `Environment' property,
	I've had reports that it may prevent $SESSION_MANAGER being
	connected with on restart

	* move-resize.jl (move-resize-lost-window): hooked into the
	unmap and destroy notify hooks, if the window being
	moved/resized is gone, then quit

1999-09-27  John Harper  <john@dcs.warwick.ac.uk>

	* transient.jl (transients-above-parents): new option

1999-09-26  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.9

	* open-look.jl (ol-add-window): fix for single atom
	_OL_WIN_ATTR property (wordperfect)

	* sawmill.jl: set $DISPLAY to the display we opened (for our
	subprocesses)

1999-09-25  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl: remove the requirement that workspace indices
	are always >= 0. This makes moving beyond the first inhabited
	workspace a lot easier. Also removed the total-workspaces
	variable, there's now a ws-workspace-limits function that
	returns the first and last workspaces. Various other minor
	changes..

	* keymaps.jl, gnome.jl, cycle.jl: small changes for modified
	workspace.jl

	* customize.jl (customize-symbol-spec): file-name type now has
	its own widget

	* edges.jl (snap-window-position-to-edges): don't allow windows
	to be snapped off screen

	* move-resize.jl (move-snap-ignored-windows): new option

1999-09-24  John Harper  <john@dcs.warwick.ac.uk>

	* gtkrc.jl: abstracted the gtkrc code from the gtk theme

	* gnome.jl (gnome-set-workspace): only set _WIN_WORKSPACE and
	_WIN_WORKSPACE_COUNT on the root window when the values have
	actually changed

	* workspace.jl (jump-workspaces-forwards,
	jump-workspaces-backwards): new commands
	* keymaps.jl (global-keymap): bind c-down and c-up to the
	jump-workspaces- commands

1999-09-23  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (find-all-frame-styles): new optional arg: sorted,
	whether or not to sort the list

	* place-window.jl (place-window-mode): use best-fit placement
	by default

	* functions.jl (xterm): new command

	* sm-init.jl (sm-init): encapsulates the connection process
	* sawmill.jl: connect with the session manager last of all

1999-09-22  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (window-menu): only include non-ignored windows

	* smart-placement.jl (sp-cost): multiple x-edges by y-edges
	instead of adding when calculating space usefulness 

1999-09-21  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (ws-add-window): if `workspace' property is
	already set, then add to that workspace

	* smart-placement.jl (sp-padding): new option--the number of
	pixels to try and leave between window edges

	* smart-placement.jl (sp-cost): now tries to maximize the
	number of grid lines crossed, and the length of the shared
	window edges

	* smart-placement.jl: improved first-fit fallback algorithm,
	looks for the position where the window has the smallest
	overlap with all other windows

1999-09-20  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill.jl: set autoload-verbose to nil

	* workspace.jl (preallocated-workspaces): fix bug in the
	after-set function (calling unquoted hook)

	* gnome.jl (gnome-client-message-handler): only handle
	WIN_STATE and WIN_LAYER if we actually have a window object to
	act on

	* smart-placement.jl (place-window-best-fit): first attempt at
	best-fit placement (cost function is still not right)
	* place-window.jl: added best-fit option

	* sawmill.jl: move setting a fallback frame style to outside
	the condition-case

	* x-cycle.jl: remove windows from stack when iconified

	* workspace.jl (focus-windows-on-uniconify): new defcustom

	* focus.jl (focus-click): since XAllowEvents () ignores passive
	grabs when it replays events, manually search for a binding of
	the focus-inducing click

1999-09-19  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.7

	* x-cycle.jl (x-cycle-next): if the next window was iconified,
	display its name surrounded by square brackets 

	* smart-placement.jl (place-window-first-fit): do first-fit
	window placement
	* place-window.jl: added first-fit option

1999-09-18  John Harper  <john@dcs.warwick.ac.uk>

	* x-cycle.jl (x-cycle-modifier-alist): use alt-keysyms and
	meta-keysyms, instead of hard-coding the names (which may not
	work if, for example, `M' is generated by Alt_L and Alt_R)

	* workspace.jl (next-workspace, previous-workspace): support
	the cycling option again

1999-09-17  John Harper  <john@dcs.warwick.ac.uk>

	* x-cycle.jl: remove the possibility of the stack ids
	overflowing

	* keymap.jl (substitute-key-definition): renamed
	substitute-keymap-command
	(substitute-keymap-event): new function

	* stacking.jl (raise-window): handle case where there's only
	one window, the window being raised

1999-09-16  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (select-workspace): only select the workspace if
	it's not the current workspace

	* workspace.jl: removed cycling functions
	(ws-workspace-windows): renamed workspace-windows

	* cycle.jl: new file, old cycle functions plus `previous'
	variants

	* x-cycle.jl: new file, stack-based window cycling
	* keymaps.jl (global-keymap): bound M-TAB to cycle-windows

1999-09-15  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (override-frame-part-classes): new variable

	* workspace.jl (append-workspace-and-send,
	prepend-workspace-and-send): new commands

1999-09-14  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl, stacking.jl, shading.jl, move-resize.jl,
	maximize.jl, frames.jl, focus.jl: changed interactive `f', `w'
	and `W' codes to `%f', `%w' and `%W'

	* frames.jl (auto-window-type-alist): new variable

	* workspace.jl (unshade-selected-windows): new option

	* gnome.jl (gnome-set-workspace): updated for new workspace
	implementation

	* workspace.jl: major rewrite, removed workspace-list variable,
	workspaces are now just non-negative integers, no state stored
	except in each window's plist and the current and last
	workspace indices

	* mwm.jl (mwm-add-window): remove some buttons when asked

	* frames.jl (remove-frame-class, add-frame-class): only call
	rebuild-frame if there's a frame to rebuild

1999-09-13  John Harper  <john@dcs.warwick.ac.uk>

	* gnome.jl (gnome-add-window): set `ignored' property of gmc
	and panel windows

	* focus.jl (click-to-focus-keymap): now `Any-Click1'

	* move-resize.jl (move-resize-apply): don't snap when opaque
	resizing

1999-09-12  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.6

1999-09-11  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (ws-honour-client-state): new function,
	iconifies windows whose WM_STATE is IconicState

	* frames.jl (frame-part-classes): appended `-button' to names
	of `menu', `iconify', `close' and `maximize' classes

	* workspace.jl (uniconify-window, display-window): handle
	windows that don't have a workspace (i.e. are sticky)
	(window-menu): add an extra menu for iconified windows that
	aren't listed in any of the other menus (since they're not in
	any workspace)

	* sawmill.jl: rearranged loading order again

	* sm-init.jl (sm-saved-window-properties): initialised to nil
	(sm-add-saved-properties): new function
	* frames.jl, maximize.jl, shading.jl, stacking.jl,
	workspace.jl: tell the session manager which window properties
	to save

	* shading.jl (shading-add-window): reset window type to saved
	type if possible

	* menus.jl (popup-menu): be more careful about assuming that a
	menu is already displayed

1999-09-10  John Harper  <john@dcs.warwick.ac.uk>

	* shading.jl: in add-window-hook, monitoring `shaded' property

	* sawmill.jl: reorder module loading; always load shading

	* frames.jl (frame-part-classes): alist associating frame part
	"classes" and an alist of the properties they inherit
	(remove-frame-class, add-frame-class): adding and removing
	parts of frames (but only if the style allows it)

	* gnome.jl (gnome-honour-client-state): don't try to act on the
	state changes, just set the necessary window properties

	* keymaps.jl (border-keymap): new keymap

1999-09-09  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (set-window-frame-style): don't set the window's
	`type' property if it's implicitly defined

	* shading.jl: new file, implements window shading (displaying
	only the title bar)
	* menus.jl (window-ops-menu): add a toggle-shaded item
	* keymaps.jl (title-keymap): bind button1-click2 to toggle
	shading
	* workspace.jl (display-window): unshade the window if necessary
	* gnome.jl: support WIN_STATE_SHADED

	* keymap.jl: new file, some keymap utility functions

	* select-window.jl, move-resize.jl, focus.jl: change
	make-sparse-keymap to make-keymap

	* custom.jl (defcustom): new option `:range (MIN . MAX)' for
	number type, either MIN or MAX may be nil, defaults to 0 and
	unlimited respectively
	* customize.jl (customize-symbol-spec): propagate :range option

	* workspace.jl, move-resize.jl: specify ranges in numeric
	options

1999-09-08  John Harper  <john@dcs.warwick.ac.uk>

	* server.jl (server-init): set the _SAWMILL_SERVER_WIN property
	on the window itself as well as on the root

1999-09-07  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (set-window-frame-style): don't bother wrapping in
	save-stacking-order since set-window-frame preserves it anyway

	* transient.jl (transient-unmap-window): if in click-to-focus
	mode, and there's no parent window to focus, focus the topmost
	window not the window under the pointer

	* customize.jl: removed all the subprocess code, now we just
	fork off the configurator using the system function and forget
	about it

	* server.jl (server-client-message-handler): for async
	requests, delete the property immediately after reading it, not
	after evaluating the form

1999-09-06  John Harper  <john@dcs.warwick.ac.uk>

	* move-resize.jl (move-resize-infer-anchor): if no edges have
	been selected for moving, move the bottom and right

	* stacking.jl (restack-by-depth): try to optimise the
	restacking done, by comparing the old order with the new order

	* move-resize.jl (move-resize-window): set frame-state-mutex to
	`clicked' while dragging the window

	* select-window.jl, move-resize.jl: call (allow-events
	'async-pointer) since active-grabs are now done with
	synchronous event handling

	* gnome.jl (gnome-add-window): new function, set
	focus-proxy-click to t in panel and gmc icons

	* focus.jl (focus-proxy-click): new option, the same symbol can
	also be set in a window's plist
	(focus-in-fun): when in click-to-focus mode, ensure that all
	non-focused windows have the click-to-focus keymap set

	* focus.jl: map focus-add-window over all existing windows at
	startup

	* workspace.jl (display-window): focus the window

1999-09-05  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.5

	* workspace.jl (ws-index): renamed as workspace-index
	(select-workspace): ignore negative indices

	* gnome.jl (gnome-init): set the _WIN_AREA and _WIN_AREA_COUNT
	properties (even though we only have one area), the gnome pager
	doesn't take any notice if we just delete them

	* frames.jl (frame-style-menu): added a `Default' option.
	(set-window-frame-style): move the save-stacking-order macro
	call to this function

	* sm-init.jl (sm-saved-window-properties): save the frame-style
	property

	* frames.jl (auto-frame-style-alist): new variable
	(check-frame-availability): new function
	(set-window-frame-style): give a window a specified frame
	(frame-style-menu): menu constructor for all frame styles

	* menus.jl (window-ops-menu): added a `Frame style' submenu,
	from the frame-style-menu constructor

1999-09-04  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (custom-make-frame-style-widget): use the new
	`frame-style' widget

	* frames.jl (after-setting-frame-option): call
	reframe-all-windows if always-update-frames is set

	* move-resize.jl (move-show-position, resize-show-dimensions):
	new options, when t the window attributes are displayed while
	moving or resizing the window

	* sm-init.jl (sm-init-properties): deleted this function, it's
	now inlined into the initialisation section (since it's only
	called once, why let it consume memory?)

	* frames.jl (set-frame-for-window): only use the
	decorate-transients option if the window actually _is_ a
	transient. Also, store the final window type (so it can be
	saved with the session)

	* workspace.jl (preallocated-workspaces): new defcustom
	(ws-add-window-to-space): abort if window is already in a
	space, remember to hide the window if it's not visible
	(ws-add-window): abort if window is in a space already
	(ws-add-window-to-space-by-index): new function
	(ws-remove-window): never delete the sole remaining workspace
	(ws-add-workspace): if no workspaces exists, make the new one
	current
	(ws-save-session, ws-restore-session): session management hooks
	to preserve the workspace that each window is on

	* sm-save.jl (sm-get-window-state): fixed how the
	sm-window-save-functions results are used

	* gnome.jl (gnome-honour-client-state): honour the
	_WIN_WORKSPACE property

	* mwm.jl, open-look.jl, gnome.jl: moved functions from
	add-window-hook to before-add-window-hook

	* functions.jl (make-directory-recursively): new function
	* customize.jl, custom.jl: when writing into `~/.sawmill', call
	make-directory-recursively first

1999-09-03  John Harper  <john@dcs.warwick.ac.uk>

	* menus.jl (menu-program): this is now under the libexec dir

	* sm-save.jl, sm-load.jl, sm-init.jl, sm-common.jl: the Lisp
	portion of the session management code. Allows arbitrary Lisp
	modules to save and reload their state as well as the standard
	stuff
	* sawmill.jl: require 'sm-init

	* custom.jl: moved the custom file from ~/.sawmill-custom to
	~/.sawmill/custom. The old file will be renamed at startup if
	possible

1999-09-02  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (uniconify-to-current-workspace): improved the
	doc string

	* menus.jl, customize.jl, custom.jl: removed the `menus' and
	`custom' customization groups

	* stacking.jl (stacking-order-by-depth, stack-window-below,
	stack-window-above): new functions
	(raise-window): use x-raise-window where possible, this removes
	the ugly flicker (at least when raising into the top layer)

	* version 0.4

	* menus.jl (menu-stop-process): optional arg FORCE

	* menus.jl (menu-start-process): redirect stderr to nil

1999-08-31  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl, sawmill.jl, keymaps.jl: if batch-mode is
	non-nil, don't do anything that would access the display when
	initialising or shutting down

	* workspace.jl: added symbolic NormalState and IconicState
	constants

	* workspace.jl (ws-set-client-state): new function, in
	window-state-change-hook and add-window-hook

1999-08-30  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill.jl: load custom-set values before .sawmillrc (but
	after sawmill-defaults if no .sawmillrc)

1999-08-29  John Harper  <john@dcs.warwick.ac.uk>

	* menus.jl (window-ops-menu): added some more sub-menus

	* frames.jl: create commands to set the frame of a window to
	each of the possible window types
	(set-frame-for-window): new optional arg TYPE
	

	* customize.jl (customize): require all the custom-require
	features

	* stacking.jl (window-on-top-p): new function

	* move-resize.jl: resizing now chooses the direction to resize
	in by the initial position of the pointer in relation to the
	window frame. The window is divided into a 3x3 grid, the
	pointer must be in one of the outer rectangles for the window
	to resize in that direction

	* server.jl, gnome.jl: only initialise these if not running in
	batch-mode

1999-08-28  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (user-theme-directory, system-theme-directory,
	theme-load-path): new variables
	(load-frame-style, find-all-frame-styles): new functions for
	loading the new-style "themes"

1999-08-27  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl: renamed ws-workspaces as workspace-list, and
	ws-current-workspace as current-workspace

1999-08-26  John Harper  <john@dcs.warwick.ac.uk>

	* move-resize.jl: set frame-draw-mutex to t whilst
	rubber-banding windows

	* themes/simple.jl, themes/brushed-metal.jl,
	themes/absolute-e.jl: reorder image definitions

	* workspace.jl: define commands `select-workspace:X' for 1 <= X
	<= 9

	* stacking.jl (auto-depth-alist): match window names to depths

	* focus.jl: add the click-to-focus keymap to new windows

	* menus.jl: record the input focus when starting a menu, then
	restore it afterwards

	* place-window.jl (place-transient-mode): new variable

	* customize.jl (customize-symbol-spec): propagate the :widget
	attribute to `set' elements

1999-08-25  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl (reframe-all-windows): preserve the original
	stacking order

	* functions.jl (save-stacking-order): new macro

	* stacking.jl: new file, implements `depth' of windows
	* gnome.jl: support the _WIN_LAYER hints

	* keymaps.jl (maximize-button-keymap): new keymap

	* select-window.jl (select-window): check that pointer-grab
	actually succeeds

	* workspace.jl (ws-remove-window): after deleting the last
	workspace, don't select the first workspace, select the last

1999-08-24  John Harper  <john@dcs.warwick.ac.uk>

	* gnome.jl (gnome-init): use the new
	`workspace-state-change-hook' instead of all the individual
	hooks

	* workspace.jl (move-workspace-forwards,
	move-workspace-backwards): new commands, slide the current
	workspace along the list of all workspaces

	* customize.jl (customize): passing this function a group name
	makes it customize that group only
	* custom.jl (custom-menu): menu constructor including all
	customize groups
	(custom-declare-group): create an interactive function
	`customize:FOO' for each group FOO
	* menus.jl: use custom-menu for the customize menu

1999-08-23  John Harper  <john@dcs.warwick.ac.uk>

	* frames.jl: (window-type-remove-title, window-type-remove-border,
	window-type-add-title, window-type-add-border): for windows
	with no title and no border, use the new type `unframed', not
	`shaped-transient'
	* themes/simple.jl, themes/brushed-metal.jl,
	themes/absolute-e.jl: set `unframed' windows to the `nil-frame'

	* server.jl (server-init): new function

	* version 0.3a

	* move-resize.jl: query the _current_ mouse position, not the
	last seen in an event

	* menus.jl: menus now work asynchronously, some hackery to get
	the focus back before calling the selected command

	* maximize.jl (unmaximize-window): optional arg DIRECTION as
	with maximize-window, allows selective unmaximization

	* gnome.jl: support the MAXIMIZED window states

	* server.jl: for asynchronous requests delete the property
	after reading it (so the client knows when it can continue)

	* edges.jl (snap-window-position-to-edges): minor fix

1999-08-22  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.3

	* server.jl: new file, handle ClientMessages initiating
	sawmill-client requests
	* sawmill.jl: require server
	* sawmill-defaults.jl: don't call server-open anymore

	* maximize.jl: new file, window maximization
	* menus.jl (window-ops-menu): added maximize commands

	* customize.jl (customize-sentinel): write out the custom
	script when the process exits

	* auto-raise.jl (rw-on-focus): handle case where timeout is
	zero

	* move-resize.jl (move-resize-window): temporarily bind
	unbound-key-hook to nil, otherwise the gnome code may cause
	havoc

	* functions.jl (with-server-grabbed): new macro

	* move-resize.jl (move-resize-window): put the call to
	ungrab-server back into the tail of the unwind-protect where it
	should be; also be aware that move-resize-mode may have changed

	* place-window.jl (place-window): fix the `interactive'
	placement mode

	* open-look.jl, mwm.jl: new files, implement some of the Motif
	and OpenLook window hints 
	* sawmill.jl: require mwm and open-look

	* frames.jl (window-type): moved from transient.jl; if the
	window has a `type' property, this is assumed to be the window
	type
	(window-type-remove-title, window-type-remove-border,
	window-type-add-title, window-type-add-border): new functions

1999-08-21  John Harper  <john@dcs.warwick.ac.uk>

	* focus.jl (focus-mode): new variable, replaces sloppy-focus.
	Implemented click-to-focus mode

	* move-resize.jl (move-window-interactively,
	resize-window-interactively): use the `W' interactive decl

	* workspace.jl (ws-client-msg-handler): handle WM_CHANGE_STATE
	messages (i.e. iconification requests)

	* gnome.jl: new file, replaces the libgnome.so dl

1999-08-20  John Harper  <john@dcs.warwick.ac.uk>

	* move-resize.jl (move-resize-window): fix error when there's
	no current-event

	* workspace.jl (next-window): new command, cycles through all
	uniconified windows on all workspaces

1999-08-19  John Harper  <john@dcs.warwick.ac.uk>

	* edges.jl: new file, some utilities for dealing with window
	edges
	* move-resize.jl (move-snap-edges, move-snap-epsilon):
	variables controlling window edge snapping whilst moving

	* custom.jl (custom-add-to-group): ensure that only one
	instance of any symbol is added to the group

1999-08-16  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.2

	* transient.jl (transient-unmap-window): if the window being
	unmapped is focused, and there's no transient-parent to focus
	on, then focus on the window under the pointer (in case the
	pointer isn't in the unmapped window)

1999-08-15  John Harper  <john@dcs.warwick.ac.uk>

	* keymaps.jl: keymaps are now customizable

	* customize.jl (customize-ui-spec): call each group's :widget
	function if defined
	(about): a new group, just contains a label with some
	info/legalese

	* custom.jl (custom-declare-variable): new keyword :before-set,
	similar to :after-set
	(custom-declare-group): this now takes a list of keywords as
	with defcustom. The only keyword currently is :widget, a
	function to call to layout the page containing the user
	interface elements of the group

1999-08-14  John Harper  <john@dcs.warwick.ac.uk>

	* keymaps.jl: add a label to the `bindings' group noting that
	keybindings aren't implemented
	* custom.jl: added group `bindings'

	* transient.jl (focus-windows-when-mapped): new variable, any
	newly-mapped window is given the input focus

1999-08-13  John Harper  <john@dcs.warwick.ac.uk>

	* themes/simple.jl: defined the missing three frame types;
	border colors are now configurable

	* keymaps.jl (iconify-button-keymap): Button3 is now bound to
	`popup-window-menu'

	* customize.jl (customize-symbol-spec): use the `color' widget
	for colors

	* transient.jl (transients-get-focus): moved to custom group
	`focus'

	* custom.jl (custom-declare-variable): remember to check for
	:widget keyword

	* workspace.jl (ws-merge-workspaces): call the
	delete-workspace-hook after deleting the source workspace

1999-08-12  John Harper  <john@dcs.warwick.ac.uk>

	* place-window.jl (place-window): for random placement, use the
	dimensions of the window frame not the client window

	* transient.jl (transient-unmap-window): new function, used to
	return the focus from a transient to its parent when the
	transient window gets unmapped

	* move-resize.jl (move-resize-window): fix the bug whereby the
	first motion event was ignored (making the pointer and window
	get out of sync). If the command is called from a motion event,
	then look at the position of the _previous_ pointer event, and
	start moving from there

1999-08-11  John Harper  <john@dcs.warwick.ac.uk>

	* customize.jl (customize-stop-process): only kill the process
	when it's actually running

	* custom.jl (defcustom): new tag :after-set defines a function
	to call after setting the variable

	* frames.jl (decorate-transients): controls whether transient
	windows get reduced or normal frames

1999-08-09  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-defaults.jl: remove some settings that are normally
	set by customize
	* sawmill.jl: load absolute-e if no frame otherwise specified

	* simple.jl, brushed-metal.jl, absolute-e.jl: moved to the new
	`themes' subdirectory

	* frames.jl: new file, inherited the frame setting logic from
	transient.jl. Removed the frameset idea, now we have `frame
	styles' which are functions; they return the frame to use for a
	given window. Also support customization of the default	style
	* transient.jl: moved frame stuff to frames.jl

	* custom.jl, customize.jl: new custom properties `custom-set',
	`custom-get' and `custom-widget'; inherited from type if not
	set in each symbol. New types `font' and `color'. New group
	`appearance'

1999-08-07  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (raise-selected-windows,
	warp-to-selected-windows): new variables

	* custom.jl: new file, inspired by Emacs' customize system.
	This file allows Lisp libraries to declare their configurable
	settings (and their types)

	* customize.jl: new file, this uses the defcustom information
	to present the user a graphical configuration interface. These
	settings are stored in ~/.sawmill-custom and loaded on
	initialisation

	* workspace.jl, transient.jl, place-window.jl, move-resize.jl,
	menus.jl, focus.jl, auto-raise.jl: changed some defvar's to
	suitable defcustom's

	* sawmill.jl: load custom settings

1999-08-06  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (display-window): raise the chosen window

1999-08-03  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.1

1999-08-02  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (ws-add-window-to-space): abort if the window is
	marked as being sticky

	* workspace.jl: call window-state-change-hook when the window's
	``state'' (i.e. sticky, iconified, ..) changes

	* workspace.jl (toggle-window-sticky): new command
	(ws-remove-window): new optional argument DONT-HIDE

	* keymaps.jl (window-keymap): bind "M-Button2" to
	popup-window-menu

	* workspace.jl: where appropriate use call-window-hook instead
	of call-hook

	* workspace.jl (transients-on-parents-workspace): new variable
	(merge-next-workspace, merge-previous-workspace,
	insert-workspace): new commands, in the workspace menu
	(popup-workspace-list, popup-window-list): new commands

	* transient.jl (transients-get-focus): new variable, when t
	mapping transient windows whose parent is focused passes the
	focus to the transient

	* place-window.jl (place-window): fix a missing
	close-parenthesis

1999-08-01  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (ws-remove-window): fix the bug whereby deleting
	the last workspace didn't nullify ws-current-workspace. Also
	ensure that both remove-from-workspace and
	delete-workspace-hook are only called _after_ the deletion has
	occurred. remove-from-workspace now gets two args: window and
	workspace

1999-07-31  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl: new hook `delete-workspace-hook'

	* transient.jl (ignored-window-names, sticky-window-names): new
	variables, lists of regexps

	* sawmill-defaults.jl: removed the user-add-window function,
	added some comments about getting GNOME support

	* place-window.jl (ignore-program-positions): program specified
	window positions are ignored if this is set. User specified
	positions are never ignored

	* keymaps.jl: bind the root menu to Button2 not Button1

1999-07-30  John Harper  <john@dcs.warwick.ac.uk>

	* menus.jl (menu-program-stays-running): if this variable is a
	number, it defines how long (in seconds) that a menu subprocess
	is allowed to stay running between menus being required.
	Default is one minute

1999-07-29  John Harper  <john@dcs.warwick.ac.uk>

	* simple.jl, brushed-metal.jl, absolute-e.jl: changes for
	framesets

	* transient.jl: introduce the frameset idea, an alist of frames

	* auto-raise.jl: new file, uses a timer to work correctly
	(raise-windows-on-focus): can now be a regexp matching window
	names to raise
	* focus.jl: removed the auto-raise stuff

1999-07-28  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (next-workspace-window): new command

	* focus.jl (focus-raise): synchronise the server before timing
	out

1999-07-28  Stewart Perry  <scp@dcs.warwick.ac.uk>

	* focus.jl (raise-windows-on-focus, raise-window-timeout): new
	variables, auto-raise functionality

1999-07-28  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-defaults.jl: set the frame to `nil-frame' to turn off
	the frame, not to nil

	* transient.jl (transient-add-window): only set the frame if
	it's currently nil, set it to default-frame if not transient or
	shaped

	* simple.jl, brushed-metal.jl, absolute-e.jl: frames are
	defined as lists now

	* absolute-e.jl: added shaped and shaped-transient frames

	* transient.jl: now looks for shaped windows as well as
	transients

1999-07-26  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (raise-window-on-uniconify): new variable

	* menus.jl (apps-menu): new variable, the "Applications" item
	of the root menu

1999-07-25  John Harper  <john@dcs.warwick.ac.uk>

	* workspace.jl (cycle-through-workspaces,
	delete-workspaces-when-empty, uniconify-to-current-workspace,
	static-workspace-menus): new variables
	(workspace-menu, window-menu): dynamic menu constructors
	(iconify-window, uniconify-window): new commands

	* sawmill.jl: load some more libraries

	* place-window.jl: this uses the new place-window-hook. But
	random placement is still the only working option

	* move-resize.jl: now obeys most of the window's size hints
	(all but the aspect ratios)

	* menus.jl: implement popup menus using the sawmill-ui script

	* functions.jl (get-window-by-name, get-window-by-id): new
	functions

	* keymaps.jl: some more bindings
	(root-window-keymap): new keymap

