
This is a list of API changes in SDL's version history.

1.3.0:
	Added SDL_GetNumVideoDrivers() and SDL_GetVideoDriver().
	Replaced SDL_VideoDriverName() with SDL_GetCurrentVideoDriver()
	Added SDL_GetNumAudioDrivers() and SDL_GetAudioDriver().
	Replaced SDL_AudioDriverName() with SDL_GetCurrentAudioDriver()

1.2.10:
	If SDL_OpenAudio() is passed zero for the desired format
	fields, the following environment variables will be used
	to fill them in:
		SDL_AUDIO_FREQUENCY
		SDL_AUDIO_FORMAT
		SDL_AUDIO_CHANNELS
		SDL_AUDIO_SAMPLES
	If an environment variable is not specified, it will be set
	to a reasonable default value.

	Added support for the SDL_VIDEO_FULLSCREEN_HEAD environment
	variable, currently supported on X11 Xinerama configurations.

	Added SDL_GL_SWAP_CONTROL to wait for vsync in OpenGL applications.

	Added SDL_GL_ACCELERATED_VISUAL to guarantee hardware acceleration.

	Added current_w and current_h to the SDL_VideoInfo structure,
	which is set to the desktop resolution during video intialization,
	and then set to the current resolution when a video mode is set.

	SDL_SetVideoMode() now accepts 0 for width or height and will use
	the current video mode (or the desktop mode if no mode has been set.)

	Added SDL_GetKeyRepeat()

	Added SDL_config.h, with defaults for various build environments.

1.2.7:
	Added CPU feature detection functions to SDL_cpuinfo.h:
		SDL_HasRDTSC(), SDL_HasMMX(), SDL_Has3DNow(), SDL_HasSSE(),
		SDL_HasAltiVec()
	Added function to create RWops from const memory: SDL_RWFromConstMem()

1.2.6:
	Added SDL_LoadObject(), SDL_LoadFunction(), and SDL_UnloadObject()

	Added SDL_GL_MULTISAMPLEBUFFERS and SDL_GL_MULTISAMPLESAMPLES for FSAA

1.2.5:
	Added SDL_BUTTON_WHEELUP (4) and SDL_BUTTON_WHEELDOWN (5)

	Added SDL_GL_STEREO for stereoscopic OpenGL contexts

1.2.0:
	Added SDL_VIDEOEXPOSE event to signal that the screen needs to
	be redrawn.  This is currently only delivered to OpenGL windows
	on X11, though it may be delivered in the future when the video
	memory is lost under DirectX.

1.1.8:
	You can pass SDL_NOFRAME to SDL_VideoMode() to create a window
	that has no title bar or frame decoration.  Fullscreen video
	modes automatically have this flag set.

	Added a function to query the clipping rectangle for a surface:
		void SDL_GetClipRect(SDL_Surface *surface, SDL_Rect *rect)

	Added a function to query the current event filter:
		SDL_EventFilter SDL_GetEventFilter(void)

	If you pass -1 to SDL_ShowCursor(), it won't change the current
	cursor visibility state, but will still return it.

	SDL_LockSurface() and SDL_UnlockSurface() are recursive, meaning
	you can nest them as deep as you want, as long as each lock call
	has a matching unlock call.  The surface remains locked until the
	last matching unlock call.

	Note that you may not blit to or from a locked surface.

1.1.7:
	The SDL_SetGammaRamp() and SDL_GetGammaRamp() functions now take
	arrays of Uint16 values instead of Uint8 values.  For the most part,
	you can just take your old values and shift them up 8 bits to get
	new correct values for your gamma ramps.

	You can pass SDL_RLEACCEL in flags passed to SDL_ConvertSurface()
        and SDL will try to RLE accelerate colorkey and alpha blits in the
	resulting surface.

1.1.6:
	Added a function to return the thread ID of a specific thread:
		Uint32 SDL_GetThreadID(SDL_Thread *thread)
	If 'thread' is NULL, this function returns the id for this thread.

