2002-05-06  John Harper  <jsh@unfactored.org>

	* More merging from HEAD:

	2002-04-22  John Harper  <jsh@unfactored.org>

	* functions.c (Fset_x_text_property): added optional fourth arg
	ENCODING-ATOM. To allow #67397 to be fixed

	* events.c: more focus change fallout

2002-04-21  John Harper  <jsh@unfactored.org>

	* Merged changes from HEAD:

	2002-04-21  John Harper  <jsh@unfactored.org>

	* events.c (events_init): pointer-motion-threshold isn't set

	2002-04-17  John Harper  <jsh@unfactored.org>

	Work to fix fallout from fix for #67958 (focus getting lost
	sometimes):

	* windows.c (pending_focus_window): deleted this variable

	(focus_off_window): if the window is the one that's currently
	focused, call XSetInputFocus to immediately transfer focus to
	our window that gets the focus if nothing else has it. This
	avoids us getting left with nothing focused (e.g. if we send
	WM_TAKE_FOCUS to a window that doesn't accept the focus)

	* windows.c (commit_queued_focus_change): disabled call to
	check_for_lost_focus ()

	* windows.c (find_window_by_id, x_find_window_by_id): don't do
	debugging printing here
	* events.c (handle_input_mask): print names of windows when
	debugging is enabled

	2002-04-12  John Harper  <jsh@unfactored.org>

	* windows.c (remove_window, install_window_frame,
	remove_window_frame): update pending_focus_window and
	queued_focus_id as necessary (fixes a "lost focus" bug)

	2002-04-09  John Harper  <jsh@unfactored.org>

	* windows.c (commit_queued_focus_change, focus_on_window,
	focus_off_window): removed broken "timestamp - 1" kludge.
	Instead defer both sending WM_TAKE_FOCUS and focusing windows
	until idle time. Fixes #67958

	* events.c (button_press, motion_notify): only accept pointer
	events we're expecting (either directly on one of our windows,
	or while the pointer is grabbed)
	(mark_pointer_grabbed, ungrab_pointer): new functions
	* main.c, keys.c, functions.c, frames.c: call ungrab_pointer ()
	instead of XUngrabPointer (). Fixes #44239

	* images.c (bevel_pixel): use integer arithmetic
	* sawmill.h: define CLAMP macro

	* main.c (main): if DEBUG == 1, put stdout into line buffering
	mode

	2002-04-08  John Harper  <jsh@unfactored.org>

	* libclient.c (unix_server_init): print an error message if
	connect () fails

	2002-04-03  John Harper  <jsh@unfactored.org>

	* display.c (error_handler): only interpret BadWindow and
	BadDrawable errors as meaning that a window died. May fix
	#74799

	2002-04-02  John Harper  <jsh@unfactored.org>

	* events.c (Fx_server_timestamp): added another arg STORE. When
	true, save the timestamp for later use.. needed for #77041

	2002-03-19  John Harper  <jsh@unfactored.org>

	* functions.c (message_event_handler): only redraw on the final
	expose event

2002-03-19  John Harper  <jsh@unfactored.org>

	* Merged changes from HEAD:

	2002-03-01  John Harper  <jsh@pixelslut.com>

	* windows.c (manage_windows): unmap the window before faking
	the call to the map-request event handler. Fixes #67601 (causes
	the expected map-notify event to be sent when we later map it)

	2002-02-17  John Harper  <jsh@unfactored.org>

	* windows.c (remove_window): check for w->id == 0 immediately
	before calling remove_from_stacking_list (). Avoids triggering
	an assertion on logout (since remove_window () may be called
	recursively from the error handler!)

	2002-01-24  John Harper  <jsh@unfactored.org>

	* frames.c: fixed definitions of Qtop and Qbottom. This bug
	must have existed forever!

2002-01-10  Sander Vesik <sander.vesik@sun.com>

	* image.c: gdk_pixbuf_new_from_file now takes two parameters

	* main.c: conditionaly include glib-object.h and call
	g_type_init() if we are using gdk_pixbuf

	* gtk-style.c: GtkRcStyle no longer has font and font_set
	members

	* sawmill.h: gdk-pixbuf-xlib.h now lives in gdk-pixbuf-xlib

2001-12-05  John Harper  <jsh@unfactored.org>

	* windows.c (Fwindow_visibility): check argument is windowp
	(patch from Michal Maru¹ka <mmc@maruska.dyndns.org>)

2001-11-12  John Harper  <jsh@unfactored.org>

	Fixed bug of not rereading WM_WINDOW_PROTOCOLS when it changes:

	* events.c (property_notify): call get_window_protocols on
	WM_WINDOW_PROTOCOLS events

	* windows.c (get_window_protocols): clear the window's
	does_wm_X flags before reading the property

2001-11-03  John Harper  <jsh@unfactored.org>

	Fixed bug where Nautilus windows often don't get focused in
	focus follows mouse mode:

	* windows.c (focus_on_window): don't call XSetInputFocus ()
	directly store the parameters for later

	(commit_queued_focus_change): new function, calls
	XSetInputFocus () if there's a queued focus change waiting

	* events.c (handle_input_mask): call commit_queued_focus_change
	() before exiting

2001-10-21  John Harper  <jsh@unfactored.org>

	Fixed bug where warp-cursor doesn't invalidate the pointer
	location cache:

	* functions.c (Fwarp_cursor): call
	invalidate_cached_mouse_position after warping the cursor

	* events.c (invalidate_cached_mouse_position): new function

2001-10-14  John Harper  <jsh@unfactored.org>

	* version 1.0.1

2001-08-31  John Harper  <jsh@pixelslut.com>

	* windows.c (focus_on_window): subtract one from the last seen
	server timestamp when sending the WM_TAKE_FOCUS message. The
	explanatory comment in the source reads:

	The -1 is an Ugly Hack. The problem is with the case where the
	window focuses itself after receiving the WM_TAKE_FOCUS
	message. If during the time between us sending the client
	message and the window focusing itself we focused another
	window using the same timestamp, the original window (that
	received the client message) will still get focused.

	I'm assuming that it's unlikely that two events will arrive
	generating focus changes with timestamps that only differ by
	one..

2001-08-24  John Harper  <jsh@pixelslut.com>

	* events.c (unmap_notify): call remove_window () on unmapped
	(withdrawn) windows. This fixes some standards-compliance bugs
	due to us handling windows differently the second time they're
	mapped than the first

2001-07-02  John Harper  <jsh@pixelslut.com>

	* version 0.99

2001-06-20  John Harper  <jsh@pixelslut.com>

	* sawmill_subrs.h, multihead.c, main.c, Makefile.in: support a
	`--multiehead' command-line option. When given and the X server
	has more than one screen, fork extra copies of sawfish for each
	extra screen. This has some fundamental problems (e.g. the
	copies share files in ~/.sawfish without any synchronization),
	but seems to be useful for some people..

	The other people who contributed to this feature are Michael
	Vogt and Mahmood Ali

2001-06-12  John Harper  <jsh@pixelslut.com>

	* display.c (sys_init): if XQueryShapeExtension fails, print a
	message and terminate the wm

2001-06-04  John Harper  <jsh@pixelslut.com>

	* windows.c (focus_on_window): don't update focus_window after
	calling XSetInputFocus (), instead wait for the focus-in event
	to do this

	(pending_focus_window): new variable to make this work
	correctly

	(focus_off_window): new function, called when a window becomes
	unfocusable

	* events.c (unmap_notify): call focus_off_window
	(focus_in): nullify pending_focus_window if it actually gets
	focused

2001-05-22  John Harper  <jsh@pixelslut.com>

	Fixed bug 8220 (Having Ctrl as default "modifier key used for
	default WM shortcuts" breaks everything...):

	* keys.c (wm_mod): default window manager modifier is once more
	`M-' instead of `C-'

2001-05-04  John Harper  <jsh@eazel.com>

	* keys.h, keys.c: added support for Off2 and Off3 event types
	(button release events). Also changed it so that Click1 events
	now print as `Click'

2001-04-22  John Harper  <jsh@eazel.com>

	* colors.c (colors_init): use `#000000' instead of `black'.
	This will still work even if rgb.txt doesn't exist. Also check
	for Fget_color () throwing an exception

2001-04-11  John Harper  <jsh@eazel.com>

	Fixed bug 6970 (X plugin doesn't update width and height of
	drawable structure):

	* x.c (x_window_note_changes): new function, called by
	Fx_configure_window () after making changes

2001-03-29  John Harper  <jsh@eazel.com>

	Fixed an ICCCM compliance problem:

	* functions.c, events.c (configure_request, Fresize_window_to,
	Fmove_resize_window_to): don't send a synthetic configure
	notify event if the window was resized (in which case a real
	configure notify was generated)

2001-03-21  John Harper  <jsh@eazel.com>

	* fonts.c (x_create_font_set): reverted the last change to
	merge calls to setlocale (). (I had failed to realize that the
	result of calling setlocale describes the current locale not
	the original one). Also added some code to copy the returned
	locale name since it's in a static buffer

2001-03-19  John Harper  <jsh@eazel.com>

	* windows.c, sawmill.h: moved XUrgencyHint definition to
	sawmill.h

2001-03-14  John Harper  <jsh@eazel.com>

	* version 0.38

2001-03-09  John Harper  <jsh@eazel.com>

	* cursors.c (cursors_init): set default_cursor to Qnil when in
	batch mode (to prevent Fdefault_cursor () returning a null
	value)

2001-03-07  John Harper  <jsh@eazel.com>

	* functions.c (Fx_raise_window, Fx_lower_window): when these
	functions are given a sibling, check if it has been destroyed.
	If so, do nothing to the stacking order

	(This should fix a failed assertion that Ramiro and Duane were
	seeing)

2001-02-26  John Harper  <jsh@eazel.com>

	* keys.c (wm_mod): changed default value from EV_MOD_META to
	ControlMask. Part of my fix to bug 7073

2001-02-19  John Harper  <jsh@eazel.com>

	* version 0.37.3

	* windows.c (install_window_frame, remove_window_frame): only
	do the reparenting if the window hasn't been destroyed

	* stacking-list.c (restack_window): just return immediately if
	the window has already been destroyed

	* stacking-list.c (window_in_stacking_list_p): new predicate,
	used to replace the assert_window_[not_]in_stacking_list
	functions (which have been deleted)

2001-02-18  John Harper  <jsh@eazel.com>

	* functions.c (Frestack_windows, Fx_raise_window,
	Fx_lower_window): be sure to never alter the stacking of
	destroyed windows

	[ I think this should fix the random crashes that some people
	have been experiencing - it was possible for a deleted window
	to be reinserted in the stacking list. Then, when the deleted
	window got garbage collected bogus pointers were left in the
	list.. ]

	* stacking-list.c: added yet more assertions, this time to
	check that destroyed windows aren't being manipulated where
	they shouldn't be

	* sawmill.h (WINDOW_IS_GONE_P): new macro, evaluates to true
	when the window object no longer has an associated client
	window
      	
	* windows.c, frames.c, display.c, keys.c: use the above macro
	instead of `w->id == 0'

2001-02-16  John Harper  <jsh@eazel.com>

	* stacking-list.c (assert_window_in_stacking_list,
	assert_window_not_in_stacking_list): new functions

	* windows.c: use the stacking-list assertions in sensible
	places

2001-02-15  John Harper  <jsh@eazel.com>

	* stacking-list.c: added debugging assertions

2001-02-13  John Harper  <jsh@eazel.com>

	* version 0.37

	* windows.c (remove_window): only call
	remove_from_stacking_list () once per window

2001-02-11  John Harper  <jsh@eazel.com>

	* session.c (save_yourself_2): set outstanding_save_done to
	false after calling SmcSaveYourselfDone ()

2001-02-09  John Harper  <jsh@eazel.com>

	Work to cache the stacking order of windows locally - this
	fixes the bug where reparenting windows screws the stacking
	order and therefore makes the constraint-based stacking code go
	haywire. It's also an efficiency win since we don't need to
	keep asking the server for the order

	* stacking-list.c: new file, code to maintain and manipulate a
	doubly linked list of all managed windows, representing the
	current stacking order. Also has a function to restack a window
	such that it's consistent with its position in the list

	* sawmill.h (Lisp_Window): new fields `above' and `below' -
	linkage for the stacking list

	* functions.c (Frestack_windows, Fx_raise_window,
	Fx_lower_window): these are now implemented in terms of the
	stacking list primitives. The method is simple: get the list
	into the new order, then call restack_window () on any windows
	that changed position in the list

	* windows.c (Fstacking_order): just call make_stacking_list ()

	(add_window, remove_window): add and remove the window from the
	stacking list

	(install_window_frame, remove_window_frame): after calling
	XReparentWindow (), call restack_window () to fix the stacking
	order of the window - this fixes the original bug

2001-02-07  John Harper  <jsh@eazel.com>

	* colors.c (Fget_color): don't try to call XParseColor if we
	have no display connection, just return nil. Patch from merlin
	<merlin@merlin.org

	* fonts.c (x_create_font_set): merged two calls to setlocale ()
	into one. This also avoids problems with its possibly static
	buffer

2001-02-06  John Harper  <jsh@eazel.com>

	* functions.c (functions_init): call XineramaQueryExtension
	before XineramaQueryScreens (in case the extension isn't
	present)