1.1.5:
	The YUV overlay structure has been changed to use an array of
	pitches and pixels representing the planes of a YUV image, to
	better enable hardware acceleration.  The YV12 and IYUV formats
	each have three planes, corresponding to the Y, U, and V portions
	of the image, while packed pixel YUV formats just have one plane.

	For palettized mode (8bpp), the screen colormap is now split in
	a physical and a logical palette. The physical palette determines
	what colours the screen pixels will get when displayed, and the
	logical palette controls the mapping from blits to/from the screen.
	A new function, SDL_SetPalette() has been added to change
	logical and physical palettes separately. SDL_SetColors() works
	just as before, and is equivalent to calling SDL_SetPalette() with
	a flag argument of (SDL_LOGPAL|SDL_PHYSPAL).

	SDL_BlitSurface() no longer modifies the source rectangle, only the
	destination rectangle. The width/height members of the destination
	rectangle are ignored, only the position is used.

	The old source clipping function SDL_SetClipping() has been replaced
	with a more useful function to set the destination clipping rectangle:
		SDL_bool SDL_SetClipRect(SDL_Surface *surface, SDL_Rect *rect)
		
	Added a function to see what subsystems have been initialized:
		Uint32 SDL_WasInit(Uint32 flags)

	The Big Alpha Flip: SDL now treats alpha as opacity like everybody
	else, and not as transparency:

	A new cpp symbol: SDL_ALPHA_OPAQUE is defined as 255
	A new cpp symbol: SDL_ALPHA_TRANSPARENT is defined as 0
	Values between 0 and 255 vary from fully transparent to fully opaque.

	New functions:
	SDL_DisplayFormatAlpha()
	    Returns a surface converted to a format with alpha-channel
	    that can be blit efficiently to the screen. (In other words,
	    like SDL_DisplayFormat() but the resulting surface has
	    an alpha channel.)  This is useful for surfaces with alpha.
	SDL_MapRGBA()
	    Works as SDL_MapRGB() but takes an additional alpha parameter.
	SDL_GetRGBA()
	    Works as SDL_GetRGB() but also returns the alpha value
	    (SDL_ALPHA_OPAQUE for formats without an alpha channel)

	Both SDL_GetRGB() and SDL_GetRGBA() now always return values in
	the [0..255] interval. Previously, SDL_GetRGB() would return
	(0xf8, 0xfc, 0xf8) for a completely white pixel in RGB565 format.
	(N.B.: This is broken for bit fields < 3 bits.)

	SDL_MapRGB() returns pixels in which the alpha channel is set opaque.

	SDL_SetAlpha() can now be used for both setting the per-surface
	alpha, using the new way of thinking of alpha, and also to enable
	and disable per-pixel alpha blending for surfaces with an alpha
	channel:
		To disable alpha blending:
			SDL_SetAlpha(surface, 0, 0);
		To re-enable alpha blending:
			SDL_SetAlpha(surface, SDL_SRCALPHA, 0);
	Surfaces with an alpha channel have blending enabled by default.

	SDL_SetAlpha() now accepts SDL_RLEACCEL as a flag, which requests
	RLE acceleration of blits, just as like with SDL_SetColorKey().
	This flag can be set for both surfaces with an alpha channel
	and surfaces with an alpha value set by SDL_SetAlpha().
	As always, RLE surfaces must be locked before pixel access is
	allowed, and unlocked before any other SDL operations are done
	on it.

	The blit semantics for surfaces with and without alpha and colorkey
	have now been defined:

	RGBA->RGB:
	    SDL_SRCALPHA set:
		alpha-blend (using alpha-channel).
		SDL_SRCCOLORKEY ignored.
	    SDL_SRCALPHA not set:
		copy RGB.
		if SDL_SRCCOLORKEY set, only copy the pixels matching the
		RGB values of the source colour key, ignoring alpha in the
		comparison.

	RGB->RGBA:
	    SDL_SRCALPHA set:
		alpha-blend (using the source per-surface alpha value);
		set destination alpha to opaque.
	    SDL_SRCALPHA not set:
		copy RGB, set destination alpha to opaque.
	    both:
		if SDL_SRCCOLORKEY set, only copy the pixels matching the
		source colour key.

	RGBA->RGBA:
	    SDL_SRCALPHA set:
		alpha-blend (using the source alpha channel) the RGB values;
		leave destination alpha untouched. [Note: is this correct?]
		SDL_SRCCOLORKEY ignored.
	    SDL_SRCALPHA not set:
		copy all of RGBA to the destination.
		if SDL_SRCCOLORKEY set, only copy the pixels matching the
		RGB values of the source colour key, ignoring alpha in the
		comparison.

	RGB->RGB: 
	    SDL_SRCALPHA set:
		alpha-blend (using the source per-surface alpha value).
	    SDL_SRCALPHA not set:
		copy RGB.
	    both:
		if SDL_SRCCOLORKEY set, only copy the pixels matching the
		source colour key.

	As a special case, blits from surfaces with per-surface alpha
	value of 128 (50% transparency) are optimised and much faster
	than other alpha values. This does not apply to surfaces with
	alpha channels (per-pixel alpha).

	New functions for manipulating the gamma of the display have
	been added:
		int SDL_SetGamma(float red, float green, float blue);
		int SDL_SetGammaRamp(Uint8 *red, Uint8 *green, Uint8 *blue);
		int SDL_GetGammaRamp(Uint8 *red, Uint8 *green, Uint8 *blue);
	Gamma ramps are tables with 256 entries which map the screen color
	components into actually displayed colors.  For an example of
	implementing gamma correction and gamma fades, see test/testgamma.c
	Gamma control is not supported on all hardware.

1.1.4:
	The size of the SDL_CDtrack structure changed from 8 to 12 bytes
	as the size of the length member was extended to 32 bits.

        You can now use SDL for 2D blitting with a GL mode by passing the
	SDL_OPENGLBLIT flag to SDL_SetVideoMode().  You can specify 16 or
	32 bpp, and the data in the framebuffer is put into the GL scene
	when you call SDL_UpdateRects(), and the scene will be visible
	when you call SDL_GL_SwapBuffers().

	Run the "testgl" test program with the -logo command line option
	to see an example of this blending of 2D and 3D in SDL.

1.1.3:
	Added SDL_FreeRW() to the API, to complement SDL_AllocRW()

	Added resizable window support - just add SDL_RESIZABLE to the
	SDL_SetVideoMode() flags, and then wait for SDL_VIDEORESIZE events.
	See SDL_events.h for details on the new SDL_ResizeEvent structure.

	Added condition variable support, based on mutexes and semaphores.
		SDL_CreateCond()
		SDL_DestroyCond()
		SDL_CondSignal()
		SDL_CondBroadcast()
		SDL_CondWait()
		SDL_CondTimedWait()
	The new function prototypes are in SDL_mutex.h

	Added counting semaphore support, based on the mutex primitive.
		SDL_CreateSemaphore()
		SDL_DestroySemaphore()
		SDL_SemWait()
		SDL_SemTryWait()
		SDL_SemWaitTimeout()
		SDL_SemPost()
		SDL_SemValue()
	The new function prototypes are in SDL_mutex.h

	Added support for asynchronous blitting.  To take advantage of this,
	you must set the SDL_ASYNCBLIT flag when setting the video mode and
	creating surfaces that you want accelerated in this way.  You must
	lock surfaces that have this flag set, and the lock will block until
	any queued blits have completed.

	Added YUV video overlay support.
	The supported YUV formats are: YV12, IYUV, YUY2, UYVY, and YVYU.
	This function creates an overlay surface:
		SDL_CreateYUVOverlay()
	You must lock and unlock the overlay to get access to the data:
		SDL_LockYUVOverlay() SDL_UnlockYUVOverlay()
	You can then display the overlay:
		SDL_DisplayYUVOverlay()
	You must free the overlay when you are done using it:
		SDL_FreeYUVOverlay()
	See SDL_video.h for the full function prototypes.

	The joystick hat position constants have been changed:
	Old constant            New constant
	------------            ------------
	     0                  SDL_HAT_CENTERED
	     1                  SDL_HAT_UP
	     2                  SDL_HAT_RIGHTUP
	     3                  SDL_HAT_RIGHT
	     4                  SDL_HAT_RIGHTDOWN
	     5                  SDL_HAT_DOWN
	     6                  SDL_HAT_LEFTDOWN
	     7                  SDL_HAT_LEFT
	     8                  SDL_HAT_LEFTUP
	The new constants are bitmasks, so you can check for the
	individual axes like this:
		if ( hat_position & SDL_HAT_UP ) {
		}
	and you'll catch left-up, up, and right-up.