2001-01-28  John Harper  <jsh@eazel.com>

	* session.c (shutdown_cancelled): if we've not already, send a
	SaveYourselfDone message (required by the XSM protocol)

	* main.c (Fexit_type): new function, returns the type of exit
	currently in progress, one of the symbols: `user-quit',
	`user-restart', `session-quit' (or nil if no exit in progress)

	* events.c (save_timestamp): (try to) be more intelligent when
	detecting out of order timestamps. Instead of just discarding
	them, fetch the real time from the X server, then set
	`last_event_time' to the timestamp closest to the current
	server time.

	This avoids sometimes dropping valid timestamps (e.g. after an
	APM resume, focus changes could be lost for a short time)

2001-01-20  John Harper  <jsh@eazel.com>

	* version 0.36

2001-01-18  John Harper  <jsh@eazel.com>

	* windows.c: work around XUrgencyHint only being defined on
	X11R6 and later

2001-01-17  John Harper  <jsh@eazel.com>

	* frames.c (set_frame_shapes): apply the mask of the image
	associated with	the current state of the frame part, not always
	the inactive state

	* frames.c (set_frame_part_bg): if applying a pixmap with no
	mask, set the shape to be the rectangle defined by the edges of
	the frame part. This fixes the bug where parts in which only
	some of the constituent images have alpha channels, get
	corrupted when resized

	* frames.c (configure_frame_part): if the window already
	exists, call XClearArea () to generate an Expose event. This
	fixes the bug where window decorations can update
	inconsistently when resizing windows

2001-01-15  John Harper  <jsh@eazel.com>

	* keys.c (Fbind_keys): signal an error when <1 arg, don't just
	return rep_NULL (which may cause a crash later)

2001-01-09  John Harper  <jsh@eazel.com>

	* windows.c (Fwindow_icon_image): added support for icons
	stored on the KWM_WIN_ICON property (aka `mini icons'). Only
	used when there's no icon in WM_HINTS

	* images.c (Fcrop_image): fix typo when checking validity of
	HEIGHT parameter (patch from martin@whoever.com)

2001-01-05  John Harper  <jsh@eazel.com>

	* version 0.35

2001-01-04  John Harper  <jsh@eazel.com>

	* events.c (map_request): be sure to map the frame (if
	appropriate) _before_ calling the map-notify-hook. Otherwise X
	errors can result from code thinking the frame is visible when
	it isn't yet. Fixes bug 5243 (shaded windows die on restart)

2001-01-02  John Harper  <jsh@eazel.com>

	* images.c (Fcomposite_images): fixed bugs in both gdk-pixbuf
	and Imlib versions

2000-12-30  John Harper  <jsh@eazel.com>

	* gtk-style.c (states): reordered this array so that it matches
	the actual GtkStateType enum. Patch from <michaelj@maine.rr.com>

2000-12-22  John Harper  <jsh@eazel.com>

	* images.c (Fmake_image_from_x_drawable): special cased (=
	depth 1) case for gdk-pixbuf substrate

2000-12-18  John Harper  <jsh@eazel.com>

	* keys.c (direct_modifiers): only substitute physical for
	virtual modifiers if the physical modifiers actually exist.
	Otherwise just preserve the virtual bits

	(translate_event_to_x_button, translate_event_to_x_key): if
	after translating modifiers, any virtual modifiers still exist,
	don't accept the event

	* keys.h (EV_VIRT_MOD_MASK): new definition, the bits
	representing virtual (non X-native) modifiers

2000-12-05  John Harper  <jsh@eazel.com>

	* keys.c (lookup_event): reject events if they're button events
	but don't have at least one button modifier (or the `Any'
	modifier) set. Fixes #4983

2000-12-04  John Harper  <jsh@eazel.com>

	* keys.c: support Button6 and Button7
	* keys.h: define Button6 and Button7 values to their logical
	values (known to work on XFree86 version 4)

	[ adapted from a patch by Steve Haslam <araqnid@debian.org> ]

	* images.c (Fimage_modifier, Fset_image_modifier): fixed bug of
	not accepting () to stand for all three color components

	* version 0.34

2000-11-28  John Harper  <jsh@eazel.com>

	* keys.c (wm_mods, Fwm_modifier, Fset_wm_modifier): a new
	modifier, `W-', that's user-settable
	(Fevent_match): new function for comparing events

	* keys.h (EV_MOD_WM): new bit

2000-11-27  John Harper  <jsh@eazel.com>

	* x.c (x_window_event_handler): ignore any expose events which
	don't have a zero `count' field

2000-11-26  John Harper  <jsh@eazel.com>

	* events.c, functions.c (client_message, Fget_x_property): when
	converting from 32-bit data use rep_make_long_uint () instead
	of rep_MAKE_INT () (which will fail on large values)

2000-11-20  John Harper  <jsh@eazel.com>

	* events.c (focus_out): if unable to find a window, check for a
	deleted window, and nullify focus_window variable if one is
	found

	* windows.c (remove_window): don't nullify focus_window if
	removing the focused window
	(window_mark_type): mark focus_window variable

	* events.c, functions.c, windows.c (Fquery_pointer,
	Fquery_pointer_window, Flist_x_properties, Fget_x_property,
	Fstacking_order): don't call emit_pending_destroys () after
	round trip requests, let them be delivered synchronously

	* events.c: removed all the ignore-fp-keymap stuff

2000-11-18  John Harper  <jsh@eazel.com>

	* x.c (x_window_event_handler): pass the window as the second
	argument to event handlers (event type is the first). Patch
	from Unai Uribarri Rodríguez <unaiur@telecable.es>

2000-11-16  John Harper  <jsh@eazel.com>

	* main.c (sawfish_symbols): defvar `sawfish-locale-directory'
	to the value of the SAWFISH_LOCALEDIR macro

2000-11-14  John Harper  <jsh@eazel.com>

	* windows.c (register_property_monitor, Fwindow_put): a general
	interface for getting notification when the value of a window
	property is changed

	* keys.c (keymap_prop_change): property change handler for
	Qkeymap (used to be embedded into Fwindow_put)

	* events.c (ignore_fp_prop_change): called when the
	ignore-fp-keymap property is changed, if a context map is
	cached, recompute it (really fixes #4708)

	* events.c (current_context_map): cache the context map across
	calls
	(flush_current_context_map): new function

	(button_press, motion_notify): new semantics for context maps
	in motion events, the map is the map that was active when the
	button-press event was received. This fixes the
	fast-window-drag bug #4708

2000-11-13  John Harper  <jsh@eazel.com>

	* version 0.33.1

2000-11-10  John Harper  <jsh@eazel.com>

	* events.c (current_context_map): new function, replaces the
	variable of the same name (the context map may now change
	depending on the environment, so it's not cachable). If the
	window's ignore-fp-keymap property is set, give a null context
	keymap

2000-11-08  John Harper  <jsh@eazel.com>

	* version 0.33

2000-11-07  John Harper  <jsh@eazel.com>

	* frames.c (set_frame_shapes): fix stupid bug of getting
	dimensions of scaled images wrong (introduced by the last
	change)

2000-11-06  John Harper  <jsh@eazel.com>

	* frames.c (apply_mask): local function to clip a mask (if
	required) before union'ing it onto the destination window

	(set_frame_shapes): use apply_mask () to form the image mask,
	otherwise only images whose dimensions are an integer multiple
	of the tiled image can be created without corrupting the
	surrounding state. Fixes #4519

	* pixmap-cache.c: added code to disable the pixmap cache if
	DISABLE_CACHE preprocessor macro is defined

2000-11-02  John Harper  <jsh@eazel.com>

	* events.c (focus_in, focus_out): pass MODE parameter to
	focus-{in,out}-hook as for leave/enter hooks

2000-10-28  John Harper  <jsh@eazel.com>

	* windows.c (window_input_hint_p): new function
	(focus_on_window, Fwindow_wants_input_p): use
	window_input_hint_p. Fixes the bug where window-wants-input-p
	wasn't checking if the InputHint flag was set before reading
	the value

2000-10-24  John Harper  <jsh@eazel.com>

	* events.c: reverted last change (it breaks some focus stuff),
	instead the leave/enter hooks pass an extra argument: MODE, one
	of the symbols `normal', `grab' or `ungrab', the xcrossing.mode
	field of the event

	* events.c: only call leave-notify-hook or enter-notify-hook
	for NotifyNormal events (i.e. ignore Grab/Ungrab events since
	they don't really represent the pointer crossing window
	boundaries)

2000-10-22  John Harper  <jsh@eazel.com>

	* functions.c (Fdisplay_message): new attribute `head . ID'
	specifying the head to centre the message on. Adapted from a
	patch from Geoff Reedy <vader21@imsa.edu>