1.1.2:
	Added multiple timer support:
		SDL_AddTimer() and SDL_RemoveTimer()

	SDL_WM_SetIcon() now respects the icon colorkey if mask is NULL.

1.1.0:
	Added initial OpenGL support.
	First set GL attributes (such as RGB depth, alpha depth, etc.)
		SDL_GL_SetAttribute()
	Then call SDL_SetVideoMode() with the SDL_OPENGL flag.
	Perform all of your normal GL drawing.
	Finally swap the buffers with the new SDL function:
		SDL_GL_SwapBuffers()
	See the new 'testgl' test program for an example of using GL with SDL.

	You can load GL extension functions by using the function:
		SDL_GL_LoadProcAddress()

	Added functions to initialize and cleanup specific SDL subsystems:
		SDL_InitSubSystem() and SDL_QuitSubSystem()

	Added user-defined event type:
		typedef struct {
        		Uint8 type;
        		int code;
        		void *data1;
        		void *data2;
		} SDL_UserEvent;
	This structure is in the "user" member of an SDL_Event.

	Added a function to push events into the event queue:
		SDL_PushEvent()

	Example of using the new SDL user-defined events:
	{
		SDL_Event event;

		event.type = SDL_USEREVENT;
		event.user.code = my_event_code;
		event.user.data1 = significant_data;
		event.user.data2 = 0;
		SDL_PushEvent(&event);
	}

	Added a function to get mouse deltas since last query:
		SDL_GetRelativeMouseState()

	Added a boolean datatype to SDL_types.h:
		SDL_bool = { SDL_TRUE, SDL_FALSE }

	Added a function to get the current audio status:
		SDL_GetAudioState();
	It returns one of:
		SDL_AUDIO_STOPPED,
		SDL_AUDIO_PLAYING,
		SDL_AUDIO_PAUSED

	Added an AAlib driver (ASCII Art) - by Stephane Peter.

1.0.6:
	The input grab state is reset after each call to SDL_SetVideoMode().
	The input is grabbed by default in fullscreen mode, and ungrabbed in
	windowed mode.  If you want to set input grab to a particular value,
	you should set it after each call to SDL_SetVideoMode().

1.0.5:
	Exposed SDL_AudioInit(), SDL_VideoInit()
	Added SDL_AudioDriverName() and SDL_VideoDriverName()

	Added new window manager function:
		SDL_WM_ToggleFullScreen()
	This is currently implemented only on Linux

	The ALT-ENTER code has been removed - it's not appropriate for a
	lib to bind keys when they aren't even emergency escape sequences.

	ALT-ENTER functionality can be implemented with the following code:

	int Handle_AltEnter(const SDL_Event *event)
	{
	    if ( event->type == SDL_KEYDOWN ) {
	        if ( (event->key.keysym.sym == SDLK_RETURN) &&
	             (event->key.keysym.mod & KMOD_ALT) ) {   
	                SDL_WM_ToggleFullScreen(SDL_GetVideoSurface());
	                return(0);
	        }
	    }
	    return(1);
	}
	SDL_SetEventFilter(Handle_AltEnter);

1.0.3:
	Under X11, if you grab the input and hide the mouse cursor,
	the mouse will go into a "relative motion" mode where you
	will always get relative motion events no matter how far in
	each direction you move the mouse - relative motion is not
	bounded by the edges of the window (though the absolute values
	of the mouse positions are clamped by the size of the window).
	The SVGAlib, framebuffer console, and DirectInput drivers all
	have this behavior naturally, and the GDI and BWindow drivers
	never go into "relative motion" mode.

1.0.2:
	Added a function to enable keyboard repeat:
		SDL_EnableKeyRepeat()

	Added a function to grab the mouse and keyboard input
		SDL_WM_GrabInput()

	Added a function to iconify the window.
		SDL_WM_IconifyWindow()
	If this function succeeds, the application will receive an event
	signaling SDL_APPACTIVE event 

1.0.1:
	Added constants to SDL_audio.h for 16-bit native byte ordering:
		AUDIO_U16SYS, AUDIO_S16SYS

1.0.0:
	New public release

0.11.5:
	A new function SDL_GetVideoSurface() has been added, and returns
	a pointer to the current display surface.

	SDL_AllocSurface() has been renamed SDL_CreateRGBSurface(), and
	a new function SDL_CreateRGBSurfaceFrom() has been added to allow
	creating an SDL surface from an existing pixel data buffer.

	Added SDL_GetRGB() to the headers and documentation.

0.11.4:
	SDL_SetLibraryPath() is no longer meaningful, and has been removed.

0.11.3:
	A new flag for SDL_Init(), SDL_INIT_NOPARACHUTE, prevents SDL from
	installing fatal signal handlers on operating systems that support
	them.

0.9.15:
	SDL_CreateColorCursor() has been removed.  Color cursors should
	be implemented as sprites, blitted by the application when the
	cursor moves.  To get smooth color cursor updates when the app
	is busy, pass the SDL_INIT_EVENTTHREAD flag to SDL_Init().  This
	allows you to handle the mouse motion in another thread from an
	event filter function, but is currently only supported by Linux
	and BeOS.  Note that you'll have to protect the display surface
	from multi-threaded access by using mutexes if you do this.

	Thread-safe surface support has been removed from SDL.
	This makes blitting somewhat faster, by removing SDL_MiddleBlit().
	Code that used SDL_MiddleBlit() should use SDL_LowerBlit() instead.
	You can make your surfaces thread-safe by allocating your own
	mutex and making lock/unlock calls around accesses to your surface.

0.9.14:
	SDL_GetMouseState() now takes pointers to int rather than Uint16.

	If you set the SDL_WINDOWID environment variable under UNIX X11,
	SDL will use that as the main window instead of creating it's own.
	This is an unsupported extension to SDL, and not portable at all.

0.9.13:
	Added a function SDL_SetLibraryPath() which can be used to specify
	the directory containing the SDL dynamic libraries.  This is useful
	for commercial applications which ship with particular versions
	of the libraries, and for security on multi-user systems.
	If this function is not used, the default system directories are 
	searched using the native dynamic object loading mechanism.

	In order to support C linkage under Visual C++, you must declare
	main() without any return type:
		main(int argc, char *argv[]) {
			/* Do the program... */
			return(0);
		}
	C++ programs should also return a value if compiled under VC++.

	The blit_endian member of the SDL_VideoInfo struct has been removed.

	SDL_SymToASCII() has been replaced with SDL_GetKeyName(), so there
	is now no longer any function to translate a keysym to a character.

	The SDL_keysym structure has been extended with a 'scancode' and
	'unicode' member.  The 'scancode' is a hardware specific scancode
	for the key that was pressed, and may be 0.  The 'unicode' member
	is a 16-bit UNICODE translation of the key that was pressed along
	with any modifiers or compose keys that have been pressed.
	If no UNICODE translation exists for the key, 'unicode' will be 0.

	Added a function SDL_EnableUNICODE() to enable/disable UNICODE
	translation of character keypresses.  Translation defaults off.

	To convert existing code to use the new API, change code which
	uses SDL_SymToASCII() to get the keyname to use SDL_GetKeyName(),
	and change code which uses it to get the ASCII value of a sym to
	use the 'unicode' member of the event keysym.

0.9.12:
	There is partial support for 64-bit datatypes.  I don't recommend 
	you use this if you have a choice, because 64-bit datatypes are not
	supported on many platforms.  On platforms for which it is supported,
	the SDL_HAS_64BIT_TYPE C preprocessor define will be enabled, and
	you can use the Uint64 and Sint64 datatypes.

	Added functions to SDL_endian.h to support 64-bit datatypes:
	    SDL_SwapLE64(), SDL_SwapBE64(),
	    SDL_ReadLE64(), SDL_ReadBE64(), SDL_WriteLE64(), SDL_WriteBE64()

	A new member "len_ratio" has been added to the SDL_AudioCVT structure,
	and allows you to determine either the original buffer length or the
	converted buffer length, given the other.

	A new function SDL_FreeWAV() has been added to the API to free data
	allocated by SDL_LoadWAV_RW().  This is necessary under Win32 since
	the gcc compiled DLL uses a different heap than VC++ compiled apps.

	SDL now has initial support for international keyboards using the
	Latin character set.
	If a particular mapping is desired, you can set the DEFAULT_KEYBOARD
	compile-time variable, or you can set the environment variable 
	"SDL_KEYBOARD" to a string identifying the keyboard mapping you desire.
	The valid values for these variables can be found in SDL_keyboard.c

	Full support for German and French keyboards under X11 is implemented.