2000-10-19  John Harper  <jsh@eazel.com>

	* version 0.32

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

	* events.c (property_notify): track changes to the
	flags.XUrgencyHint field, invoke window-state-change-hook when
	it flips (passing `urgency' state). Also fixed some obscure gc
	protection stuff

	* windows.c (Fwindow_urgent_p): new function

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

	* keys.c (eval_input_event): only set current_event to null
	when leaving the top-level event loop. This helps when working
	with multiple commands and/or event loops

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

	* windows.c (Fwindow_wants_input_p): if no WM_HINTS, default to
	false. Also if the window supports WM_TAKE_FOCUS, always return
	true

	(focus_on_window): if sending a WM_TAKE_FOCUS message, only
	explicitly focus on the window if it's accepts-input hint is
	set

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

	* fake-libexec: patch from John H. Palmieri
	<palmieri@math.washington.edu> to link to libfoo.so as well as
	foo.la (for Tru64?)

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

	* images.c (images_init): check return value of imlib_init ()
	and bail out if failure

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

	* version 0.31

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

	* sawmill.h (Lisp_Window): added bitfield `pending_reshape'

	* frames.c (queue_reshape_frame, commit_queued_reshapes): new
	functions to allow calls to set_frame_shapes () to be buffered

	(set_frame_part_bg): if the background changes, queue a reshape
	of the frame. This removes the long-standing misfeature that
	the different states of each frame part must have the same
	shape

	[ it also means that a lot of needless shaping is happening;
	this could perhaps be reduced by writing a function that just
	calculates the shape of a given sub-region of the frame ]

	* events.c (shape_notify): use queue_reshape_frame () instead
	of set_frame_shapes ()

	* display.c (redisplay): call commit_queued_reshapes ()

	* play-sample.c: exit fn is called rep_dl_kill not rep_dl_exit

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

	* x.c: make r_fns and x_fns global, and initialize them once
	(non-constant array initializers are a GCC extension)

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

	* keys.c (lookup_event): when canonifying shifted keysyms,
	don't lose the S- modifier if the shifted and non-shifted
	keysyms are the same (adapted from E. Jay Berkenbilt)

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

	* images.c (Fcomposite_images): implemented for Imlib

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

	* keys.c (lookup_event): canonify `S-x' -> `X'

	* x.c, windows.c, session.c, selection.c, main.c, keys.c,
	images.c, functions.c, frames.c, fonts.c, events.c, cursors.c,
	colors.c: magic doc-string comments now include module names

	* images.c (Fmake_sized_image): include an alpha channel when
	using gdk-pixbuf
	(set_pixel): if the image doesn't have an alpha channel, and
	the new value requires it, add it to the image

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

	* images.c (Fscale_image, Fcomposite_images, Fcrop_image): new
	functions. (composite-image isn't implemented for Imlib yet)

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

	* sawmill-menu.jl, sawfish-client.jl: moved to ../scripts

	* events.c (record_mouse_position): handle pointer motion
	threshold
	(motion_notify): only evaluate the event if pointer_in_motion
	is true

	* sawmill.h (POS, ABS): new macros

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

	* keys.c (eval_input_event): removed `yow!' message and
	associated call to Fbeep ()

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

	* keys.c (window_getting_button_event): new function
	(Fsynthesize_event): for pointer events use
	window_getting_button_event () to locate a suitable window to
	send the event to (one that selects for pointer events)
	(adapted from E. Jay Berkenbilt <ejb@ql.org>, adapted from gwm)

	* functions.c, frames.c, events.c: doc/comment fixes

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

	* windows.c (Fset_input_focus): treat Qroot arg as Qnil (since
	root-window-keymap is searched when no_focus_window is active)

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

	* windows.c (add_window): call place-window-hook if
	`initialising' is true; this is the only time that
	place-window-hook is called on a window with the 'placed
	property
	(windows_kill): call remove-window-hook before calling
	remove_window () on each managed window

	* windows.c (emit_pending_destroys): don't decrement
	pending_destroys each iteration, just zero it before exiting

	* windows.c (remove_window): if !destroyed and !from_error,
	reinstall the original border-width of the client window
	(adapted from E. Jay Berkenbilt <ejb@ql.org>)

	* functions.c: if TEST_XINERAMA is defined, fakes a two-headed
	Xinerama config, for testing purposes

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

	* functions.c (Ffind_head): this was totally broken

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

	* main.c (inner_main): call rep_top_level_recursive_edit ()
	instead of Frecursive_edit ()

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

	* x.c: Integrated patch from Ryan Pavlik <rpav@mythosource.org>
	to support a load more GC attributes, plus a new function
	x-gc-set-dashes. Cleaned the whole file to match my usual
	coding style

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

	* sawmill-menu.jl: use #!optional and #!rest instead of
	deprecated &optional and &rest

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

	* server.h, libclient.h, libclient.c, client.c: server now
	reliably communicates errors back to the client (as `(signal
	'remote-sawfish (list DATA))' where DATA is a string). Also
	renamed the sockets and X properties. The X protocol now
	includes a version number

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

	* events.c (configure_request): don't adjust for frame offset
	when marshalling position

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

	* x.c (create_x_drawable): initialize event_handler field
	(patch from Matt Tucker <tuck@whistlingfish.net>)

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

	* frames.c (create_window_frame): don't try to reframe windows
	with a non-null list of frame parts, just print an error

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

	* main.c: changed the usage printing method

2000-07-27  John Harper  <john@dcs.warwick.ac.uk>

	* x.c, windows.c, session.c, selection.c, play-sample.c,
	main.c, keys.c, images.c, gradient.c, functions.c, frames.c,
	fonts.c, flippers.c, events.c, cursors.c, colors.c: split into
	separate sawfish.wm. modules

	* commands.c: deleted, all command handling is written in Lisp

	* fake-libexec: script copied from librep to make symlinked
	plugin tree for when compiling

	* client.c: wrap libclient functions for rep code, installed as
	sawfish.client module

	* sawfish-client.jl: rewrote sawfish-client in Lisp, uses a
	replicated repl to get fully feature front-end in `-' mode

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

	* sawmill.h: make all bitfields unsigned

2000-07-24  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.30.3

2000-07-23  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-menu.jl: don't require 'define

2000-07-20  John Harper  <john@dcs.warwick.ac.uk>

	* Makefile.in: avoid warnings from unbuilt dependency files;
	add --mode arguments to libtool commands (from David Kaelbling
	<drk@sgi.com>)

2000-07-17  John Harper  <john@dcs.warwick.ac.uk>

	* frames.c (build_frame_part): if part has 'hidden property
	set, skip this part

2000-07-16  John Harper  <john@dcs.warwick.ac.uk>

	* frames.c (list_frame_generator): when reconfiguring an
	existing frame, adjust its position so that the position of the
	client window in relation to the root window stays constant

2000-07-14  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.30.2

2000-07-13  John Harper  <john@dcs.warwick.ac.uk>

	* x.c, server.c, keys.c, images.c, functions.c, frames.c,
	fonts.c: use global_symbol_value () instead of Fsymbol_value ()
	in places where the symbol is constant, and it may be called
	from gaolled code

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

	* events.c (configure_request): ensure that one (and only one)
	synthetic ConfigureNotify event is sent to the window after the
	configure request has been handled (even if the window's state
	doesn't change at all)

	[ this fixes the bug where menus in java/swing apps appear too
	high until the window has been moved ]

	* windows.c (manage_windows): if current focus is PointerRoot,
	query the window under the pointer, then refocus that. Patch
	from Brad Thompson

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

	* windows.c (Fmap_windows, Ffilter_windows): new functions.
	Implementing them in C avoids the need to cons up a load of
	list structure just to throw it away immediately afterwards

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

	* versiom 0.30

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

	* images.c (get_pixel): don't box the integer twice
	(set_pixel): if no alpha in pixel, but image has alpha channel,
	assume full opacity

2000-07-06  John Harper  <john@dcs.warwick.ac.uk>

	* main.c (main): unless XSupportsLocale (), don't use FontSets
	(patch from Tomohiro KUBOTA <kubota@surfchem0.riken.go.jp>)

2000-07-05  John Harper  <john@dcs.warwick.ac.uk>

	* functions.c (Froot_window_id): new function

2000-07-04  John Harper  <john@dcs.warwick.ac.uk>

	* session.c (ICE_input_ready): if IceProcessMessages () fails,
	shut down

2000-07-03  John Harper  <john@dcs.warwick.ac.uk>

	* colors.c (Fcolor_rgb_8): new function, as color-rgb, but
	returning eight-bit values

	* images.c (Fimage_ref, Fimage_set, Fimage_map, Fimage_fill):
	new functions for manipulating image contents

2000-07-02  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.29

	* images.c (Fmake_image_from_x_drawable): combine the grabbed
	image and its mask by hand when using Imlib

2000-06-29  John Harper  <john@dcs.warwick.ac.uk>

	* images.c (Fmake_image_from_x_drawable): fixed memory leak in
	gdk-pixbuf case

	* libclient.c (unix_server_init): removed call to access (),
	rely on connect () failing to tell us when sockets don't exist

2000-06-28  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-ui.jl, Makefile.in: deleted sawmill-ui.jl

	* keys.c (default_mods): recapitalized the names

	* play-sample.c, fonts.c: use sprintf if no snprintf

2000-06-25  John Harper  <john@dcs.warwick.ac.uk>

	* windows.c (Fwindow_icon_image): check that `w->wmhints != 0'

2000-06-24  John Harper  <john@dcs.warwick.ac.uk>

	* events.c (property_notify): when WM_HINTS changes, uncache
	icon, and refresh the frame

2000-06-23  John Harper  <john@dcs.warwick.ac.uk>

	* windows.c (add_window): if `initialising != 0', then set
	`placed' property of window before calling any hooks. This
	stops the window-history module rearranging windows..

	* frames.c (build_frame_part): value of `cursor' attribute will
	be called if it is functionp

	* frames.c (build_frame_part): don't need to check that values
	returned by call_protectedly are non-null

	* frames.c: new frame part attribute `scale-foreground'. When
	non-nil, the foreground image will be scaled to the size of the
	frame part
 	 * sawmill.h (struct frame_part): added `scale_foreground' flag

2000-06-22  John Harper  <john@dcs.warwick.ac.uk>

	* events.c (configure_request): when we know nonthing about the
	window, propagate the stacking-related fields of the event
	structure to the call to XConfigureWindow

2000-06-21  John Harper  <john@dcs.warwick.ac.uk>

	* fonts.c (generalize_xlfd): don't assume that snprintf (0, ..)
	returns the size of the string that would be formatted (breaks
	on Tru64). Patch from Aron Griffis <agriffis@bigfoot.com>

	* pixmap-cache.c (max_cached_pixels): reduced from 256K pixels
	to 64K pixels

2000-06-20  John Harper  <john@dcs.warwick.ac.uk>

	* events.c (configure_request): represent the full complexity
	of the stacking components of the request. The `stack' cell of
	the alist is (RELATION SIBLING), where RELATION is one of the
	symbols `above', `below', `top-if', `bottom-if', `opposite' and
	SIBLING is a window or `nil'

	[ patch from Brad Thompson <yak@mit.edu> ]

	* sawmill.h (Lisp_Window): added `icon_image' field. Null if
	uninitialized, otherwise either Qnil or the image containing
	the window's icon

	* windows.c (Fwindow_icon_image): moved here from images.c, now
	caches the image in the window structure

	* sawmill.h, images.c: added support for gdk-pixbuf image
	library (xlib version)

 2000-06-19  John Harper  <john@dcs.warwick.ac.uk>
 
       * play-sample.c (gnome_sound_play): check if
       gnome_sound_sample_load returns negative, if so print a message
       instead of trying to play the negative id
 
2000-06-18  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill.h, main.c, keys.c, events.c, commands.c: remove any
	rep-compatibility cruft, we require 0.12 now

2000-06-16  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.28.1

2000-06-14  John Harper  <john@dcs.warwick.ac.uk>

	Work to support non-default visuals and color depths:

	* display.c: support options --visual=TYPE and --depth=DEPTH
	for specifying the preferred visual type and color depth. Also
	removed the screen_{cmap,visual,depth} variables. Replaced by
	preferred_{visual,depth}

	* frames.c: use XCreateWindow instead of XCreateSimpleWindow;
	ensure that we never default to CopyFromParent for any
	parameters (since parent may be different depth/visual)

	* x.c (Fx_create_window): ensure that border_pixel is always
	set to something

	* main.c (usage): updated for new options

	* frames.c, flippers.c, colors.c, images.c, x.c: no longer use
	screen_{cmap,visual,depth}

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

	* version 0.28

	* sawmill-ui.jl (build-frame-style:update-readme): catch errors
	while testing for directory existance (tarfh may error out)

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

	* keys.c, keys.h: support `Super' modifier; don't always map
	`Alt' to some modifier, only do this for `Meta' now

2000-06-07  John Harper  <john@dcs.warwick.ac.uk>

	* main.c (sawfish_symbols): moved documentation-file to execdir

	* windows.c (Fwindow_size_hints): do some sanity checking of
	the fields in the size hints structure (e.g. ignore negative
	values)

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

	* sawmill.h: moved all Imlib code behind `#ifdef IMLIB'
	protection; typedef image_t redirects to image buffer type

	* play-sample.c: only redefine glib macros if glib isn't
	present

	* pixmap-cache.c: new file. Caches image->pixmap mappings. Not
	needed when using Imlib
	* main.c (main): call pixmap_cache_init ()

	* images.c: ifdef'd all Imlib specific code, some basic support
	for pixmap-cache    

	* images.c (image_cmap, image_visual, image_depth):
	characteristics of the visual we'll be using for all drawing

	* functions.c (Fdisplay_message): use image_cmap instead of
	screen_cmap

	* frames.c, gradient.c, colors.c, x.c: removed all Imlib
	specific code, replaced by calls to portable image_ layer
	functions

	* events.c (install_colormaps): install image_cmap if the
	window has been reparented (for the frame)

	* Makefile.in: added pixmap-cache.c to $(SRCS); use
	$(IMAGE_FOO) instead of $(IMLIB_FOO)

2000-06-05  John Harper  <john@dcs.warwick.ac.uk>

	* main.c, fonts.c: (setq fonts-are-fontsets nil) if setlocale
	() returns null, "C", or "POSIX". This should avoid the problem
	when trying to render 8-bit characters in a 7-bit locale (they
	don't). This is still experimental. Added under guidance from
	Tomohiro KUBOTA

	* windows.c (manage_windows): preserve focus while reparenting
	the windows

	* events.c (focus_in, focus_out): track the window we last
	received focus-in/out on, and only handle the new event if it
	makes a difference (e.g. avoids generating spurious focus-in
	hook calls when keyboard grab is manipulated)

2000-05-31  John Harper  <john@dcs.warwick.ac.uk>

	* fonts.c (generalize_xlfd): don't bother pattern matching
	field contents, just extract by position

2000-05-30  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-ui.jl (build-symbol): don't use make-closure

	* commands.c (Finteractive): removed, unneeded

2000-05-27  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-menu.jl: require 'define for old (?) libreps

2000-05-26  John Harper  <john@dcs.warwick.ac.uk>

	* display.c (redisplay): if XPending () returns non-zero, mark
	that there is input pending on the display

2000-05-25  John Harper  <john@dcs.warwick.ac.uk>

	* keys.c, commands.c: use rep_call_with_closure () if it's
	available

2000-05-22  John Harper  <john@dcs.warwick.ac.uk>

	* Makefile.in: remove .jlc files in `clean' target, not in
	`realclean'

2000-05-19  John Harper  <john@dcs.warwick.ac.uk>

	* fonts.c: integrated patch from Tomohiro KUBOTA
	<kubota@surfchem0.riken.go.jp> to create FontSets using
	intelligently created font specifications

2000-05-16  John Harper  <john@dcs.warwick.ac.uk>

	* x.c: the old window type can now contain one of three
	different types of drawable: window, pixmap, or bitmap (single
	bitplane pixmap); there's also a function to grab the contents
	of a drawable to an image

	* images.c (Fmake_image_from_x_drawable): new function, the
	guts of Fwindow_icon_image, which now calls this new function

	* sawmill-ui.jl: set the WM_CLASS property on windows

2000-05-15  John Harper  <john@dcs.warwick.ac.uk>

	* frames.c (Qdefault_frame, Qnil_frame): deleted, nil-frame is
	defined in frames.jl, default-frame is never used

2000-05-14  John Harper  <john@dcs.warwick.ac.uk>

	* client.c: new option `-r FEATURE', evaluates `(require 'FEATURE)'

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

	* events.c (enter_notify): ignore NotifyInferior events
	(entering from inner window), leave_notify has always done this

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

	* version 0.27

2000-05-08  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-ui.jl (beautify-symbol-name): adapted to handle any
	type of argument, but only beautifies symbols

	* sawmill-ui.jl: fixed bug of not beautifying command names
	after `Copy' or `Insert' operations

2000-05-03  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-ui.jl (match-window:edit): use non-destructive
	operations when splitting property list into bool/non-bool sets

2000-04-30  John Harper  <john@dcs.warwick.ac.uk>

	* functions.c (do_raise_lower): signal an error if the window
	and sibling are the same window

2000-04-27  John Harper  <john@dcs.warwick.ac.uk>

	* functions.c (regrab_server): new function, to be called after
	the server may have been ungrabbed too soon

	* images.c (Fwindow_icon_image): new function, return an image
	representing a windows icon (adapted from Bruce Miller
	<docmad@md.prestige.net>)

	* functions.c (Fhead_count, Ffind_head, Fhead_offset,
	Fhead_dimensions): Xinerama support (untested)

2000-04-25  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill_subrs.h, sawmill-ui.jl, main.c, images.c, display.c,
	client.c, Makefile.in: s/sawmill/sawfish/ where appropriate

2000-04-23  John Harper  <john@dcs.warwick.ac.uk>

	* main.c (main): set the sawmill structure to export all
	bindings

2000-04-17  John Harper  <john@dcs.warwick.ac.uk>

	* frames.c (list_frame_generator): lower the client window
	before configuring each frame part, otherwise the below-client
	attribute is ignored

2000-04-15  John Harper  <john@dcs.warwick.ac.uk>

	* images.c (find_image_file): use global_symbol_value () to
	dereference Qimage_load_path (it's not in the theme's gaol)

	* main.c (global_symbol_value): new function, calls
	Fsymbol_value () from the `sawmill' module

2000-04-14  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-menu.jl: added support for menu accelerators flagged
	by underscores (auto-detects if rep-gtk supports this), adapted
	from patch from Richard Kilgore <rkilgore@kilgoresolutions.com>

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

	* sawmill-ui.jl (ui-get-spec): look for errors in the output,
	if found, print a message or tell the capplet

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

	* frames.c (call_protectedly, call_protectedly_1): functions to
	call other [lisp] functions with error protection in place.
	Used to catch errors while creating frames

	* windows.c (Fmap_window_properties): new function

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

	* version 0.26

	* main.c (main): if rep has modules, create a `sawmill' module
	that will be the wm's global namespace, it imports `rep'

2000-04-03  John Harper  <john@dcs.warwick.ac.uk>

	* fonts.c (Fget_font): set f->descent to the correct value,
	instead of to zero

2000-03-30  John Harper  <john@dcs.warwick.ac.uk>

	* selection.c: handle selection atoms as with other X11 atoms,
	i.e. convert literally from symbol name. So do (x-get-selection
	'PRIMARY) instead of (x-get-selection 'xa-primary)

2000-03-29  John Harper  <john@dcs.warwick.ac.uk>

	* server.c, play-sample.c, main.c, keys.c, images.c, frames.c,
	fonts.c, flippers.c, events.c, display.c, cursors.c, colors.c:
	remove all direct references to `value' field of symbols

	* x.c: only use double buffering extensions if
	HAVE_X11_EXTENSIONS_XDBE_H is defined

2000-03-28  John Harper  <john@dcs.warwick.ac.uk>

	* play-sample.c: new plugin, use ESD and libaudiofile (when
	available) to play .WAV files (stolen from gnome-libs)

2000-03-27  John Harper  <john@dcs.warwick.ac.uk>

	* cursors.c (Fget_cursor): fix typo when calling make_bm_cursor
	(passing fg twice), patch from Alexander Barinov
	<barinov@altavista.net>

2000-03-26  John Harper  <john@dcs.warwick.ac.uk>

	* frames.c (set_frame_part_bg): remember to mark fg as lost
	when calling a function to draw bg

2000-03-21  John Harper  <john@dcs.warwick.ac.uk>

	* x.c (drawable_from_arg): don't automatically look for back
	buffers in windows, require this to be done explicitly
	(Fx_create_root_xor_gc): hacky function to create a gc for
	doing xor drawing on the root window

	* functions.c (Fdraw_window_outline, Ferase_window_outline):
	deleted, now in lisp code

	* selection.c (Fx_selection_active_p, Fx_get_selection): new
	plugin, functions for retrieving X selections. Adapted from
	patch by Mark Probst <schani@mips.complang.tuwien.ac.at>,
	which was in turn adapted from Jade's selection handling

	* keys.c (Fsynthesize_event): fixed the relative pointer
	position calculation

2000-03-20  John Harper  <john@dcs.warwick.ac.uk>

	* windows.c (focus_on_window): don't focus on windows whose
	`visible' flag isn't set (crashes the gnome control center!?)

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

	* version 0.25.2

	* x.c: double-buffering now works on all window types, not just
	those created by Fx_create_window ()

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

	* events.c (handle_input_mask): detect if system clocks is
	rewound (could cause us to ignore timestamps)

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

	* main.c: updated usage information

	* functions.c (Fx_raise_window): added an optional second arg,
	the window to raise the first arg immediately above
	(Fx_lower_window): new function, symmetrical to x-raise-window

	* server.c, libclient.c: removed the incorrect assumption that
	I/O on sockets is atomic, should fix large requests on FreeBSD

	* fonts.c (Qfonts_are_fontsets): new variable, when set to nil,
	never load FontSets, only FontStructs. Currently t by default

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

	* functions.c (Fx_raise_window, Frestack_windows): these now
	accept window ids as well as window objects

	* x.c (x-window-back-buffer, x-window-swap-buffers): basic
	support for the X double-buffering extension

2000-03-06  John Harper  <john@dcs.warwick.ac.uk>

	* keys.c (eval_input_event, print_event_prefix): ported code
	from Jade to print prefix keys after a period

	* main.c (on_idle): don't ungrab the keyboard if in the middle
	of a multi-key sequence

	* keys.c (eval_input_event): only abort when receiving
	unhandled events if in the top-level event loop

2000-03-05  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.25

2000-03-04  John Harper  <john@dcs.warwick.ac.uk>

	* main.c (on_idle): after being idle for one second in the
	outermost event loop, ungrab the pointer and keyboard. This may
	unfreeze the intermittent lockups reported by some people

	* keys.c (Qmulti_click_delay): new variable, the maximum delay
	between successive button press events to count as a click2 or
	click3 (from Martin Blais <blais@iro.umontreal.ca>)

2000-03-02  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-ui.jl: separate the keymap shell using a vpaned
	widget

	* sawmill-ui.jl: `beautify' symbol names in the keymap widget
	(s/[:-]/ / and capitalize first word). Also remove redundant
	`keymap' suffix from keymap names

	* frames.c (list_frame_generator): if resizing a window be
	smarter about when the shape is reinitialized (before the
	resize if the frame is growing, after otherwise). Also, move
	and resize the client window in a single request
	(configure_frame_part): set bit- and win-gravity of frame parts
	to StaticGravity

	* windows.c (fix_window_size): only call XResizeWindow () if
	not calling rebuild_frame ()

	* frames.c (list_frame_generator): reorder some operations,
	maybe less flicker when resizing opaquely?

	* keys.c: support multi-key bindings. Create them by binding an
	event in one keymap to another keymap (or the name of the
	second keymap). Also, try to detect and avoid situations where
	the input devices are grabbed but we're not going to use the
	input (and thus get locked in an inner event loop)

2000-03-01  John Harper  <john@dcs.warwick.ac.uk>

	* x.c (Fx_fill_polygon): new function

2000-02-29  John Harper  <john@dcs.warwick.ac.uk>

	* functions.c (Fdisplay_message): clicking the pointer on the
	message window now removes it

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

	* events.c (key_press, button_press, motion_notify): always
	call XAllowEvents () with Sync{Keyboard,Pointer}, not Async

	* functions.c (Fgrab_window, Fgrab_pointer): more parameters to
	allow finer grab control (event modes, pointer confinement).
	Patch from Timo Korvola <tkorvola@e.math.helsinki.fi>

2000-02-28  John Harper  <john@dcs.warwick.ac.uk>

	* gradient.c, flippers.c: don't use rep_dl_subrs or
	rep_dl_feature (some BSD systems have (had?) problems with data
	segment relocations)

2000-02-27  John Harper  <john@dcs.warwick.ac.uk>

	* x.c: new plugin (feature `x'), wraps some Xlib functions.
	Allows windows and GCs to be created and drawn with (from
	merlin@merlin.org with additions by me)

	* fonts.c (Ffont_ascent, Ffont_descent): new functions (from
	merlin@merlin.org)

2000-02-26  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-ui.jl: new option --flatten; display sub-groups
	inline instead of using a tree widget (good for control
	center). In normal `tree' item, don't put frame the widgets

	* keys.c (Fcurrent_event_string): fix typo when checking if an
	event is currently being handled

	* events.c (button_press): only use the context map if the
	window or its frame is visible

2000-02-25  John Harper  <john@dcs.warwick.ac.uk>

	* keys.c (update_keyboard_mapping): new function, updates the
	modifier data
	* events.c (mapping_notify): new event handler

	* sawmill-ui.jl: use `quotient' instead of `/' where
	appropriate. Define `quotient' to `/' if unbound

	* windows.c, functions.c, events.c, display.c, commands.c: use
	the non-fixnum number representations where appropriate (where
	32-bit data may be found)

	* sawmill.h, main.c: define rep_INTEGERP (), rep_make_long_uint
	() and rep_get_long_uint () if rep_INTERFACE < 8

2000-02-24  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill-ui.jl: put the theme README in a scroller

2000-02-20  John Harper  <john@dcs.warwick.ac.uk>

	* keys.c (Fsynthesize_event): new function, sends an event (key
	or mouse button) to a window

2000-02-15  John Harper  <john@dcs.warwick.ac.uk>

	* events.c (install_colormaps): new function, install all
	colormaps associated with a given window (including colormaps
	of it's associated windows)
	(property_notify): watch for WM_COLORMAP_WINDOWS changing

	* sawmill.h (Lisp_Window): added cmap_windows and
	n_cmap_windows fields
	* windows.c (add_window): initialise cmap_windows fields
	(window_sweep): free cmap_windows

2000-02-14  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.24

	* sawmill.h (Lisp_Font): support for both XFontSet and
	XFontStruct representations

	* fonts.c (Fget_font): if a FontSet can't be created, try to
	load a FontStruct
	(x_text_width, x_draw_string): switch on actual font
	representation

	* frames.c, functions.c: use x_text_width () and x_draw_string ()

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

	* events.c (configure_request): marshal the event to an alist,
	then call configure-request-hook with it

	* client.c: copied the bouncing parentheses hack from librep
	(which was copied from guile)

	* keys.c (Fx_keysym_name, Fx_lookup_keysym): new functions

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

	* sawmill-ui.jl (match-window:edit): make three columns of
	boolean properties, not two

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

	* client.c (main): set rl_basic_quote_characters to include
	only the double-quote character (from Matt Krai)

	* events.c (save_timestamp): don't print the ``time backwards''
	messages anymore

	* functions.c (Fdisplay_message): translate font names to fonts

	* colors.c, cursors.c, fonts.c, images.c (Fget_color,
	Fget_cursor, Fget_font, Fmake_image): if dpy == 0, return nil

2000-02-06  John Harper  <john@dcs.warwick.ac.uk>

	* functions.c (Fdisplay_message): if possible, keep the message
	window wholly on screen

	* main.c (main): run in a dynamic root
	* events.c (handle_input_mask): run all handlers in dynamic
	roots

2000-02-03  John Harper  <john@dcs.warwick.ac.uk>

	* cursors.c, events.c, frames.c (default-cursor,
	synthetic-configure-mutex, frame-draw-mutex,
	frame-state-mutex): now a function of a single parameter

	* frames.c (fp_sweep): comment out `fp->win == 0' assert, I
	think it should be harmless

	* commands.c, keys.c (last-command, this-command, prefix-arg,
	current-prefix-arg, eval-modifier-events,
	eval-key-release-events): these are now normal (passive)
	variables

2000-01-31  John Harper  <john@dcs.warwick.ac.uk>

	* events.c (send_synthetic_configure): remember to clear the
	pending_configure flag after sending the event

2000-01-30  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.23

2000-01-27  John Harper  <john@dcs.warwick.ac.uk>

	* windows.c, images.c, fonts.c (Fwindow_put, Fwindow_get,
	Fimage_put, Fimage_get, Ffont_put, Ffont_get): use equal test
	on property names, not eq

	* sawmill-ui.jl (build-tree): put the root tree in a scrolled
	window

	* sawmill-ui.jl: new widget `tree'

2000-01-26  John Harper  <john@dcs.warwick.ac.uk>

	* fonts.c (fonts_init): don't cause following code to fail
	catastrophically if unable to load fixed font
	* frames.c (set_frame_part_fg): bail out if no font whatsoever

2000-01-25  John Harper  <john@dcs.warwick.ac.uk>

	* main.c: only call before-exit-hook if rep_INTERFACE < 8

	* functions.c (Fx_delete_window, Fdelete_window): removed
	(Fsend_client_message): if format is 32, accept long-int style
	values

2000-01-24  John Harper  <john@dcs.warwick.ac.uk>

	* windows.c (add_window): fix bug of leaving window name unset
	if XmbTextPropertyToTextList () fails

	* functions.c (Fx_delete_window, Fx_kill_client): two new
	functions

2000-01-21  John Harper  <john@dcs.warwick.ac.uk>

	* windows.c (add_window): call after-add-window-hook after
	everything has been initialised

2000-01-20  John Harper  <john@dcs.warwick.ac.uk>

	* events.c (Vsynthetic_configure_mutex): new variable, while t,
	no synthetic ConfigureNotify events are sent to windows after
	they've been moved
	* sawmill.h (Lisp_Window): new flag, `pending_configure'

	* functions.c (Fmove_resize_window_to): new function,
	simultaneous move&resize
	* frames.c (list_frame_generator): when reconfiguring an
	existing frame window, set its position as well as its size

2000-01-19  John Harper  <john@dcs.warwick.ac.uk>

	* version 0.22

2000-01-18  John Harper  <john@dcs.warwick.ac.uk>

	* frames.c (refresh_frame_part): abort if trying to redraw a
	part without a window

2000-01-15  John Harper  <john@dcs.warwick.ac.uk>

	* frames.c (Fframe_part_put): only set values in the new
	`local_alist' field, in case `alist' is shared by multiple
	frame parts (the `local_alist' is scanned first)
	* sawmill.h (struct frame_part): new field `local_alist'

	* frames.c (Frebuild_frame_part): new function, analogous to
	Frebuild_frame (), but for a specific part of the frame

	* events.c (subtract_timestamps): made this function actually
	work (return negative values when necessary)

2000-01-14  John Harper  <john@dcs.warwick.ac.uk>

	* functions.c (Fdisplay_message): fixed specifying foreground
	colours using strings; abort when Fget_color returns rep_NULL;
	update the background pixel of any existing message window to
	the new color (from Matt Kraai <kraai@ghs.com>)

	* events.c (handle_fp_click, unclick_current_fp): protection
	against refreshing stale frame parts

	* frames.c (list_frame_generator): fixed stupid gc-protection
	bug when building new frames

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

	* frames.c: frame parts are now first-class lisp objects
	(Fframe_part_put, Sframe_part_window, Fframe_part_x_window,
	Fframe_part_position, Fframe_part_dimensions,
	Fframe_part_state, Fmap_frame_parts, Frefresh_frame_part,
	Frefresh_window): new functions
	(set_frame_part_fg, set_frame_part_bg): if the fg or bg object
	is a function, then call it to do the redrawing, with the frame
	part as the sole argument
	(Fframe_part_get): args are now `(FRAME-PART PROP)'

	* sawmill.h (struct frame_part): made into a lisp data type

	* events.c (Fclicked_frame_part_offset,
	Fclicked_frame_part_dimensions): deleted
	(Qenter_frame_part_hook, Qleave_frame_part_hook): now called
	with arguments `(WINDOW FRAME-PART)'

	* windows.c (window_mark_type): no need to call mark_frame_type
	anymore

	* keys.c: filter Scroll_Lock events as well as Num_Lock and
	Caps_Lock (from Matt Krai, with minor changes by me)

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

	* events.c (save_timestamp): new function, records a server
	timestamp with checks for validity
	* server.c (server_handle_request): call save_timestamp

	* events.c (record_mouse_position): only update button-press
	details on button-release events if they're not already filled

	* windows.c, keys.c, frames.c: revert to grabbing on the client
	window, grabbing on the client causes awkward problems with
	replaying events

	* events.c, windows.c (property_notify, add_window): support
	compound text properties in icon and window names
	* main.c (main): call setlocale (LC_ALL, "")
	* fonts.c, frames.c, functions.c, sawmill.h: use XFontSet
	instead of XFontStruct, and related other changes
	* gtk-style.c: call gtk_set_locale (), handle missing RcStyle's
	[ patch from Kondara MNU/Linux distribution, forwarded by
	Yukihiro Nakai <nakai@internetsolutions.co.jp> ]

	* display.c (xa_compound_text): new interned atom

	* sawmill-ui.jl (build-frame-style): use a GtkCombo instead of
	a GtkOptionMenu to display the list of themes, also put the
	details box above the combo

	* events.c (get_server_timestamp): new function, jumps through
	hoops to get a recent timestamp direct from the server
	(record_event_time): be more careful about accepting
	timestamps, only if they look like they're actually _after_ the
	previously last-seen time
	(Fx_server_timestamp): new optional arg, when non-nil get a
	timestamp direct from the server

	* server.c (server_handle_request): don't set last_event_time
	to CurrentTime, instead fetch a timestamp from the server

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

	* keys.c (translate_event_to_x_key): return FALSE if no keycode
	exists for the specified keysym (i.e. the keyboard has no such
	key)

	* events.c (record_mouse_position): on button-release, don't
	cancel the saved position/window, just update the position. The
	button_press function will clear the position before it exits.
	This fixes the ``can't bind to -Off events'' bug. Pointed out
	by Matt Krai <krai@ghs.com>

	* keys.c (Fallow_events): if mode is `replay-pointer', then
	forget the time of the last click event (that is used to
	measure double-clicks)

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

	* version 0.21

	* keys.c (lookup_binding): check for non-null current_x_event
	before accessing it

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

	* frames.c (create_window_frame): if actually creating the
	frame window, then call grab_window_events ()
	* windows.c (add_window, remove_window): don't call
	grab_window_events () anymore
	* keys.c, frames.c (grab_window_events, grab_keymap_event,
	Fwindow_put): when grabbing events, grab on the frame window,
	not the client window

	* images.c (Fmake_image): _always_ returns a new image, by
	working around Imlib's annoying caching

2000-01-07  John Harper  <john@dcs.warwick.ac.uk>

	* sawmill.h: added fps_inactive_highlighted and
	fps_inactive_clicked

	* frames.c (get_pattern_prop): new function, called by
	list_frame_generator to fill the fp->bg, fp->fg and fp->font
	arrays. This now takes a new format, an alist mapping state
	symbols to values (the old formats are also still accepted).
	Current states are `inactive', `focused', `highlighted',
	`clicked', `inactive-focused', `inactive-clicked'. The last two
	are new, there inclusion removes the need for the
	highlight-when-unfocused option, so it's been removed

	* sawmill.h (FRAME_EVENTS): added VisibilityChangeMask (patch
	from Matt Krai <kraii@ghs.com>)

2000-01-06  John Harper  <john@dcs.warwick.ac.uk>

	* server.c (server_init): chmod the socket as well as the
	directory (for people with losing umasks)

2000-01-02  John Harper  <john@dcs.warwick.ac.uk>

	* frames.c (list_frame_generator): make `(cursor . nil)' work

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

	* commands.c (Fcall_command): accept closures as possible
	commands

	* main.c (main): use rep_load_environment () and
	rep_top_level_exit ()

	* windows.c (window_mark): always call mark_frame_parts (), not
	just when w->frame != 0
	(window_mark_type): call mark_frame_type
	* frames.c (mark_frame_type): new function, marks any frame
	parts that are being built but have not yet been added to a
	window

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

	* functions.c: when reading/writing X properties, use
	u_longs/u_shorts instead of CARD32s/CARD16s; otherwise things
	stop working on alphas (from George <jirka@5z.com>)

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

	* windows.c, images.c, fonts.c (X_put): remove checks for
	immutable cons cells, can't happen

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

	* images.c (image_sweep): use Imlib_kill_image () instead of
	Imlib_destroy_image () (turns off image caching, but not
	image sharing)

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

	* version 0.20

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

	* commands.c (Fcommandp): fixed for current autoload format

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

	* functions.c (Fgrab_pointer): revert to using
	owner_events=False, it stops annoying focus flickers

	* keys.c (translate_event_to_x_button): fix typo (pointed out
	by Hamish Macdonald <hamishm@lucent.com>)

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

	* images.c (make_image): when adding to rep_data_after_gc,
	try to include the Imlib allocated data

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

	* windows.c (add_window): call send_synthetic_configure ()
	after placing the window

	* functions.c (Fdisplay_message): allow color names in
	foreground and background atttributes, not just color objects

	* frames.c (list_frame_generator): when client_unmapped changes
	and the window is focused, refocus it

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

	* version 0.19

	* events.c (motion_notify): don't compare the event window with
	the button-press window; just use the saved context map from
	the actual button-press event
	(button_press): only use the context map if the part is
	currently clicked; forcible ungrab the pointer after all button
	release events

	* frames.c (frame_part_destroyer): if we unclick a frame part,
	ungrab the pointer as well

	* functions.c (Fgrab_pointer): grab with owner_events=True

	* functions.c (Fdisplay_message): new attribute `spacing',
	space between each line of text

	* events.c (handle_input_mask): preserve current_x_event and
	current_event_window in case of recursive calls

	* events.c (Qenter_frame_part_hook, Qleave_frame_part_hook):
	new hooks, called when the pointer enter a frame part, two args
	(WIN CLASS)

	* frames.c (Fframe_part_get): new function, get frame part
	properties (part is found by window and class)

	* frames.c (frame_part_exposer): only allow expose events to
	override the frame_draw_mutex when the server isn't grabbed

	* functions.c (Fserver_grabbed_p): new function

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

	* sawmill-ui.jl: i18n for all natural language strings

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

	* cursors.c (Fget_cursor): can now create cursors from two
	normal X bitmaps (image and mask) and two colours. Call with an
	argument [IMAGE-NAME MASK-NAME FG BG]
	(Frecolor_cursor): new function

	* images.c (make_bitmap): new function (scans image-load-path)

	* functions.c (Fgrab_pointer): if the CURSOR argument is
	non-nil, but not a cursor, call Fget_cursor () on it

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

	* gradient.c (Fdraw_diagonal_gradient): the gradient now scales
	linearly for all lines parallel to that connecting the top-left
	and bottom-right corners (from Chris Hanson <cph@zurich.ai.mit.edu>)

	* images.c (Fbevel_pixel): new optional parameter BEVEL-PERCENT
	(from Chris Hanson <cph@zurich.ai.mit.edu>)
	(Qdefault_bevel_percent): new variable, default for above
	parameter

	* events.c (map_request): reinstate the code to iconify a
	window if it's initial state is IconicState (why did I ever
	remove it!?)

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

	* keys.c (Fforget_button_press): new function, forgets about
	any remembered button press (for calculating click2's etc)

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

	* frames.c (list_frame_generator): fix crash when font is
	defined as nil

	* sawmill-ui.jl (match-window:edit): added a `Grab..' button to
	each matcher

	* sawmill-ui.jl (i18n-filename): fixed typo (from Jesus Bravo
	Alvarez <jba@pobox.com)

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

	* version 0.18

	* sawmill-ui.jl (build-color): create buttons containing a
	preview of the color, not just its name

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

	* windows.c (add_window): always set the `placed' property
	before exiting

	* keys.h, keys.c: support Hyper modifier, prefix `H-'

	* frames.c (set_frame_part_bg): fixed a bug when tiling shaped
	frame parts, removed the spurious clipping code
	(refresh_frame_part): handle the dimensions checking here
	instead of in set_frame_part_{bg,fg}

	* windows.c (Fset_input_focus): removed the hack of unfocusing
	before refocusing, it causes too much redrawing when focusing
	on the currently focused window

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

	* sawmill-ui.jl: new match-window property type `pair', a pair
	of integers

	* sawmill-ui.jl: look for README.LC (LC == language code) files
	in theme ui; mostly from Yukihiro Nakai
	<nakai@internetsolutions.co.jp>

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

	* sawmill-ui.jl: added `match-window' widget for editing the
	match-window-profile variable

	* events.c (Fquery_button_press_window): new function, tries to
	return the window that the button was pressed in (when in the
	middle of a press-release sequence)
	(motion_notify): only look for frame-part context maps when the
	window that the mouse is currently over is the same window as
	when the button was originally pressed

	* keys.c (lookup_event_binding): call
	Fquery_button_press_window () when evaluating a mouse event to
	find the window whose `keymap' property should be searched

	* sawmill-ui.jl: the `set' type is now called `symbol'

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

	* functions.c (Fwarp_cursor_to_window): deleted, now in lisp

	* windows.c, session.c, main.c, keys.c, images.c, functions.c,
	frames.c, fonts.c, events.c, cursors.c, commands.c, colors.c:
	changed embedded doc strings

	* functions.c (Fdisplay_message): new function, replaces
	Fshow_message, only takes two args a (multi-line) string, and
	an alist of attributes
	(Fshow_message): deleted, now in lisp

	* events.c (map_request): if the window isn't visible, then
	call map-notify-hook manually
	(unmap_notify): recognize synthetic unmap events (for when the
	window isn't currently visible), and delete WM_STATE property
	afterwards

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

	* windows.c (remove_window): check that the focus hasn't got
	lost somehow; if it has refocus the last-focused window, or the
	invisible input window

	* version 0.17

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

	* keys.c (translate_event_to_x_button, grab_event,
	ungrab_event): fixed bug when grabbing buttons with AnyModifier
	_and_ a specific button

	* client.c (completion_generator): pass the boundp predicate
	when remotely calling apropos

	* windows.c, images.c, fonts.c, cursors.c, colors.c: remember
	to add to rep_data_after_gc after allocating lisp data

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

	* windows.c (Fwindow_size_hints): added window-gravity field
	(Fwindow_border_width): new function
	[both mostly from merlin <merlin@merlin.org>]

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

	* windows.c, session.c, server.c, sawmill-ui.jl,
	sawmill-menu.jl, frames.c, events.c, commands.c: updated for
	single namespace and scheme-like function semantics

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

	* functions.c (Fgetpid): deleted, use (process-id) instead

	* sawmill-ui.jl (documentation): call _ on any documentation
	(on the wm)

	* main.c (usage): added --disable-nls option

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

	* Makefile.in: set REP_GTK_DONT_INITIALIZE=1 when compiling
	scripts

	* events.c (map_request): only map the client window if it's
	client_unmapped bit is clear

	* windows.c (Fhide_window, Fshow_window): only map/unmap the
	frame if it exists

	* keys.c (lookup_event_binding): if a mouse event, _never_
	look in the focus window by default

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

	* windows.c (Fset_window_frame): each window frame must be a
	closure of a list, not just a list
	* frames.c (set_frame_part_bg, set_frame_part_bg,
	list_frame_generator): activate the frame's closure before
	doing anything

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

	* images.c (Fbevel_image): patch from Scott Sams
	<sbsams@eos.ncsu.edu> to fix some calculation errors

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

	* sawmill-ui.jl (build-color:clicked): remove left over comma
	from old backquoting

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

	* main.c (main): Fload () has five arguments now

	* windows.c (Fstacking_order): fix memory leak (memprof rules!)

	* windows.c, sawmill-ui.jl, sawmill-menu.jl, main.c, keys.c,
	images.c, functions.c, frames.c, fonts.c, flippers.c, events.c,
	display.c, commands.c, colors.c: updated for lexically scoped
	rep

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

	* version 0.16

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

	* windows.c (Fget_window_by_id): new function

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

	* windows.c (Fset_input_focus): call focus_on_window (0) before
	focusing the given window, seems to help transfer the focus
	when called after grabbing the keyboard

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

	* sawmill-ui.jl (build-pages): if a notebook, make it
	scrollable and enable the popup menu

	* events.c (property_notify): use XGetWMNormalHints instead of
	XGetNormalHints when WM_NORMAL_HINTS changes

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

	* windows.c (Qafter_framing_hook): new hook, called after both
	set-window-frame and rebuild-frame

	* sawmill.h (POINTER_GRAB_EVENTS): use PointerMotionMask
	instead of ButtonMotionMask

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

	* version 0.15

	* keys.c (translate_event_to_x_button): don't ignore non Click1
	events

	* events.c (key_press, button_press, motion_notify): when a
	grab is in effect, and there may be more events from it, use
	the Sync(Pointer|Keyboard) argument to XAllowEvents ()

	* sawmill.h (POINTER_GRAB_EVENTS): new #define, the events to
	select from pointer grabs
	* keys.c, functions.c: use POINTER_GRAB_EVENTS when grabbing

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

	* sawmill-ui.jl (build-frame-style:update-readme): 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>

	* frames.c (list_frame_generator): maybe fix a bug when
	Fget_font returns rep_NULL

	* sawmill-ui.jl (build-keymap-shell): improved some gtk packing
	parameters

	* sawmill-menu.jl (create-menu): call
	gtk-widget-lock-accelerators on each menu item if the function
	is available

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

	* dlmalloc.c: support FreeBSD sbrk ()

	* libclient.c (unix_server_init): add one to the length
	argument to connect ()

	* keys.c (search_keymap): fix matching EV_MOD_ANY events when
	other modifiers are also specified

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

	* events.c (synthesize_button_release): function to be called
	when ungrabbing the pointer
	* functions.c (Fungrab_pointer): call synthesize_button_release

	* events.c (Fquery_last_pointer): replaced this function by
	Fquery_button_press_pointer, instead of returning the last but
	one mouse position, return the position at the last ButtonPress
	event. This helps us work-around problems when MotionNotify
	events are received without an immediately preceding ButtonPress

	* windows.c (Fwindow_id): return nil if the client window has
	been deleted
	(Fwindow_frame_dimensions): call Fwindow_dimensions if the
	window is currently unframed

	* events.c (property_notify): update cached WM_TRANSIENT_FOR
	property when it changes

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

	* client.c (main): fix realloc bug

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

	* version 0.14.2

	* functions.c (Fdelete_window): reinterrogate the window's
	WM_PROTOCOLS property in case it set WM_DELETE_WINDOW after
	being mapped

	* functions.c (Qafter_restacking_hook): new hook, called
	whenever the stacking order is explicitly altered

	* functions.c (Fshow_message): use a local event handler for
	better data hiding

	* events.c (register_event_handler, deregister_event_handler):
	new functions, allow window-local event handlers to be created

	* flippers.c: new plugin, provides the mechanism for viewport
	edge-flipping (hooks enter-flipper-hook and leave-flipper-hook)

	* version 0.14.1

	* functions.c (Fsend_client_message): bug fix from Ricardo R.
	Massaro <massaro@ime.usp.br>

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

	* version 0.14

	* sawmill-ui.jl (documentation): redefine this standard
	function to get the doc string from the window manager process

	* events.c (shape_notify): call shape-notify-hook

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

	* windows.c (install_window_frame): call restack_frame_parts
	* frames.c (restack_frame_parts): new function

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

	* frames.c: expose events override the frame-draw-mutex

	* windows.c (manage_windows): call after-iniitialization-hook
	after adopting all windows

	* client.c (completion_generator): added basic readline symbol
	completion; doesn't differentiate between variables and
	functions

	* server.h, server.c, libclient.c: create sockets in
	`/tmp/.sawmill-USER/DPY' to try and prevent /tmp exploits

	* sawmill-menu.jl (popup-menu): new optional arg POSITION

	* events.c (Fclicked_frame_part, Fclicked_frame_part_offset,
	Fclicked_frame_part_dimensions): new functions

	* events.c, functions.c (configure_request, Fmove_window_to,
	Fresize_window_to): call window-moved-hook and
	window-resized-hook as appropriate

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

	* sawmill-menu.jl (popup-menu): new optional arg TIMESTAMP

	* events.c (Fx_server_timestamp): new function

	* server.h, server.c, libclient.c: unix-domain socket is now
	`/tmp/.sawmill-DPY' since there have been problems with
	network-mounted home directories

	* events.c (property_notify): update w->hints when
	WM_NORMAL_HINTS changes

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

	* functions.c, events.c: added debugging output for X
	timestamps and [un]grabbing functions

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

	* version 0.13

	* sawmill-ui.jl (build-frame-style:update-readme): handle
	themes stored in tar files

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

	* images.c (Fmake_image): support loading non-local images (by
	copying to a temporary file)

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

	* events.c (Fx_events_queued): new function

	* windows.c (Fhide_window): go back to old method of not
	unfocusing when hidden window has focus

	* windows.c (add_window): set the `mapped' bit (so that it's
	set when hooks are called)

	* session.c (save_yourself): ignore SmSaveGlobal requests

	* events.c (handle_input_mask): don't set last_event_time to
	CurrentTime before exiting (this may cause server
	race-conditions when using recursive edits)

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

	* main.c (main): handle --version option; provide usage
	function to rep_init ()

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

	* events.c (actual_last_event_time): the real last timestamp
	from the server

	* frames.c (set_frame_part_bg): fix image tiling

	* frames.c (Qhighlight_when_unfocused): new option, only
	highlight frame parts in unfocused windows when this is set
	non-nil

	* display.c, libclient.c (canonical_display): handle unix:0
	displays
	(canonical_host): map host name to lowercase

	* keys.c (translate_event_to_x_key): handle shifted keys (i.e
	things like C-C) correctly

	* colors.c (Fget_color_rgb): fix bug when scanning list of
	previously allocated colors (accepting non-matching color)
	(Fget_color): use XParseColor instead of XLookupColor

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

	* version 0.12.2

	* frames.c (set_frame_part_fg): if fg needs to be updated, but
	bg hasn't recently been redrawn, redraw bg to clear fg

	* version 0.12.1

	* frames.c (list_frame_generator): after freeing the gc
	(unviewable part) zero its pointer

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

	* version 0.12

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

	* events.c (focus_in, focus_out): ignore events with detail
	NotifyPointer

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

	* frames.c (set_frame_shapes): new function, construct the
	frame shape from the union of all individual shapes
	(set_frame_part_bg): draw the background manually, instead of
	setting it as the window background and letting the X server do it
	[these changes fix the infamous ``jerky pointer while changing
	focus'' bug, also the `unshaped' property has been removed]

	* windows.c (set_window_shape): deleted
	* events.c (shape_notify): call set_frame_shapes not
	set_window_shape

	* keys.c (lookup_binding): when event is from no_focus_window,
	search the root-window-keymap

	* windows.c (before_local_map, after_local_map): new method of
	ignoring locally-generated map/unmap/reparent notify events;
	should remove all race conditions (!). The method is to grab
	the server, unselect the StructureNotifyMask on the window, do
	the request, then reselect events and ungrab

	* windows.c, frames.c: use before_local_map and after_local_map

	* events.c (map_notify, unmap_notify, reparent_notify): removed
	all code attempting to ignore locally-generated events

	* sawmill.h (Lisp_Window): removed the `reparenting',
	`local_maps' and `local_unmaps' fields

	* functions.c (Fgrab_server, Fungrab_server): don't bother
	hijacking the message function; Fgrab_server calls XSync
	instead of XFlush to guarantee the server actually is grabbed
	on return

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

	* display.c, libclient.c (canonical_display): canonicalise any
	given hostname (i.e. tizer:0 => tizer.dcs.warwick.ac.uk:0.0)

	* events.c, display.c (destroy_notify, error_handler): don't
	set focus_window = 0, if the current window is destroyed,
	instead let remove_window () or emit_pending_destroys () call
	focus_on_window (0) when necessary
	* windows.c (remove_window, emit_pending_destroys): call
	focus_on_window (0) when we think the destroyed window is
	currently focused

	* server.c (server_init): when binding, add one to the size of
	the address (for the terminating null character)

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

	* sawmill.h (struct frame_part): new bit `below_client'
	* frames.c: recognize `(below-client . t)' attribute in frame
	part, when set, the part's window is kept _below_ the client

	* windows.c (remove_window): release passive grabs

	* client.c: include readline support from Christopher P Goller
	<goller@eng.utah.edu>

	* version 0.11

	* events.c (focus_in): if focus is passed to the root window,
	focus on our unviewable window

	* windows.c (focus_on_window): go back to using RevertToParent

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

	* functions.c (Fdelete_window): return to using XKillClient
	instead of XDestroyWindow when WM_DELETE_WINDOW isn't available

	* keys.c, functions.c: when using the x_win_from_arg function,
	being unable to find a window xid is only an error if we
	weren't passed a window object (gracefully handle windows being
	closed while their handles are in use)

	* sawmill.h (struct frame_part): added a field `drawn'; a
	structure defining the last-drawn contents
	* frames.c: try to optimize frame-part redisplay as much as
	possible, only update fg/bg when they're different to the
	currently displayed data

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

	* version 0.10

	* windows.c (Fhide_window): if the hidden window has the focus,
	call focus_on_window (0)

	* windows.c (focus_on_window): use RevertToNone instead of
	RevertToParent

	* frames.c (reset_frame_parts): redraw any frame parts whose
	state changes

	* events.c (Fcurrent_event_window): moved here from keys.c,
	this now takes an (undocumented) optional argument, the window
	to return for the duration of evaluating this event

	* events.c (reparent_notify): handle case where we're not doing
	the reparenting--unadopt the window and reissue the reparent
	request

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

	* server.c (server_init): chmod the socket to rwx------

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

	* frames.c (list_frame_generator): when hide-client is set,
	ensure that the client window ends up unmapped

	* windows.c (focus_on_window): don't focus unmapped client
	windows, focus the frame instead (so its state changes)

	* sawmill.h (Lisp_Window): new bits: `client_hidden' and
	`client_unmapped'. Used to allow the client to be unmapped
	while its shaded. Added integers `local_maps' and
	`local_unmaps': the number of expected notify events

	* events.c (map_notify, unmap_notify): look at the local_maps
	and local_unmaps fields

	* windows.c (Fhide_window, Fshow_window): set the
	client_unmapped bit, and use local_[un]maps instead of the
	event mask

	* sawmill-ui.jl (build-keymap-shell): added a `Grab key' button

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

	* main.c (exit_code): variable replacing the old jmp_buf exit
	method; set the variable to an exit code then call Fquit ()
	* session.c (die): use the new exit method

	* frames.c (set_frame_part_fg): remember to tell the event loop
	that there may be X events read but not handled (Imlib..)

	* libclient.c, libclient.h: abstracted the guts of client.c,
	providing a better interface
	* client.c: call the client_ functions in libclient.o

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

	* client.c: added back the old unix domain code, if this can't
	make a connection, then try the X property based server
	* server.c, server.h: reprieved, enabled by default now, but
	write sockets as ~/.sawmill/.unix-CANONICAL-DISPLAY

	* display.c (Qcanonical_display_name): new variable, display
	name with fq hostname and screen number

	* functions.c (Fget_x_text_property, Fset_x_text_property): new
	functions

	* events.c (property_notify): for WM_NAME and WM_ICON_NAME
	properties, only refresh the frame or call the hook if the
	value of the property _actually changed_

	* sawmill.h (Lisp_Color): removed the `name' field

	* colors.c (Fget_color_rgb): new function; get a color
	specified by its RGB values

	* images.c (Fget_image_shape_color, Fset_image_shape_color):
	new functions, gets/sets the color of the transparent pixels

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

	* keys.c (search_keymap): allow things like `Any-C-x' to work;
	this looks for a `C-x' event plus any other modifiers

	* session.c: if HAVE_X11_SM_SMLIB_H isn't defined, don't do any
	session management

	* windows.c (Fwindow_wants_input_p): new function, returns the
	input field of a window's WM_HINTS property

	* frames.c (set_frame_part_bg): when checking if the part
	overlaps the client, do it correctly

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

	* windows.c (remove_window_frame): only remove windows from
	the save-set if the client window was unmapped by its owner

	* display.c (error_handler): ignore errors where resourceid is
	zero, and don't print unrecognized errors, they're just
	annoying..

	* sawmill.h (WINDOWP): now the same as XWINDOWP; i.e. we don't
	care whether or not the client has disappeared (which was
	causing more problems than it solved)

	* windows.c (Fhide_window, Fshow_window): unmap the client
	window when it's hidden (by law of the ICCCM)

	* frames.c (list_frame_generator): raise each frame part
	window as it's created/reconfigured

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

	* version 0.9

	* display.c (sys_init): set the display-name variable to the
	display we opened (or a null string if in batch-mode)

	* events.c (map_notify): check if the window set its
	override_redirect attribute to True while it was unmapped, if
	so un-adopt the window

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

	* events.c (handle_input_mask): ignore NoExpose and
	GraphicsExpose events

	* sawmill-ui.jl (build-file): new widget `file-name' for
	selecting files

	* frames.c, windows.c (list_frame_generator,
	install_window_frame): client window is always left beneath any
	overlapping frame parts

	* frames.c (set_frame_part_fg, list_frame_generator): the
	`foreground' frame part property may now be an image (or list
	of images), it's drawn into the part, respecting any defined
	justification, but with no scaling or tiling

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

	* frames.c (set_frame_part_bg): when a shaped image is placed
	(at all) inside the client window, apply the shape mask to the
	frame part's window, not to the frame's window [this may
	conflict with shaped client windows?]

	* images.c (Ftile-image): fix bug when src image is vertically
	smaller than dest image

	* events.c (configure_request): when a client asks to be moved,
	factor in the frame offset if it's reparented

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

	* keys.c (translate_event): fix bug where X server reports that
	it has a keysym at index 1 as well at index 0, even when
	xmodmap disagrees, and the keysyms are the same (XKB extension
	on XFree86)

	* sawmill-ui.jl (build-keymap): fix cancel/revert problem

	* sawmill-ui.jl (build-keymap): new button: copy

	* sawmill-ui.jl: improved the bindings widget, try to remove
	the annoying jitter when selected list items

	* session.c (Fsm_connect, Fsm_disconnect): new functions.
	Connection with the session manager is now removed from the
	actual initialisation process. The lisp code will call
	sm-connect at the right time

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

	* colors.c (Fget_color): allocate all colors using
	Imlib_best_color_match (); this makes no difference using
	TrueColor or DirectColor visuals but should help on PseudoColor
	(i.e. 8 bit) visuals
	* sawmill.h (Lisp_Color): removed the XColor struct, just
	inline the three rgb values and the pixel color

	* main.c (main): call images_init () before colors_init (),
	since colors.c using Imlib

	* images.c, gradient.c, functions.c, frames.c: changes for new
	color type

	* frames.c (list_frame_generator): fix seg fault where either
	Fget_font () or Fget_color () returns an error

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

	* keys.c (event_proxy_fun): deleted
	(lookup_event_binding): new function, used by eval_input_event
	and Flookup_event_binding, it finds the window to search in,
	then calls lookup_binding

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

	* version 0.7

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

	* keys.c (find_meta): if alt_mod is unset, set it to meta_mod
	(i.e. similarly to for meta_mod)
	(Qalt_keysyms, Qmeta_keysyms): variables showing which keysyms
	generate the two virtual modifiers

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

	* frames.c (list_frame_generator): try to prevent weird shaped
	frames being created for very small client windows. The rule is
	that if a frame part's position is specified by a single edge,
	and it overlaps the opposite edge of the client window, then
	truncate the part to that edge. This still isn't perfect, but
	at least the border is always correct

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

	* keys.c: added Mod5 to list of accepted modifiers

	* events.c (key_press): evaluate KeyRelease events again

	* functions.c (Fgrab_keyboard, Fungrab_keyboard): new functions

	* keys.h: EV_MOD_RELEASE extra modifier bit to mark KeyRelease
	events from KeyPress events
	* keys.c: removed the long methods of specifying modifiers
	(Veval_modifier_events, Veval_key_release_events): new 
	options, control whether we evaluate these abnormal events

	* functions.c (Fwarp_cursor_to_window): unless coordinates are
	given, warp relative to top-left corner of the frame. If coords
	are given, they are relative to the client window

	* functions.c (Fgrab_pointer): accept a nil window, and
	fallback to grabbing on the root if the specified window is
	unviewable

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

	* frames.c (Qoverride_frame_part_classes): new variable,
	similar to Qframe_part_classes but with higher precedence than
	the frame definition itself

	* session.c, main.c, functions.c, frames.c, commands.c,
	alloca.c: try to support C_ALLOCA and other variants

	* windows.c (emit_pending_destroys): abort if a lisp interrupt
	occurs

	* frames.c (set_frame_part_bg): rearrange how shaped images are
	handled -- it's imperative that the frame must _always_ retain
	the union of the old and new shapes, unfortunately this means
	that we need to make a copy of the original frame shape..

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

	* commands.c (Fcall_command): changed `f', `w' and `W'
	interactive codes to `%f', `%w' and `%W'. `%' is now reserved
	for app-local codes

	* functions.c (Fshow_message): new optional arg POS; defines
	the position of the message window on the screen

	* windows.c (window_sweep): preserve the order of window_list

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

	* windows.c (Fwindow_framed_p): new predicate

	* keys.c (translate_event_to_x_button): if no button is
	specified, but mod_any is set, then return AnyModifier and
	Button1 (which should be ignored)
	(grab_event, ungrab_event): support AnyModifier correctly

	* functions.c (Fdelete_window, Fdestroy_window): never use
	XKillClient, just XDestroyWindow

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

	* version 0.6

	* windows.c (pending_destroys): new variable, the number of
	destroyed windows whose hooks haven't been called
	* windows.c, functions.c, events.c, display.c: call
	emit_pending_destroys () after round-trip X requests, try to
	minimize the time between a window dieing and its
	destroy-notify-hook being called

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

	* cursors.c (Fcursorp): new function

	* windows.c (set_window_shape): if updating a shaped window
	with no frame, just use a single ShapeSet operation, not a
	ShapeSet followed by a ShapeUnion (fixes the flashing gmc icons
	bug)

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

	* images.c (Fimagep): new function
	(bevel_pixel): increase the bevel multiplier from 0.5 to 0.75

	* windows.c (window_mark_type): ensure that closed windows
	which haven't had destroy-window-hook called aren't collected

	* frames.c: new frame part properties: `class' and `removable',
	new window property `removed-parts'
	(get_keymap_for_frame_part): new function

	* events.c (key_press): don't look for a frame part keymap
	(button_press, motion_notify): call get_keymap_for_frame_part

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

	* keys.c, keys.h: added `click3' event

	* frames.c (frame_part_destroyer): if any of the frame parts
	are clicked, make sure that clicked_frame_part gets cleared

	* frames.c, windows.c: added a new window property
	`hide-client', when non-nil the client window won't be visible
	(call rebuild-frame after setting for it to take effect)

	* keys.c: removed hashed keymaps (vectors), just lists of
	bindings now
	(Fbind_key, Funbind_key): bindings no longer nest

	* sawmill-ui.jl (build-number-entry): use spin-buttons for
	entering numbers

	* events.c (property_notify): fixed this function

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

	* sawmill.h (Lisp_Window): store window and icon names as lisp
	strings
	* events.c, windows.c: handle lisp string names, fix some
	memory leaks

	* sawmill-ui.jl: added --socket-id option to allow the ui to be
	embedded in the gnome control center. This also disables the
	ok/cancel/etc buttons and enables a hacky protocol on
	stdin/stdout

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

	* frames.c (destroy_window_frame): new arg, whether or not to
	delete the top-level frame window or not
	(list_frame_generator): handle building a new frame into an old
	top-level window

	* windows.c (Fset_window_frame): don't delete the parent frame
	window, this prevents having to reparent the client back to the
	root, and in turn prevents all flickering

	* sawmill-ui.jl (ui-quit): tell the wm to save the custom file
	before exiting

	* images.c (Ftile_image): new function

	* sawmill-ui.jl: changed the architecture, instead of the wm
	connecting with the configurator, make the configurator connect
	with the wm (using sawmill-client); re-enabled the "revert"
	button

	* sawmill.h (Lisp_Window): added `destroyed' bit
	* windows.c (emit_pending_destroys): call destroy-notify-hook
	where it's required
	* events.c (destroy_notify): only call hook if it's not already
	been called
	(handle_input_mask): call emit_pending_destroys after each event
	* display.c (error_handler): mark that may be input pending on
	the X connection (so that the event loop will call
	emit_pending_destroys)

	* windows.c (install_window_frame, remove_window_frame): handle
	adding and deleting from the save-set here (so that unmapped
	but not destroyed windows are removed from it)

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

	* sawmill-ui.jl (build-frame-style:update-readme): strip
	trailing whitespace from the README file

	* functions.c (Fshow_message): don't set save_under and
	backing_store in the message window--they slow down opaque
	window movement on XFree86..

	* windows.c, images.c, fonts.c, cursors.c, colors.c: define rep
	comparison functions for these types, I'd forgotten that they
	couldn't just be null pointers

	* display.c (error_handler): don't call destroy-notify-hook
	since it might generate X protocol requests (not allowed)

	* frames.c (Fframe_state_mutex): when this variable is non-nil,
	entering or leaving a frame-part's window won't affect its
	state. As a hack, if you set this to `clicked' the frame part's
	state will be set clicked (this is needed because LeaveNotify
	events seem to be able arrive before the MotionNotify events
	causing them)

	* events.c (enter_notify, leave_notify): don't change
	frame-part state if frame_state_mutex is set

	* keys.c (Fallow_events): new function, wrapper for
	XAllowEvents
	(grab_event): all active grabs now use GrabModeSync

	* events.c (button_press, key_press): call XAllowEvents
	with AsyncPointer or AsyncKeyboard after handling the event,
	since active grabs are now synchronous

	* events.c (focus_in): only handle the event if the window is visible

	* windows.c (find_window_by_id): print less debugging info

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

	* version 0.5

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

	* sawmill-ui.jl (frame-style): new widget type

	* functions.c (Fshow_message): new function, displays a
	specified string in the middle of the screen
	* events.c (expose): recognize when the message_win is exposed
	* main.c (main): call functions_kill

	* frames.c (frame_part_focuser): deleted since it's exactly the
	same as refresh_frame_parts ()

	* session.c (session_init): only try to connect if
	SESSION_MANAGER is set in the environment

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

	* windows.c (add_window): only call place-window-hook if (as
	well as not being in initialisation) the `placed' property of
	the window isn't set
	(Fwindow_group_id): check that w->wmhints isn't a null pointer

	* session.c: the C portion of session management -- very minimal
	* sawmill.h (enum exit_codes): new member `ec_session_died'

	* main.c (Qsaved_command_line_args): new variable, contains the
	pristine command line arguments. Provides the arguments to
	exec() when restarting

	* functions.c (Fgetpid): new function, should be in librep,
	needed for session management

	* main.c (Qsaved_command_line_args): new variable, a list
	containing the unmodified args

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

	* functions.c (Fx_raise_window): wrapper for XRaiseWindow ()

	* version 0.4

	* events.c (client_message): even if we can't find a client
	window object for the event, still pass it through the hook

	* gtk-style.c: helper program for `gtk' theme. Outputs the
	default GTK style as an s-expression

	* frames.c (refresh_frame_parts): new function

	* windows.c (Frebuild_frame): new function

	* images.c (Fclear_image): new function

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

	* images.c (Fmake_sized_image): replaced the three pixel colors
	by one color object

	* frames.c: added a `render-scale' attribute, allows the buffer
	size of parts rendered on the fly to be reduced
	* sawmill.h (struct frame_part): added render_scale field

	* images.c (Fbevel_image): new function

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

	* frames.c: new attribute in frame part alists: `renderer', a
	function called with args (IMAGE STATE). It should draw the
	background of the frame part into IMAGE for STATE (nil,
	focused, highlighted, clicked)

	* sawmill.h (struct frame_part): new fields `renderer',
	`rendered_image' and `rendered_state'

	* images.c (make_image): search the list of images before
	making a new lisp object
	(Fmake_sized_image): new function, create a blank image of a
	certain size and colour

	* gradient.c (Fdraw_vertical_gradient,
	Fdraw_horizontal_gradient, Fdraw_diagonal_gradient): new
	plugin, new functions

	* windows.c, main.c, keys.c, images.c, functions.c, frames.c,
	fonts.c, events.c, cursors.c, colors.c: added doc strings for
	built-in functions

	* display.c (sys_init): don't connect to display if batch-mode
	is non-nil
	* keys.c, images.c, frames.c, fonts.c, cursors.c, colors.c: if
	batch-mode is non-nil, don't do anything that would access the
	display when initialising or shutting down

	* windows.c (Fset_client_state): deleted

	* functions.c (Fget_x_property, Fset_x_property): use CARD16
	and CARD32 types to access 16- and 32-bit data respectively

	* keys.c (num_lock_mod): initialised to the Num_Lock modifier,
	ignored in events
	(grab_event, ungrab_event): grab all combinations including
	LockMask and num_lock_mod

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

	* keys.c (translate_event): ignore the Lock modifier

	* functions.c (Fgrab_pointer): pass last_event_time to
	XGrabPointer (), not CurrentTime (since Fungrab_pointer also
	passes last_event_time)

	* events.c (handle_input_mask): set last_event_time to
	CurrentTime on leaving the function

	* sawmill.h: defining DEBUG to zero sends debugging output to
	db_printf ()
	* display.c (db_printf): replacement printf to store debugging
	output in one of rep's debug buffers

	* sawmill-ui.jl (keymap-shell): doesn't choke on non-symbol
	commands anymore, but it's still not possible to edit arbitrary
	forms..

	* events.c (button_press): click the frame before looking for
	the context map (since we only look for these maps in clicked
	frame parts)
	(unmap_notify): call reset_frame_parts

	* windows.c (Fhide_window): call reset_frame_parts

	* frames.c (reset_frame_parts): new function, resets clicked or
	highlighted state associated with a window frame

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

	* sawmill-ui.jl: fix option-menu problems, abbreviate displayed
	font names to just the font's family

	* sawmill.h: define _GNU_SOURCE
	* functions.c, client.c: some minor `-ansi -pedantic' fixes

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

	* events.c (colormap_notify): fix bug where changing a colormap
	when no window is focused causes a segfault

	* sawmill.h (XlibSpecificationRelease): if undefined, define to
	4; this really means X11R4 or _less_

	* display.c (XGetAtomNames): implement using XGetAtomName ()
	for X11R5 or less

	* events.c (configure_request): if we know about the window,
	call raise-window or lower-window instead of XRaiseWindow () or
	XLowerWindow ()

	* sawmill-ui.jl (build-set): only call
	gtk-option-menu-set-history if history is non-nil

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

	* sawmill.h (struct frame_part): added `highlighted' and
	`pending_refresh' bits

	* events.c: handle highlighting frame parts, and temporarily
	unclicking parts when the mouse leaves them. If the
	ButtonRelease occurs when the mouse isn't in the part, the
	context-map is ignored

	* frames.c: the background/foreground attributes are now
	(NORMAL FOCUSED HIGHLIGHTED CLICKED) (note addition of
	highlighted class, displayed when the mouse is in the part)
	(Vframe_draw_mutex): when t no frame parts are redrawn

	* events.c (Qproperty_notify_hook, Qreparent_notify_hook): new
	hooks
	(get_event_mask): new function, returns an event mask that
	would select a specified type of event

	* keys.c (Fproxy_current_event): allow event_mask and propagate
	args to XSendEvent to be specified

	* frames.c (refresh_frame_part): new function, draws both
	background and foreground

	* sawmill-ui.jl (build-set): sets can now be displayed as
	option menus, clists, as well as the old radio buttons,
	controlled by the ui-set-style var, or the :widget key

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

	* display.c (beep): new function, hooked into rep_beep_fun

	* functions.c (Fdelete_window): only send WM_DELETE_WINDOW
	message if window has said it can handle it, otherwise
	XKillClient

	* windows.c (Fstacking_order): new function

	* functions.c (Fraise_window, Flower_window,
	Fraise_lower_window, Fcirculate_up, Fcirculate_down): deleted
	(Frestack_windows): new function

	* events.c: replace calls to XMapRaised by XMapWindow

	* display.c (error_handler): don't report BadWindow errors that
	we've already handled

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

	* sawmill-ui.jl (build-keymap-shell:update-doc): translate
	newlines to spaces in doc strings
	(build-keymap): flatten and wrap the keymap doc string

	* colors.c (Fcolor_rgb): new function

	* fonts.c (Ftext_width, Ffont_height): new functions

	* sawmill-ui.jl (build-keymap-shell:set-binding): align the
	clist flush left when scrolling to the selected command

	* events.c (key_press): ignore KeyRelease events

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

	* frames.c (list_frame_generator): was making the rectangle of
	the client window too big when setting the shape mask

	* commands.c (Fcall_command): the `W' specifier ignores the
	current event's window if it's the root

	* client.c: new option `-c COMMAND' to invoke an interactive
	function

	* sawmill-ui.jl (build-pages): use a HPaned widget to contain
	the box and group frame, this stops the boundary changing to
	match their relative sizes

	* version 0.3a

	* functions.c (Fgrab_pointer): remove the hack choosing which
	window to grab in
	(Fungrab_pointer): if we're waiting for a ButtonRelease on a
	frame-part, unclick it

	* events.c: changes to how frame-part "clicking" is handled
	(Fquery_pointer): optional arg GET, to force a round-trip to
	the server
	(Faccept_x_input): new function, process any available X events

	* sawmill-ui.jl (keymap-shell): this now has a new key
	`:doc-path' giving the list of documentation databases. This is
	used to display the doc-string of the selected command

	* client.c: after sending the event, _always_ wait for a
	PropertyNotify event, not just for synchronous requests

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

	* version 0.3

	* client.c: new client-server protocol, using X properties to
	allow inter-host communications
	* server.h, server.c: deleted, the server is now Lisp code

	* windows.c (x_find_window_by_id): try harder to find a window
	object for an id, possibly returning an invalidated object
	(remove_window): even if the window has been invalidated, try
	to remove the frame when appropriate

	* sawmill.h (Lisp_Window): new field `saved_id', this is
	another copy of the window id, but isn't zeroed when the error
	handler finds that the window has been deleted

	* events.c (property_notify): between XGet.. calls, check if
	the error handler invalidated the window

	* events.c (destroy_notify): use the x_find_window_by_id
	function to search for a window object for the destroyed window
	(since the error handler may have invalidated it)

	* keys.c: handle `Alt' similarly to `Meta' (i.e. find the
	actual modifier bit then subsitute it)
	* keys.h: added EV_MOD_ALT

	* events.c (Fquery_pointer): only use the stored mouse position
	if we're currently handling an event, and this event stored the
	position

	* functions.c (Fgrab_server, Fungrab_server): set
	`rep_message_fun' to null whilst the server is grabbed (in case
	stdout is to an xterm)

	* functions.c (Fgrab_pointer): if the specified window object
	doesn't have a mapped frame, then grab in the root window

	* functions.c (Fget_x_property): return nil if property doesn't
	exist

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

	* functions.c (Fraise_window, Flower_window,
	Fraise_lower_window, Fdelete_window, Fdestroy_window): these
	now use the `W' interactive decl

	* keys.c (Fcurrent_event_window): check if the window is a
	frame part
	(lookup_binding): new arg, CURRENT-WINDOW, the window whose
	`keymap' property is to be scanned
	(eval_input_event): if the event is a pointer event, look for a
	binding in the window that received the event, not the window
	with the input focus

	* commands.c (Fcall_command): new interactive specs, `w', the
	window that received the current event, and `W', either the
	same as `w' or the focused window

	* main.c (Qbefore_exit_hook): new hook; called before exiting

	* keys.c (Fcurrent_event_window): as well as returning a window
	object, this might instead return the symbol `root' or the
	integer id of an unmanaged window
	(Fproxy_current_event): send the current event on to a
	specified window

	* gnome.c: deleted, this is now done in lisp

	* functions.c (Fdelete_window): accept integer window ids
	(Fdestroy_window): if an integer window id, use XDestroyWindow,
	not XKillClient
	(Fsend_client_message): new function
	(Fcreate_window): new function (so I can do gnome-wm in lisp)
	(x-atom, x-atom-name): translate between symbols<->atoms

	* events.c (client_message): now pass _all_ the data in the
	event to the hook, format is (WINDOW TYPE-ATOM DATA-ARRAY).
	DATA-ARRAY is a string (8-bit format) or vector of integers

	* display.c (x_atom_symbol, x_win_from_arg): new functions

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

	* functions.c (Flist_x_properties, Fdelete_x_property,
	Fset_x_property, Fget_x_property): new functions

	* client.c (eval_lisp_form): don't use puts () to output the
	result string since it could contain zero bytes

	* windows.c (remove_window): a new argument FROM-ERROR. If
	non-nil then we're being called from the error handler, and
	thus won't generate any X protocol requests, let gc destroy the
	frame later

	* frames.c (frame_part_destroyer): don't try to delete parts
	without windows

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

	* frames.c, events.c: it's possible for Imlib_render to trigger
	the X error handler, and possibly invalidate the window that's
	currently being manipulated. So test that `w->id != 0' in
	suitable places

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

	* version 0.2

	* display.c (sys_init): create a new window `no_focus_window'
	that gets given the focus when no other window has it (so we
	receive KeyPress events from it)
	* windows.c (focus_on_window): when told to focus on nothing,
	focus on the `no_focus_window'
	* events.c (unmap_notify): if the window being unmapped has the
	focus (after calling the unmap-notify-hook), unfocus it

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

	* sawmill-ui.jl: two new elements `keymap' and `keymap-shell',
	for keymap customization

	* events.c (circulate_notify): empty event handler

	* keys.c (Fgrab_keymap, Fungrab_keymap): new functions

	* keys.c (lookup_event_name): fix the bug where only the bottom
	16 modifier bits were being checked

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

	* sawmill-ui.jl (build-color:clicked): hide the `Help' button
	in the color selection dialog (since it does nothing)

	* sawmill-ui.jl: always format color specifiers correctly

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

	* sawmill-ui.jl (build-color): implements a separate `color'
	element (pretty similar to the `font' element)
	(build-pages): pages are now implemented as a clist and a frame
	(instead of a notebook). This can be changed via the
	ui-pages-style variable

	* frames.c (list_frame_generator): the `foreground',
	`background' and `font' keys may now be functions

	* frames.c (set_frame_part_bg): for shaped images, apply the
	mask at the correct frame coordinates

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

	* sawmill.h (Lisp_Window): cache the TRANSIENT_FOR hint
	* windows.c (Fwindow_transient_p): use the cached value

	* windows.c (focus_on_window): update `focus_window'
	immediately, instead of waiting for the FocusIn event
	* events.c, display.c: be more careful when changing the
	`focus_window' variable

	* events.c: record the time of the _two_ most recent pointer
	positions, the new function Fquery_last_pointer allows access
	to the earlier position

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

	* sawmill-ui.jl: use a ButtonBox for the control buttons, don't
	display the Revert and Refresh buttons (but they're still
	there, just not enabled)

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

	* sawmill-ui.jl, sawmill-menu.jl: copied from top-level
	directory, these are now compiled before being installed

	* events.c (handle_input_mask): new function, handle all
	outstanding events matching a specified event mask

	* windows.c (Fset_window_frame): between removing the old frame
	and installing the new frame handle all SubstructureNotify
	events to prevent the dread infinite frame-add-remove bug

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

	* sawmill.h (Lisp_Window): make `reparenting' an int so it can
	be incremented and decremented
	* windows.c, events.c: some magic to make the w->reparenting
	work when called from Fset_window_frame

	* frames.c (frame_part_destroyer): destroy frame part windows
	and delete their contexts
	(list_frame_generator): don't look at the frame's unshaped
	property if the client window is shaped

	* colors.c (Fcolor_name, Fcolorp): new functions
	* fonts.c (Ffont_name, Ffontp): new functions

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

	* main.c (sawmill_symbols): set interrupt-mode and error-mode
	to top-level; try to stop the wm getting hung in a
	recursive-edit

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

	* gnome.c (rep_dl_init): delete some properties from the root
	window that other wm's may have set but not removed

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

	* version 0.1

	* main.c (Qsawmill_version): new variable

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

	* windows.c (Fset_client_state): set the WM_STATE property of a
	window

	* main.c (add_hook): new function

	* gnome.c: support the _WIN_STATE hint (but only the sticky
	attribute)

	* events.c (configure_request): raising a window uniconify's
	it, so that the GNOME pager can uniconify windows (!?)

	* cursors.c (Fget_cursor): if a symbol, dereference it's
	cursor-shape property _before_ scanning the list for an
	existing cursor

	* windows.c (Fcall_window_hook): new function, similar to
	call-hook, but first hook argument is always a window. Before
	evaluating the symbol value, look for a property of the same
	name in the window
	* events.c, display.c, windows.c: where appropriate use
	Fcall_window_hook instead of Fcall_hook

	* gnome.c (rep_dl_init): if ignored-window-names or
	sticky-window-names are void, set them to nil before consing on
	the gnome window names

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

	* gnome.c (Fgnome_set_workspace): if no workspace is active,
	pretend that workspace zero is

	* display.c (error_handler): call destroy-notify-hook _after_
	setting window->id to zero
	(sys_init): select for SubstructureNotify on root window

	* events.c (client_message): call `client-message-hook' if
	message isn't handled. This is an `or' style hook

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

	* frames.c (list_frame_generator): detect when regenerating a
	frame by looking at w->frame instead of w->frame_parts (which
	can be null even when the window is framed)

	* gnome.c: new loadable module, minimal GNOME compliance
	(client list, button proxying, workspace details)

	* windows.c (Fwindow_size_hints): pass along the PPosition,
	PSize, USPosition and USSize flags

	* keys.c (event_proxy_fun): hook called when an unbound event
	occurs. Should return TRUE if it handles the event

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

	* frames.c: fix stupid stack-smashing bug

	* images.c (Fimage_modifier, Fset_image_modifier): new
	functions for playing with Imlib's image modifiers

	* frames.c (list_frame_generator): handle propagating the shape
	of the client to the frame here since it's a lot less ugly
	* windows.c: don't call set_window_shape in so many places

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

	* windows.c (add_window): set WM_STATE of client windows
	(Fwindow_put): when the `keymap' property changes, ungrab the
	old keymap, then grab the new one

	* keys.c (Fbind_keys, Funbind_keys): grab/ungrab events in
	client windows if binding to the `global-keymap' or a window's
	`keymap' property

	* frames.c (list_frame_generator): indirect through multiple
	symbols in frame_style

	* windows.c, server.c, functions.c, events.c, display.c:
	replaced some calls to XSync by XFlush. (XSync also buffers any
	pending events, preventing select from returning)

	* display.c: add a call to XSync in the rep_redisplay_fun hook

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

	* windows.c (fix_window_size): call set_window_shape

	* windows.c (add_window): set frame_style to nil not
	default-frame initially

	* frames.c: remove the frame data type, now frames are just
	lists, a null list is a null frame. Also, a window's frame may
	be specified as a symbol, in this case the plist of the symbol
	is used for the frame properties

	* windows.c: select VisibiltyChangeMask on the client window
	not the frame, the frame was always PartiallyObscured (by the
	client?)
	* events.c (visibility_notify): don't check that the event
	window is the frame anymore

	* sawmill.h (Lisp_Window): new field `shaped' set if the client
	window is shaped
	* events.c: handle shaped client windows (ShapeNotify events)
	* windows.c (set_window_shape): new function, copies the client
	windows shape to the frame
	(install_window_frame): call set_window_shape

	* display.c (shape_event_base, shape_error_base): new variables

	* frames.c (list_frame_generator): when regenerating a frame
	recenter the client window in the resized frame window

	* events.c (button_press): fake an unwind-protect around the
	event evaluation, so a ButtonRelease can unclick buttons
	without aborting

	* windows.c (install_window_frame): also select
	SubstructureRedirectMask for frame, so that we get
	ConfigureRequest events for the client window

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

	* frames.c (list_frame_generator): add LeaveWindowMask to frame
	parts

	* windows.c (Qplace_window_hook): new hook, called when windows
	are mapped for the first time
	(Fwindow_transient_p): now returns the id of the other window
	if the window is a transient
	(Fwindow_id, Fwindow_group_id): new functions
	(Fwindow_size_hints): new function, returns the size hints as
	an alist

	* sawmill.h: added exit types for the clean_exit_jmp_buf

	* main.c (Fquit, Frestart): new functions

	* keys.c (Qroot_window_keymap): window to use when mouse is
	over the root

	* functions.c (Fsync_server): new function, calls XSync ()

	* events.c (button_press): handle ButtonPress before evaluating
	the binding, and ButtonRelease after the binding
	(leave_notify): if leaving a frame part, ensure that the
	clicked count is zero