0.9.11:
	The THREADED_EVENTS compile-time define has been replaced with the
	SDL_INIT_EVENTTHREAD flag.  If this flag is passed to SDL_Init(),
	SDL will create a separate thread to perform input event handling.
	If this flag is passed to SDL_Init(), and the OS doesn't support 
	event handling in a separate thread, SDL_Init() will fail.
	Be sure to add calls to SDL_Delay() in your main thread to allow
	the OS to schedule your event thread, or it may starve, leading
	to slow event delivery and/or dropped events.
	Currently MacOS and Win32 do not support this flag, while BeOS 
	and Linux do support it.  I recommend that your application only
	use this flag if absolutely necessary.

	The SDL thread function passed to SDL_CreateThread() now returns a
	status.  This status can be retrieved by passing a non-NULL pointer
	as the 'status' argument to SDL_WaitThread().

	The volume parameter to SDL_MixAudio() has been increased in range
	from (0-8) to (0-128)

	SDL now has a data source abstraction which can encompass a file,
	an area of memory, or any custom object you can envision.  It uses
	these abstractions, SDL_RWops, in the endian read/write functions,
	and the built-in WAV and BMP file loaders.  This means you can load
	WAV chunks from memory mapped files, compressed archives, network
	pipes, or anything else that has a data read abstraction.

	There are three built-in data source abstractions:
	    SDL_RWFromFile(), SDL_RWFromFP(), SDL_RWFromMem()
	along with a generic data source allocation function:
	    SDL_AllocRW()
	These data sources can be used like stdio file pointers with the
	following convenience functions:
	    SDL_RWseek(), SDL_RWread(), SDL_RWwrite(), SDL_RWclose()
	These functions are defined in the new header file "SDL_rwops.h"

	The endian swapping functions have been turned into macros for speed
	and SDL_CalculateEndian() has been removed.  SDL_endian.h now defines
	SDL_BYTEORDER as either SDL_BIG_ENDIAN or SDL_LIL_ENDIAN depending on
	the endianness of the host system.

	The endian read/write functions now take an SDL_RWops pointer
	instead of a stdio FILE pointer, to support the new data source
	abstraction.

	The SDL_*LoadWAV() functions have been replaced with a single
	SDL_LoadWAV_RW() function that takes a SDL_RWops pointer as it's
	first parameter, and a flag whether or not to automatically 
	free it as the second parameter.  SDL_LoadWAV() is a macro for
	backward compatibility and convenience:
	    SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...);

	The SDL_*LoadBMP()/SDL_*SaveBMP() functions have each been replaced
	with a single function that takes a SDL_RWops pointer as it's
	first parameter, and a flag whether or not to automatically 
	free it as the second parameter.  SDL_LoadBMP() and SDL_SaveBMP()
	are macros for backward compatibility and convenience:
	    SDL_LoadBMP_RW(SDL_RWFromFile("sample.bmp", "rb"), 1, ...);
	    SDL_SaveBMP_RW(SDL_RWFromFile("sample.bmp", "wb"), 1, ...);
	Note that these functions use SDL_RWseek() extensively, and should
	not be used on pipes or other non-seekable data sources.

0.9.10:
	The Linux SDL_SysWMInfo and SDL_SysWMMsg structures have been 
	extended to support multiple types of display drivers, as well as
        safe access to the X11 display when THREADED_EVENTS is enabled.
        The new structures are documented in the SDL_syswm.h header file.

	Thanks to John Elliott <jce@seasip.demon.co.uk>, the UK keyboard
	should now work properly, as well as the "Windows" keys on US
	keyboards.

	The Linux CD-ROM code now reads the CD-ROM devices from /etc/fstab
	instead of trying to open each block device on the system.
	The CD must be listed in /etc/fstab as using the iso9660 filesystem.

	On Linux, if you define THREADED_EVENTS at compile time, a separate
	thread will be spawned to gather X events asynchronously from the
	graphics updates.  This hasn't been extensively tested, but it does
	provide a means of handling keyboard and mouse input in a separate
	thread from the graphics thread.  (This is now enabled by default.)

	A special access function SDL_PeepEvents() allows you to manipulate
	the event queue in a thread-safe manner, including peeking at events,
	removing events of a specified type, and adding new events of arbitrary
	type to the queue (use the new 'user' member of the SDL_Event type).

	If you use SDL_PeepEvents() to gather events, then the main graphics
	thread needs to call SDL_PumpEvents() periodically to drive the event
	loop and generate input events.  This is not necessary if SDL has been 
	compiled with THREADED_EVENTS defined, but doesn't hurt.

	A new function SDL_ThreadID() returns the identifier associated with
	the current thread.

0.9.9:
	The AUDIO_STEREO format flag has been replaced with a new 'channels'
	member of the SDL_AudioSpec structure.  The channels are 1 for mono
	audio, and 2 for stereo audio.  In the future more channels may be
	supported for 3D surround sound.

	The SDL_MixAudio() function now takes an additional volume parameter,
	which should be set to SDL_MIX_MAXVOLUME for compatibility with the
	original function.

	The CD-ROM functions which take a 'cdrom' parameter can now be
	passed NULL, and will act on the last successfully opened CD-ROM.

0.9.8:
	No changes, bugfixes only.
	
0.9.7:
	No changes, bugfixes only.
	
0.9.6:
	Added a fast rectangle fill function: SDL_FillRect()

	Addition of a useful function for getting info on the video hardware:
	    const SDL_VideoInfo *SDL_GetVideoInfo(void)
        This function replaces SDL_GetDisplayFormat().

	Initial support for double-buffering:
	  Use the SDL_DOUBLEBUF flag in SDL_SetVideoMode()
	  Update the screen with a new function: SDL_Flip()

	SDL_AllocSurface() takes two new flags:
	SDL_SRCCOLORKEY means that the surface will be used for colorkey blits
	  and if the hardware supports hardware acceleration of colorkey blits
	  between two surfaces in video memory, to place the surface in video
	  memory if possible, otherwise it will be placed in system memory.
	SDL_SRCALPHA means that the surface will be used for alpha blits and
	  if the hardware supports hardware acceleration of alpha blits between
	  two surfaces in video memory, to place the surface in video memory
	  if possible, otherwise it will be placed in system memory.
	SDL_HWSURFACE now means that the surface will be created with the 
	  same format as the display surface, since having surfaces in video
	  memory is only useful for fast blitting to the screen, and you can't
	  blit surfaces with different surface formats in video memory.

0.9.5:
	You can now pass a NULL mask to SDL_WM_SetIcon(), and it will assume
	that the icon consists of the entire image.

	SDL_LowerBlit() is back -- but don't use it on the display surface.
	It is exactly the same as SDL_MiddleBlit(), but doesn't check for
	thread safety.

	Added SDL_FPLoadBMP(), SDL_FPSaveBMP(), SDL_FPLoadWAV(), which take
	a FILE pointer instead of a file name.

	Added CD-ROM audio control API:
	    SDL_CDNumDrives()
	    SDL_CDName()
	    SDL_CDOpen()
	    SDL_CDStatus()
	    SDL_CDPlayTracks()
	    SDL_CDPlay()
	    SDL_CDPause()
	    SDL_CDResume()
	    SDL_CDStop()
	    SDL_CDEject()
	    SDL_CDClose()

0.9.4:
	No changes, bugfixes only.

0.9.3:
	Mouse motion event now includes relative motion information:
	    Sint16 event->motion.xrel, Sint16 event->motion.yrel

	X11 keyrepeat handling can be disabled by defining IGNORE_X_KEYREPEAT
	    (Add -DIGNORE_X_KEYREPEAT to CFLAGS line in obj/x11Makefile)

0.9.2:
	No changes, bugfixes only.

0.9.1:
	Removed SDL_MapSurface() and SDL_UnmapSurface() -- surfaces are now
	automatically mapped on blit.

0.8.0:
	SDL stable release
