diff --git a/Graphics/X11.hs b/Graphics/X11.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/X11.hs
@@ -0,0 +1,25 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+-- 
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A Haskell binding for the X11 libraries.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11 
+        ( module Graphics.X11.Types
+        , module Graphics.X11.Xlib 
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib 
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Types.hsc b/Graphics/X11/Types.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Types.hsc
@@ -0,0 +1,1679 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Types
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of type declarations for interfacing with X11.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Types
+	(
+
+	XID,
+	Mask,
+	Atom,
+	VisualID,
+	Time,
+	Window,
+	Drawable,
+	Font,
+	Pixmap,
+	Cursor,
+	Colormap,
+	GContext,
+	KeyCode,
+
+	-- * Enumeration types
+	-- | These types were introduced to make function types clearer.
+	-- Note that the types are synonyms for 'Int', so no extra
+	-- typesafety was obtained.
+
+	-- ** Key symbols
+	KeySym,
+
+	xK_VoidSymbol,
+	xK_BackSpace,
+	xK_Tab,
+	xK_Linefeed,
+	xK_Clear,
+	xK_Return,
+	xK_Pause,
+	xK_Scroll_Lock,
+	xK_Sys_Req,
+	xK_Escape,
+	xK_Delete,
+	xK_Multi_key,
+	xK_Home,
+	xK_Left,
+	xK_Up,
+	xK_Right,
+	xK_Down,
+	xK_Prior,
+	xK_Page_Up,
+	xK_Next,
+	xK_Page_Down,
+	xK_End,
+	xK_Begin,
+	xK_Select,
+	xK_Print,
+	xK_Execute,
+	xK_Insert,
+	xK_Undo,
+	xK_Redo,
+	xK_Menu,
+	xK_Find,
+	xK_Cancel,
+	xK_Help,
+	xK_Break,
+	xK_Mode_switch,
+	xK_script_switch,
+	xK_Num_Lock,
+	xK_KP_Space,
+	xK_KP_Tab,
+	xK_KP_Enter,
+	xK_KP_F1,
+	xK_KP_F2,
+	xK_KP_F3,
+	xK_KP_F4,
+	xK_KP_Home,
+	xK_KP_Left,
+	xK_KP_Up,
+	xK_KP_Right,
+	xK_KP_Down,
+	xK_KP_Prior,
+	xK_KP_Page_Up,
+	xK_KP_Next,
+	xK_KP_Page_Down,
+	xK_KP_End,
+	xK_KP_Begin,
+	xK_KP_Insert,
+	xK_KP_Delete,
+	xK_KP_Equal,
+	xK_KP_Multiply,
+	xK_KP_Add,
+	xK_KP_Separator,
+	xK_KP_Subtract,
+	xK_KP_Decimal,
+	xK_KP_Divide,
+	xK_KP_0,
+	xK_KP_1,
+	xK_KP_2,
+	xK_KP_3,
+	xK_KP_4,
+	xK_KP_5,
+	xK_KP_6,
+	xK_KP_7,
+	xK_KP_8,
+	xK_KP_9,
+	xK_F1,
+	xK_F2,
+	xK_F3,
+	xK_F4,
+	xK_F5,
+	xK_F6,
+	xK_F7,
+	xK_F8,
+	xK_F9,
+	xK_F10,
+	xK_F11,
+	xK_L1,
+	xK_F12,
+	xK_L2,
+	xK_F13,
+	xK_L3,
+	xK_F14,
+	xK_L4,
+	xK_F15,
+	xK_L5,
+	xK_F16,
+	xK_L6,
+	xK_F17,
+	xK_L7,
+	xK_F18,
+	xK_L8,
+	xK_F19,
+	xK_L9,
+	xK_F20,
+	xK_L10,
+	xK_F21,
+	xK_R1,
+	xK_F22,
+	xK_R2,
+	xK_F23,
+	xK_R3,
+	xK_F24,
+	xK_R4,
+	xK_F25,
+	xK_R5,
+	xK_F26,
+	xK_R6,
+	xK_F27,
+	xK_R7,
+	xK_F28,
+	xK_R8,
+	xK_F29,
+	xK_R9,
+	xK_F30,
+	xK_R10,
+	xK_F31,
+	xK_R11,
+	xK_F32,
+	xK_R12,
+	xK_F33,
+	xK_R13,
+	xK_F34,
+	xK_R14,
+	xK_F35,
+	xK_R15,
+	xK_Shift_L,
+	xK_Shift_R,
+	xK_Control_L,
+	xK_Control_R,
+	xK_Caps_Lock,
+	xK_Shift_Lock,
+	xK_Meta_L,
+	xK_Meta_R,
+	xK_Alt_L,
+	xK_Alt_R,
+	xK_Super_L,
+	xK_Super_R,
+	xK_Hyper_L,
+	xK_Hyper_R,
+	xK_space,
+	xK_exclam,
+	xK_quotedbl,
+	xK_numbersign,
+	xK_dollar,
+	xK_percent,
+	xK_ampersand,
+	xK_apostrophe,
+	xK_quoteright,
+	xK_parenleft,
+	xK_parenright,
+	xK_asterisk,
+	xK_plus,
+	xK_comma,
+	xK_minus,
+	xK_period,
+	xK_slash,
+	xK_0,
+	xK_1,
+	xK_2,
+	xK_3,
+	xK_4,
+	xK_5,
+	xK_6,
+	xK_7,
+	xK_8,
+	xK_9,
+	xK_colon,
+	xK_semicolon,
+	xK_less,
+	xK_equal,
+	xK_greater,
+	xK_question,
+	xK_at,
+	xK_A,
+	xK_B,
+	xK_C,
+	xK_D,
+	xK_E,
+	xK_F,
+	xK_G,
+	xK_H,
+	xK_I,
+	xK_J,
+	xK_K,
+	xK_L,
+	xK_M,
+	xK_N,
+	xK_O,
+	xK_P,
+	xK_Q,
+	xK_R,
+	xK_S,
+	xK_T,
+	xK_U,
+	xK_V,
+	xK_W,
+	xK_X,
+	xK_Y,
+	xK_Z,
+	xK_bracketleft,
+	xK_backslash,
+	xK_bracketright,
+	xK_asciicircum,
+	xK_underscore,
+	xK_grave,
+	xK_quoteleft,
+	xK_a,
+	xK_b,
+	xK_c,
+	xK_d,
+	xK_e,
+	xK_f,
+	xK_g,
+	xK_h,
+	xK_i,
+	xK_j,
+	xK_k,
+	xK_l,
+	xK_m,
+	xK_n,
+	xK_o,
+	xK_p,
+	xK_q,
+	xK_r,
+	xK_s,
+	xK_t,
+	xK_u,
+	xK_v,
+	xK_w,
+	xK_x,
+	xK_y,
+	xK_z,
+	xK_braceleft,
+	xK_bar,
+	xK_braceright,
+	xK_asciitilde,
+	xK_nobreakspace,
+	xK_exclamdown,
+	xK_cent,
+	xK_sterling,
+	xK_currency,
+	xK_yen,
+	xK_brokenbar,
+	xK_section,
+	xK_diaeresis,
+	xK_copyright,
+	xK_ordfeminine,
+	xK_guillemotleft,
+	xK_notsign,
+	xK_hyphen,
+	xK_registered,
+	xK_macron,
+	xK_degree,
+	xK_plusminus,
+	xK_twosuperior,
+	xK_threesuperior,
+	xK_acute,
+	xK_mu,
+	xK_paragraph,
+	xK_periodcentered,
+	xK_cedilla,
+	xK_onesuperior,
+	xK_masculine,
+	xK_guillemotright,
+	xK_onequarter,
+	xK_onehalf,
+	xK_threequarters,
+	xK_questiondown,
+	xK_Agrave,
+	xK_Aacute,
+	xK_Acircumflex,
+	xK_Atilde,
+	xK_Adiaeresis,
+	xK_Aring,
+	xK_AE,
+	xK_Ccedilla,
+	xK_Egrave,
+	xK_Eacute,
+	xK_Ecircumflex,
+	xK_Ediaeresis,
+	xK_Igrave,
+	xK_Iacute,
+	xK_Icircumflex,
+	xK_Idiaeresis,
+	xK_ETH,
+	xK_Eth,
+	xK_Ntilde,
+	xK_Ograve,
+	xK_Oacute,
+	xK_Ocircumflex,
+	xK_Otilde,
+	xK_Odiaeresis,
+	xK_multiply,
+	xK_Ooblique,
+	xK_Ugrave,
+	xK_Uacute,
+	xK_Ucircumflex,
+	xK_Udiaeresis,
+	xK_Yacute,
+	xK_THORN,
+	xK_Thorn,
+	xK_ssharp,
+	xK_agrave,
+	xK_aacute,
+	xK_acircumflex,
+	xK_atilde,
+	xK_adiaeresis,
+	xK_aring,
+	xK_ae,
+	xK_ccedilla,
+	xK_egrave,
+	xK_eacute,
+	xK_ecircumflex,
+	xK_ediaeresis,
+	xK_igrave,
+	xK_iacute,
+	xK_icircumflex,
+	xK_idiaeresis,
+	xK_eth,
+	xK_ntilde,
+	xK_ograve,
+	xK_oacute,
+	xK_ocircumflex,
+	xK_otilde,
+	xK_odiaeresis,
+	xK_division,
+	xK_oslash,
+	xK_ugrave,
+	xK_uacute,
+	xK_ucircumflex,
+	xK_udiaeresis,
+	xK_yacute,
+	xK_thorn,
+	xK_ydiaeresis,
+
+	-- ** Event masks
+	EventMask,
+	noEventMask,
+	keyPressMask,
+	keyReleaseMask,
+	buttonPressMask,
+	buttonReleaseMask,
+	enterWindowMask,
+	leaveWindowMask,
+	pointerMotionMask,
+	pointerMotionHintMask,
+	button1MotionMask,
+	button2MotionMask,
+	button3MotionMask,
+	button4MotionMask,
+	button5MotionMask,
+	buttonMotionMask,
+	keymapStateMask,
+	exposureMask,
+	visibilityChangeMask,
+	structureNotifyMask,
+	resizeRedirectMask,
+	substructureNotifyMask,
+	substructureRedirectMask,
+	focusChangeMask,
+	propertyChangeMask,
+	colormapChangeMask,
+	ownerGrabButtonMask,
+
+	-- ** Event types
+	EventType,
+	keyPress,
+	keyRelease,
+	buttonPress,
+	buttonRelease,
+	motionNotify,
+	enterNotify,
+	leaveNotify,
+	focusIn,
+	focusOut,
+	keymapNotify,
+	expose,
+	graphicsExpose,
+	noExpose,
+	visibilityNotify,
+	createNotify,
+	destroyNotify,
+	unmapNotify,
+	mapNotify,
+	mapRequest,
+	reparentNotify,
+	configureNotify,
+	configureRequest,
+	gravityNotify,
+	resizeRequest,
+	circulateNotify,
+	circulateRequest,
+	propertyNotify,
+	selectionClear,
+	selectionRequest,
+	selectionNotify,
+	colormapNotify,
+	clientMessage,
+	mappingNotify,
+	lASTEvent,
+
+	-- ** Modifiers
+	Modifier,
+	shiftMapIndex,
+	lockMapIndex,
+	controlMapIndex,
+	mod1MapIndex,
+	mod2MapIndex,
+	mod3MapIndex,
+	mod4MapIndex,
+	mod5MapIndex,
+	anyModifier,
+
+	-- ** Key masks
+	KeyMask,
+	shiftMask,
+	lockMask,
+	controlMask,
+	mod1Mask,
+	mod2Mask,
+	mod3Mask,
+	mod4Mask,
+	mod5Mask,
+
+	-- ** Button masks
+	ButtonMask,
+	button1Mask,
+	button2Mask,
+	button3Mask,
+	button4Mask,
+	button5Mask,
+
+	-- ** Buttons
+	Button,
+	button1,
+	button2,
+	button3,
+	button4,
+	button5,
+
+	-- ** Notify modes
+	NotifyMode,
+	notifyNormal,
+	notifyGrab,
+	notifyUngrab,
+	notifyWhileGrabbed,
+	notifyHint,
+
+	-- ** Notify details
+	NotifyDetail,
+	notifyAncestor,
+	notifyVirtual,
+	notifyInferior,
+	notifyNonlinear,
+	notifyNonlinearVirtual,
+	notifyPointer,
+	notifyPointerRoot,
+	notifyDetailNone,
+
+	-- ** Visibility
+	Visibility,
+	visibilityUnobscured,
+	visibilityPartiallyObscured,
+	visibilityFullyObscured,
+
+	-- ** Place of window
+	Place,
+	placeOnTop,
+	placeOnBottom,
+
+	-- ** Protocols
+	Protocol,
+	familyInternet,
+	familyDECnet,
+	familyChaos,
+
+	-- ** Property notification
+	PropertyNotification,
+	propertyNewValue,
+	propertyDelete,
+
+	-- ** Colormap notification
+	ColormapNotification,
+	colormapUninstalled,
+	colormapInstalled,
+
+	-- ** Grab modes
+	GrabMode,
+	grabModeSync,
+	grabModeAsync,
+
+	-- ** Grab status
+	GrabStatus,
+	grabSuccess,
+	alreadyGrabbed,
+	grabInvalidTime,
+	grabNotViewable,
+	grabFrozen,
+
+	-- ** Allow events
+	AllowEvents,
+	asyncPointer,
+	syncPointer,
+	replayPointer,
+	asyncKeyboard,
+	syncKeyboard,
+	replayKeyboard,
+	asyncBoth,
+	syncBoth,
+
+	-- ** Focus modes
+	FocusMode,
+	revertToNone,
+	revertToPointerRoot,
+	revertToParent,
+
+	-- ** Error codes
+	ErrorCode,
+	success,
+	badRequest,
+	badValue,
+	badWindow,
+	badPixmap,
+	badAtom,
+	badCursor,
+	badFont,
+	badMatch,
+	badDrawable,
+	badAccess,
+	badAlloc,
+	badColor,
+	badGC,
+	badIDChoice,
+	badName,
+	badLength,
+	badImplementation,
+	firstExtensionError,
+	lastExtensionError,
+
+	-- ** Return status
+	Status,
+	throwIfZero,
+
+	-- ** WindowClass
+	WindowClass,
+	copyFromParent,
+	inputOutput,
+	inputOnly,
+
+	-- ** Attribute masks
+	AttributeMask,
+	cWBackPixmap,
+	cWBackPixel,
+	cWBorderPixmap,
+	cWBorderPixel,
+	cWBitGravity,
+	cWWinGravity,
+	cWBackingStore,
+	cWBackingPlanes,
+	cWBackingPixel,
+	cWOverrideRedirect,
+	cWSaveUnder,
+	cWEventMask,
+	cWDontPropagate,
+	cWColormap,
+	cWCursor,
+
+	-- ** Close down modes
+	CloseDownMode,
+	destroyAll,
+	retainPermanent,
+	retainTemporary,
+
+	-- ** QueryBestSize classes
+	QueryBestSizeClass,
+	cursorShape,
+	tileShape,
+	stippleShape,
+
+	-- ** Graphics functions
+	GXFunction,
+	gXclear,
+	gXand,
+	gXandReverse,
+	gXcopy,
+	gXandInverted,
+	gXnoop,
+	gXxor,
+	gXor,
+	gXnor,
+	gXequiv,
+	gXinvert,
+	gXorReverse,
+	gXcopyInverted,
+	gXorInverted,
+	gXnand,
+	gXset,
+
+	-- ** Line styles
+	LineStyle,
+	lineSolid,
+	lineOnOffDash,
+	lineDoubleDash,
+
+	-- ** Cap styles
+	CapStyle,
+	capNotLast,
+	capButt,
+	capRound,
+	capProjecting,
+
+	-- ** Join styles
+	JoinStyle,
+	joinMiter,
+	joinRound,
+	joinBevel,
+
+	-- ** Fill styles
+	FillStyle,
+	fillSolid,
+	fillTiled,
+	fillStippled,
+	fillOpaqueStippled,
+
+	-- ** Fill rules
+	FillRule,
+	evenOddRule,
+	windingRule,
+
+	-- ** Subwindow modes
+	SubWindowMode,
+	clipByChildren,
+	includeInferiors,
+
+	-- ** Coordinate modes
+	CoordinateMode,
+	coordModeOrigin,
+	coordModePrevious,
+
+	-- ** Polygon shapes
+	PolygonShape,
+	complex,
+	nonconvex,
+	convex,
+
+	-- ** Arc modes
+	ArcMode,
+	arcChord,
+	arcPieSlice,
+
+	-- ** GC masks
+	GCMask,
+	gCFunction,
+	gCPlaneMask,
+	gCForeground,
+	gCBackground,
+	gCLineWidth,
+	gCLineStyle,
+	gCCapStyle,
+	gCJoinStyle,
+	gCFillStyle,
+	gCFillRule,
+	gCTile,
+	gCStipple,
+	gCTileStipXOrigin,
+	gCTileStipYOrigin,
+	gCFont,
+	gCSubwindowMode,
+	gCGraphicsExposures,
+	gCClipXOrigin,
+	gCClipYOrigin,
+	gCClipMask,
+	gCDashOffset,
+	gCDashList,
+	gCArcMode,
+	gCLastBit,
+
+	-- ** Circulation direction
+	CirculationDirection,
+	raiseLowest,
+	lowerHighest,
+
+	-- ** Byte order
+	ByteOrder,
+	lSBFirst,
+	mSBFirst,
+
+	-- ** ColormapAlloc
+	ColormapAlloc,
+	allocNone,
+	allocAll,
+
+	-- ** Mapping requests
+	MappingRequest,
+	mappingModifier,
+	mappingKeyboard,
+	mappingPointer,
+
+	-- ** ChangeSaveSetMode
+	ChangeSaveSetMode,
+	setModeInsert,
+	setModeDelete,
+
+	-- ** Bit gravity
+	BitGravity,
+	forgetGravity,
+	northWestGravity,
+	northGravity,
+	northEastGravity,
+	westGravity,
+	centerGravity,
+	eastGravity,
+	southWestGravity,
+	southGravity,
+	southEastGravity,
+	staticGravity,
+
+	-- ** Window gravity
+	WindowGravity,
+	unmapGravity,
+
+	-- ** Backing store
+	BackingStore,
+	notUseful,
+	whenMapped,
+	always,
+	doRed,
+	doGreen,
+	doBlue,
+
+	-- ** Font direction
+	FontDirection,
+	fontLeftToRight,
+	fontRightToLeft,
+
+	) where
+
+import Data.Int
+import Data.Word
+import Foreign.Marshal.Error
+
+#include "HsXlib.h"
+
+-- ToDo: use newtype
+type XID      = #{type XID}
+type Mask     = #{type Mask}
+type Atom     = #{type Atom}
+type VisualID = #{type VisualID}
+type Time     = #{type Time}
+
+-- end platform dependency
+
+type Window   = XID
+type Drawable = XID
+type Font     = XID
+type Pixmap   = XID
+type Cursor   = XID
+type Colormap = XID
+type GContext = XID
+
+type KeyCode  = Char
+
+type KeySym   = XID
+
+#{enum KeySym,
+ , xK_VoidSymbol	= XK_VoidSymbol
+ }
+
+-- TTY Functions, cleverly chosen to map to ascii, for convenience of
+-- programming, but could have been arbitrary (at the cost of lookup
+-- tables in client code.
+
+#{enum KeySym,
+ , xK_BackSpace		= XK_BackSpace
+ , xK_Tab		= XK_Tab
+ , xK_Linefeed		= XK_Linefeed
+ , xK_Clear		= XK_Clear
+ , xK_Return		= XK_Return
+ , xK_Pause		= XK_Pause
+ , xK_Scroll_Lock	= XK_Scroll_Lock
+ , xK_Sys_Req		= XK_Sys_Req
+ , xK_Escape		= XK_Escape
+ , xK_Delete		= XK_Delete
+ }
+
+-- International & multi-key character composition
+#{enum KeySym,
+ , xK_Multi_key		= XK_Multi_key
+ }
+-- xK_Codeinput		= XK_Codeinput		-- Not defined for SunOS.
+-- xK_SingleCandidate	= XK_SingleCandidate	-- Not defined for SunOS.
+-- xK_MultipleCandidate	= XK_MultipleCandidate	-- Not defined for SunOS.
+-- xK_PreviousCandidate	= XK_PreviousCandidate	-- Not defined for SunOS.
+
+-- Cursor control & motion
+#{enum KeySym,
+ , xK_Home		= XK_Home
+ , xK_Left		= XK_Left
+ , xK_Up		= XK_Up
+ , xK_Right		= XK_Right
+ , xK_Down		= XK_Down
+ , xK_Prior		= XK_Prior
+ , xK_Page_Up		= XK_Page_Up
+ , xK_Next		= XK_Next
+ , xK_Page_Down		= XK_Page_Down
+ , xK_End		= XK_End
+ , xK_Begin		= XK_Begin
+
+ , xK_Select		= XK_Select
+ , xK_Print		= XK_Print
+ , xK_Execute		= XK_Execute
+ , xK_Insert		= XK_Insert
+ , xK_Undo		= XK_Undo
+ , xK_Redo		= XK_Redo
+ , xK_Menu		= XK_Menu
+ , xK_Find		= XK_Find
+ , xK_Cancel		= XK_Cancel
+ , xK_Help		= XK_Help
+ , xK_Break		= XK_Break
+ , xK_Mode_switch	= XK_Mode_switch
+ , xK_script_switch	= XK_script_switch
+ , xK_Num_Lock		= XK_Num_Lock
+ }
+
+-- Keypad Functions, keypad numbers cleverly chosen to map to ascii
+#{enum KeySym,
+ , xK_KP_Space		= XK_KP_Space
+ , xK_KP_Tab		= XK_KP_Tab
+ , xK_KP_Enter		= XK_KP_Enter
+ , xK_KP_F1		= XK_KP_F1
+ , xK_KP_F2		= XK_KP_F2
+ , xK_KP_F3		= XK_KP_F3
+ , xK_KP_F4		= XK_KP_F4
+ , xK_KP_Home		= XK_KP_Home
+ , xK_KP_Left		= XK_KP_Left
+ , xK_KP_Up		= XK_KP_Up
+ , xK_KP_Right		= XK_KP_Right
+ , xK_KP_Down		= XK_KP_Down
+ , xK_KP_Prior		= XK_KP_Prior
+ , xK_KP_Page_Up	= XK_KP_Page_Up
+ , xK_KP_Next		= XK_KP_Next
+ , xK_KP_Page_Down	= XK_KP_Page_Down
+ , xK_KP_End		= XK_KP_End
+ , xK_KP_Begin		= XK_KP_Begin
+ , xK_KP_Insert		= XK_KP_Insert
+ , xK_KP_Delete		= XK_KP_Delete
+ , xK_KP_Equal		= XK_KP_Equal
+ , xK_KP_Multiply	= XK_KP_Multiply
+ , xK_KP_Add		= XK_KP_Add
+ , xK_KP_Separator	= XK_KP_Separator
+ , xK_KP_Subtract	= XK_KP_Subtract
+ , xK_KP_Decimal	= XK_KP_Decimal
+ , xK_KP_Divide		= XK_KP_Divide
+
+ , xK_KP_0		= XK_KP_0
+ , xK_KP_1		= XK_KP_1
+ , xK_KP_2		= XK_KP_2
+ , xK_KP_3		= XK_KP_3
+ , xK_KP_4		= XK_KP_4
+ , xK_KP_5		= XK_KP_5
+ , xK_KP_6		= XK_KP_6
+ , xK_KP_7		= XK_KP_7
+ , xK_KP_8		= XK_KP_8
+ , xK_KP_9		= XK_KP_9
+
+ , xK_F1		= XK_F1
+ , xK_F2		= XK_F2
+ , xK_F3		= XK_F3
+ , xK_F4		= XK_F4
+ , xK_F5		= XK_F5
+ , xK_F6		= XK_F6
+ , xK_F7		= XK_F7
+ , xK_F8		= XK_F8
+ , xK_F9		= XK_F9
+ , xK_F10		= XK_F10
+ , xK_F11		= XK_F11
+ , xK_L1		= XK_L1
+ , xK_F12		= XK_F12
+ , xK_L2		= XK_L2
+ , xK_F13		= XK_F13
+ , xK_L3		= XK_L3
+ , xK_F14		= XK_F14
+ , xK_L4		= XK_L4
+ , xK_F15		= XK_F15
+ , xK_L5		= XK_L5
+ , xK_F16		= XK_F16
+ , xK_L6		= XK_L6
+ , xK_F17		= XK_F17
+ , xK_L7		= XK_L7
+ , xK_F18		= XK_F18
+ , xK_L8		= XK_L8
+ , xK_F19		= XK_F19
+ , xK_L9		= XK_L9
+ , xK_F20		= XK_F20
+ , xK_L10		= XK_L10
+ , xK_F21		= XK_F21
+ , xK_R1		= XK_R1
+ , xK_F22		= XK_F22
+ , xK_R2		= XK_R2
+ , xK_F23		= XK_F23
+ , xK_R3		= XK_R3
+ , xK_F24		= XK_F24
+ , xK_R4		= XK_R4
+ , xK_F25		= XK_F25
+ , xK_R5		= XK_R5
+ , xK_F26		= XK_F26
+ , xK_R6		= XK_R6
+ , xK_F27		= XK_F27
+ , xK_R7		= XK_R7
+ , xK_F28		= XK_F28
+ , xK_R8		= XK_R8
+ , xK_F29		= XK_F29
+ , xK_R9		= XK_R9
+ , xK_F30		= XK_F30
+ , xK_R10		= XK_R10
+ , xK_F31		= XK_F31
+ , xK_R11		= XK_R11
+ , xK_F32		= XK_F32
+ , xK_R12		= XK_R12
+ , xK_F33		= XK_F33
+ , xK_R13		= XK_R13
+ , xK_F34		= XK_F34
+ , xK_R14		= XK_R14
+ , xK_F35		= XK_F35
+ , xK_R15		= XK_R15
+ }
+
+#{enum KeySym,
+ , xK_Shift_L		= XK_Shift_L
+ , xK_Shift_R		= XK_Shift_R
+ , xK_Control_L		= XK_Control_L
+ , xK_Control_R		= XK_Control_R
+ , xK_Caps_Lock		= XK_Caps_Lock
+ , xK_Shift_Lock	= XK_Shift_Lock
+
+ , xK_Meta_L		= XK_Meta_L
+ , xK_Meta_R		= XK_Meta_R
+ , xK_Alt_L		= XK_Alt_L
+ , xK_Alt_R		= XK_Alt_R
+ , xK_Super_L		= XK_Super_L
+ , xK_Super_R		= XK_Super_R
+ , xK_Hyper_L		= XK_Hyper_L
+ , xK_Hyper_R		= XK_Hyper_R
+ }
+
+#{enum KeySym,
+ , xK_space		= XK_space
+ , xK_exclam		= XK_exclam
+ , xK_quotedbl		= XK_quotedbl
+ , xK_numbersign	= XK_numbersign
+ , xK_dollar		= XK_dollar
+ , xK_percent		= XK_percent
+ , xK_ampersand		= XK_ampersand
+ , xK_apostrophe	= XK_apostrophe
+ , xK_quoteright	= XK_quoteright
+ , xK_parenleft		= XK_parenleft
+ , xK_parenright	= XK_parenright
+ , xK_asterisk		= XK_asterisk
+ , xK_plus		= XK_plus
+ , xK_comma		= XK_comma
+ , xK_minus		= XK_minus
+ , xK_period		= XK_period
+ , xK_slash		= XK_slash
+ , xK_0			= XK_0
+ , xK_1			= XK_1
+ , xK_2			= XK_2
+ , xK_3			= XK_3
+ , xK_4			= XK_4
+ , xK_5			= XK_5
+ , xK_6			= XK_6
+ , xK_7			= XK_7
+ , xK_8			= XK_8
+ , xK_9			= XK_9
+ , xK_colon		= XK_colon
+ , xK_semicolon		= XK_semicolon
+ , xK_less		= XK_less
+ , xK_equal		= XK_equal
+ , xK_greater		= XK_greater
+ , xK_question		= XK_question
+ , xK_at		= XK_at
+ , xK_A			= XK_A
+ , xK_B			= XK_B
+ , xK_C			= XK_C
+ , xK_D			= XK_D
+ , xK_E			= XK_E
+ , xK_F			= XK_F
+ , xK_G			= XK_G
+ , xK_H			= XK_H
+ , xK_I			= XK_I
+ , xK_J			= XK_J
+ , xK_K			= XK_K
+ , xK_L			= XK_L
+ , xK_M			= XK_M
+ , xK_N			= XK_N
+ , xK_O			= XK_O
+ , xK_P			= XK_P
+ , xK_Q			= XK_Q
+ , xK_R			= XK_R
+ , xK_S			= XK_S
+ , xK_T			= XK_T
+ , xK_U			= XK_U
+ , xK_V			= XK_V
+ , xK_W			= XK_W
+ , xK_X			= XK_X
+ , xK_Y			= XK_Y
+ , xK_Z			= XK_Z
+ , xK_bracketleft	= XK_bracketleft
+ , xK_backslash		= XK_backslash
+ , xK_bracketright	= XK_bracketright
+ , xK_asciicircum	= XK_asciicircum
+ , xK_underscore	= XK_underscore
+ , xK_grave		= XK_grave
+ , xK_quoteleft		= XK_quoteleft
+ , xK_a			= XK_a
+ , xK_b			= XK_b
+ , xK_c			= XK_c
+ , xK_d			= XK_d
+ , xK_e			= XK_e
+ , xK_f			= XK_f
+ , xK_g			= XK_g
+ , xK_h			= XK_h
+ , xK_i			= XK_i
+ , xK_j			= XK_j
+ , xK_k			= XK_k
+ , xK_l			= XK_l
+ , xK_m			= XK_m
+ , xK_n			= XK_n
+ , xK_o			= XK_o
+ , xK_p			= XK_p
+ , xK_q			= XK_q
+ , xK_r			= XK_r
+ , xK_s			= XK_s
+ , xK_t			= XK_t
+ , xK_u			= XK_u
+ , xK_v			= XK_v
+ , xK_w			= XK_w
+ , xK_x			= XK_x
+ , xK_y			= XK_y
+ , xK_z			= XK_z
+ , xK_braceleft		= XK_braceleft
+ , xK_bar		= XK_bar
+ , xK_braceright	= XK_braceright
+ , xK_asciitilde	= XK_asciitilde
+ }
+
+#{enum KeySym,
+ , xK_nobreakspace	= XK_nobreakspace
+ , xK_exclamdown	= XK_exclamdown
+ , xK_cent		= XK_cent
+ , xK_sterling		= XK_sterling
+ , xK_currency		= XK_currency
+ , xK_yen		= XK_yen
+ , xK_brokenbar		= XK_brokenbar
+ , xK_section		= XK_section
+ , xK_diaeresis		= XK_diaeresis
+ , xK_copyright		= XK_copyright
+ , xK_ordfeminine	= XK_ordfeminine
+ , xK_guillemotleft	= XK_guillemotleft
+ , xK_notsign		= XK_notsign
+ , xK_hyphen		= XK_hyphen
+ , xK_registered	= XK_registered
+ , xK_macron		= XK_macron
+ , xK_degree		= XK_degree
+ , xK_plusminus		= XK_plusminus
+ , xK_twosuperior	= XK_twosuperior
+ , xK_threesuperior	= XK_threesuperior
+ , xK_acute		= XK_acute
+ , xK_mu		= XK_mu
+ , xK_paragraph		= XK_paragraph
+ , xK_periodcentered	= XK_periodcentered
+ , xK_cedilla		= XK_cedilla
+ , xK_onesuperior	= XK_onesuperior
+ , xK_masculine		= XK_masculine
+ , xK_guillemotright	= XK_guillemotright
+ , xK_onequarter	= XK_onequarter
+ , xK_onehalf		= XK_onehalf
+ , xK_threequarters	= XK_threequarters
+ , xK_questiondown	= XK_questiondown
+ , xK_Agrave		= XK_Agrave
+ , xK_Aacute		= XK_Aacute
+ , xK_Acircumflex	= XK_Acircumflex
+ , xK_Atilde		= XK_Atilde
+ , xK_Adiaeresis	= XK_Adiaeresis
+ , xK_Aring		= XK_Aring
+ , xK_AE		= XK_AE
+ , xK_Ccedilla		= XK_Ccedilla
+ , xK_Egrave		= XK_Egrave
+ , xK_Eacute		= XK_Eacute
+ , xK_Ecircumflex	= XK_Ecircumflex
+ , xK_Ediaeresis	= XK_Ediaeresis
+ , xK_Igrave		= XK_Igrave
+ , xK_Iacute		= XK_Iacute
+ , xK_Icircumflex	= XK_Icircumflex
+ , xK_Idiaeresis	= XK_Idiaeresis
+ , xK_ETH		= XK_ETH
+ , xK_Eth		= XK_Eth
+ , xK_Ntilde		= XK_Ntilde
+ , xK_Ograve		= XK_Ograve
+ , xK_Oacute		= XK_Oacute
+ , xK_Ocircumflex	= XK_Ocircumflex
+ , xK_Otilde		= XK_Otilde
+ , xK_Odiaeresis	= XK_Odiaeresis
+ , xK_multiply		= XK_multiply
+ , xK_Ooblique		= XK_Ooblique
+ , xK_Ugrave		= XK_Ugrave
+ , xK_Uacute		= XK_Uacute
+ , xK_Ucircumflex	= XK_Ucircumflex
+ , xK_Udiaeresis	= XK_Udiaeresis
+ , xK_Yacute		= XK_Yacute
+ , xK_THORN		= XK_THORN
+ , xK_Thorn		= XK_Thorn
+ , xK_ssharp		= XK_ssharp
+ , xK_agrave		= XK_agrave
+ , xK_aacute		= XK_aacute
+ , xK_acircumflex	= XK_acircumflex
+ , xK_atilde		= XK_atilde
+ , xK_adiaeresis	= XK_adiaeresis
+ , xK_aring		= XK_aring
+ , xK_ae		= XK_ae
+ , xK_ccedilla		= XK_ccedilla
+ , xK_egrave		= XK_egrave
+ , xK_eacute		= XK_eacute
+ , xK_ecircumflex	= XK_ecircumflex
+ , xK_ediaeresis	= XK_ediaeresis
+ , xK_igrave		= XK_igrave
+ , xK_iacute		= XK_iacute
+ , xK_icircumflex	= XK_icircumflex
+ , xK_idiaeresis	= XK_idiaeresis
+ , xK_eth		= XK_eth
+ , xK_ntilde		= XK_ntilde
+ , xK_ograve		= XK_ograve
+ , xK_oacute		= XK_oacute
+ , xK_ocircumflex	= XK_ocircumflex
+ , xK_otilde		= XK_otilde
+ , xK_odiaeresis	= XK_odiaeresis
+ , xK_division		= XK_division
+ , xK_oslash		= XK_oslash
+ , xK_ugrave		= XK_ugrave
+ , xK_uacute		= XK_uacute
+ , xK_ucircumflex	= XK_ucircumflex
+ , xK_udiaeresis	= XK_udiaeresis
+ , xK_yacute		= XK_yacute
+ , xK_thorn		= XK_thorn
+ , xK_ydiaeresis	= XK_ydiaeresis
+ }
+
+type EventMask			= Mask
+#{enum EventMask,
+ , noEventMask			= NoEventMask
+ , keyPressMask			= KeyPressMask
+ , keyReleaseMask		= KeyReleaseMask
+ , buttonPressMask		= ButtonPressMask
+ , buttonReleaseMask		= ButtonReleaseMask
+ , enterWindowMask		= EnterWindowMask
+ , leaveWindowMask		= LeaveWindowMask
+ , pointerMotionMask		= PointerMotionMask
+ , pointerMotionHintMask	= PointerMotionHintMask
+ , button1MotionMask		= Button1MotionMask
+ , button2MotionMask		= Button2MotionMask
+ , button3MotionMask		= Button3MotionMask
+ , button4MotionMask		= Button4MotionMask
+ , button5MotionMask		= Button5MotionMask
+ , buttonMotionMask		= ButtonMotionMask
+ , keymapStateMask		= KeymapStateMask
+ , exposureMask			= ExposureMask
+ , visibilityChangeMask		= VisibilityChangeMask
+ , structureNotifyMask		= StructureNotifyMask
+ , resizeRedirectMask		= ResizeRedirectMask
+ , substructureNotifyMask	= SubstructureNotifyMask
+ , substructureRedirectMask	= SubstructureRedirectMask
+ , focusChangeMask		= FocusChangeMask
+ , propertyChangeMask		= PropertyChangeMask
+ , colormapChangeMask		= ColormapChangeMask
+ , ownerGrabButtonMask		= OwnerGrabButtonMask
+ }
+
+type EventType		= Word32
+#{enum EventType,
+ , keyPress		= KeyPress
+ , keyRelease		= KeyRelease
+ , buttonPress		= ButtonPress
+ , buttonRelease	= ButtonRelease
+ , motionNotify		= MotionNotify
+ , enterNotify		= EnterNotify
+ , leaveNotify		= LeaveNotify
+ , focusIn		= FocusIn
+ , focusOut		= FocusOut
+ , keymapNotify		= KeymapNotify
+ , expose		= Expose
+ , graphicsExpose	= GraphicsExpose
+ , noExpose		= NoExpose
+ , visibilityNotify	= VisibilityNotify
+ , createNotify		= CreateNotify
+ , destroyNotify	= DestroyNotify
+ , unmapNotify		= UnmapNotify
+ , mapNotify		= MapNotify
+ , mapRequest		= MapRequest
+ , reparentNotify	= ReparentNotify
+ , configureNotify	= ConfigureNotify
+ , configureRequest	= ConfigureRequest
+ , gravityNotify	= GravityNotify
+ , resizeRequest	= ResizeRequest
+ , circulateNotify	= CirculateNotify
+ , circulateRequest	= CirculateRequest
+ , propertyNotify	= PropertyNotify
+ , selectionClear	= SelectionClear
+ , selectionRequest	= SelectionRequest
+ , selectionNotify	= SelectionNotify
+ , colormapNotify	= ColormapNotify
+ , clientMessage	= ClientMessage
+ , mappingNotify	= MappingNotify
+ , lASTEvent		= LASTEvent
+ }
+
+type Modifier		= Mask
+#{enum Modifier,
+ , shiftMapIndex	= ShiftMapIndex
+ , lockMapIndex		= LockMapIndex
+ , controlMapIndex	= ControlMapIndex
+ , mod1MapIndex		= Mod1MapIndex
+ , mod2MapIndex		= Mod2MapIndex
+ , mod3MapIndex		= Mod3MapIndex
+ , mod4MapIndex		= Mod4MapIndex
+ , mod5MapIndex		= Mod5MapIndex
+ , anyModifier		= AnyModifier
+ }
+
+type KeyMask		= Modifier
+#{enum KeyMask,
+ , shiftMask		= ShiftMask
+ , lockMask		= LockMask
+ , controlMask		= ControlMask
+ , mod1Mask		= Mod1Mask
+ , mod2Mask		= Mod2Mask
+ , mod3Mask		= Mod3Mask
+ , mod4Mask		= Mod4Mask
+ , mod5Mask		= Mod5Mask
+ }
+
+type ButtonMask		= Modifier
+#{enum ButtonMask,
+ , button1Mask		= Button1Mask
+ , button2Mask		= Button2Mask
+ , button3Mask		= Button3Mask
+ , button4Mask		= Button4Mask
+ , button5Mask		= Button5Mask
+ }
+
+type Button		= Word32
+#{enum Button,
+ , button1		= Button1
+ , button2		= Button2
+ , button3		= Button3
+ , button4		= Button4
+ , button5		= Button5
+ }
+
+type NotifyMode		= Int
+-- NotifyNormal and NotifyHint are used as detail in XMotionEvents
+#{enum NotifyMode,
+ , notifyNormal		= NotifyNormal
+ , notifyGrab		= NotifyGrab
+ , notifyUngrab		= NotifyUngrab
+ , notifyWhileGrabbed	= NotifyWhileGrabbed
+ , notifyHint		= NotifyHint
+ }
+
+type NotifyDetail	= Int
+#{enum NotifyDetail,
+ , notifyAncestor	= NotifyAncestor
+ , notifyVirtual	= NotifyVirtual
+ , notifyInferior	= NotifyInferior
+ , notifyNonlinear	= NotifyNonlinear
+ , notifyNonlinearVirtual = NotifyNonlinearVirtual
+ , notifyPointer	= NotifyPointer
+ , notifyPointerRoot	= NotifyPointerRoot
+ , notifyDetailNone	= NotifyDetailNone
+ }
+
+type Visibility = Int
+#{enum Visibility,
+ , visibilityUnobscured		= VisibilityUnobscured
+ , visibilityPartiallyObscured	= VisibilityPartiallyObscured
+ , visibilityFullyObscured	= VisibilityFullyObscured
+ }
+
+-- | Place of window relative to siblings
+-- (used in Circulation requests or events)
+type Place = Int
+#{enum Place,
+ , placeOnTop		= PlaceOnTop
+ , placeOnBottom	= PlaceOnBottom
+ }
+
+type Protocol		= Int
+#{enum Protocol,
+ , familyInternet	= FamilyInternet
+ , familyDECnet		= FamilyDECnet
+ , familyChaos		= FamilyChaos
+ }
+
+type PropertyNotification = Int
+#{enum PropertyNotification,
+ , propertyNewValue	= PropertyNewValue
+ , propertyDelete	= PropertyDelete
+ }
+
+type ColormapNotification = Int
+#{enum ColormapNotification,
+ , colormapUninstalled	= ColormapUninstalled
+ , colormapInstalled	= ColormapInstalled
+ }
+
+-- Grab{Pointer,Button,Keyboard,Key} Modes
+type GrabMode		= Int
+#{enum GrabMode,
+ , grabModeSync		= GrabModeSync
+ , grabModeAsync	= GrabModeAsync
+ }
+
+-- Grab{Pointer,Keyboard} reply status
+
+type GrabStatus		= Int
+#{enum GrabStatus,
+ , grabSuccess		= GrabSuccess
+ , alreadyGrabbed	= AlreadyGrabbed
+ , grabInvalidTime	= GrabInvalidTime
+ , grabNotViewable	= GrabNotViewable
+ , grabFrozen		= GrabFrozen
+ }
+
+-- AllowEvents modes
+type AllowEvents	= Int
+#{enum AllowEvents,
+ , asyncPointer		= AsyncPointer
+ , syncPointer		= SyncPointer
+ , replayPointer	= ReplayPointer
+ , asyncKeyboard	= AsyncKeyboard
+ , syncKeyboard		= SyncKeyboard
+ , replayKeyboard	= ReplayKeyboard
+ , asyncBoth		= AsyncBoth
+ , syncBoth		= SyncBoth
+ }
+
+-- {Set,Get}InputFocus Modes
+type FocusMode		= Int
+#{enum FocusMode,
+ , revertToNone		= RevertToNone
+ , revertToPointerRoot	= RevertToPointerRoot
+ , revertToParent	= RevertToParent
+ }
+
+-- Error codes
+type ErrorCode		= Int
+#{enum ErrorCode,
+ , success		= Success
+ , badRequest		= BadRequest
+ , badValue		= BadValue
+ , badWindow		= BadWindow
+ , badPixmap		= BadPixmap
+ , badAtom		= BadAtom
+ , badCursor		= BadCursor
+ , badFont		= BadFont
+ , badMatch		= BadMatch
+ , badDrawable		= BadDrawable
+ , badAccess		= BadAccess
+ , badAlloc		= BadAlloc
+ , badColor		= BadColor
+ , badGC		= BadGC
+ , badIDChoice		= BadIDChoice
+ , badName		= BadName
+ , badLength		= BadLength
+ , badImplementation	= BadImplementation
+ , firstExtensionError	= FirstExtensionError
+ , lastExtensionError	= LastExtensionError
+ }
+
+type Status		= Int
+
+-- |Xlib functions with return values of type @Status@ return zero on
+-- failure and nonzero on success.
+throwIfZero :: String -> IO Status -> IO ()
+throwIfZero fn_name = throwIf_ (== 0) (const ("Error in function " ++ fn_name))
+
+type WindowClass	= Int
+#{enum WindowClass,
+ , copyFromParent	= CopyFromParent
+ , inputOutput		= InputOutput
+ , inputOnly		= InputOnly
+ }
+
+-- Window attributes mask
+type AttributeMask	= Mask
+#{enum AttributeMask,
+ , cWBackPixmap		= CWBackPixmap
+ , cWBackPixel		= CWBackPixel
+ , cWBorderPixmap	= CWBorderPixmap
+ , cWBorderPixel	= CWBorderPixel
+ , cWBitGravity		= CWBitGravity
+ , cWWinGravity		= CWWinGravity
+ , cWBackingStore	= CWBackingStore
+ , cWBackingPlanes	= CWBackingPlanes
+ , cWBackingPixel	= CWBackingPixel
+ , cWOverrideRedirect	= CWOverrideRedirect
+ , cWSaveUnder		= CWSaveUnder
+ , cWEventMask		= CWEventMask
+ , cWDontPropagate	= CWDontPropagate
+ , cWColormap		= CWColormap
+ , cWCursor		= CWCursor
+ }
+
+-- Used in ChangeCloseDownMode
+type CloseDownMode	= Int
+#{enum CloseDownMode,
+ , destroyAll		= DestroyAll
+ , retainPermanent	= RetainPermanent
+ , retainTemporary	= RetainTemporary
+ }
+
+----------------------------------------------------------------
+-- CURSOR STUFF
+----------------------------------------------------------------
+
+type QueryBestSizeClass = Int
+#{enum QueryBestSizeClass,
+ , cursorShape		= CursorShape
+ , tileShape		= TileShape
+ , stippleShape		= StippleShape
+ }
+
+----------------------------------------------------------------
+-- GRAPHICS DEFINITIONS
+----------------------------------------------------------------
+
+-- graphics functions, as in GC.alu
+
+type   GXFunction	= Int
+#{enum GXFunction,
+ , gXclear		= GXclear
+ , gXand		= GXand
+ , gXandReverse		= GXandReverse
+ , gXcopy		= GXcopy
+ , gXandInverted	= GXandInverted
+ , gXnoop		= GXnoop
+ , gXxor		= GXxor
+ , gXor			= GXor
+ , gXnor		= GXnor
+ , gXequiv		= GXequiv
+ , gXinvert		= GXinvert
+ , gXorReverse		= GXorReverse
+ , gXcopyInverted	= GXcopyInverted
+ , gXorInverted		= GXorInverted
+ , gXnand		= GXnand
+ , gXset		= GXset
+ }
+
+type   LineStyle	= Int
+#{enum LineStyle,
+ , lineSolid		= LineSolid
+ , lineOnOffDash	= LineOnOffDash
+ , lineDoubleDash	= LineDoubleDash
+ }
+
+type   CapStyle		= Int
+#{enum CapStyle,
+ , capNotLast		= CapNotLast
+ , capButt		= CapButt
+ , capRound		= CapRound
+ , capProjecting	= CapProjecting
+ }
+
+type   JoinStyle	= Int
+#{enum JoinStyle,
+ , joinMiter		= JoinMiter
+ , joinRound		= JoinRound
+ , joinBevel		= JoinBevel
+ }
+
+type   FillStyle	= Int
+#{enum FillStyle,
+ , fillSolid		= FillSolid
+ , fillTiled		= FillTiled
+ , fillStippled		= FillStippled
+ , fillOpaqueStippled	= FillOpaqueStippled
+ }
+
+type   FillRule		= Int
+#{enum FillRule,
+ , evenOddRule		= EvenOddRule
+ , windingRule		= WindingRule
+ }
+
+type   SubWindowMode	= Int
+#{enum SubWindowMode,
+ , clipByChildren	= ClipByChildren
+ , includeInferiors	= IncludeInferiors
+ }
+
+-- -- SetClipRectangles ordering
+-- type   Ordering        = Int
+-- {enum Ordering,
+-- , unsorted		= Unsorted
+-- , ySorted		= YSorted
+-- , yXSorted		= YXSorted
+-- , yXBanded		= YXBanded
+-- }
+
+-- CoordinateMode for drawing routines
+type   CoordinateMode	= Int
+#{enum CoordinateMode,
+ , coordModeOrigin	= CoordModeOrigin
+ , coordModePrevious	= CoordModePrevious
+ }
+
+type   PolygonShape	= Int
+#{enum PolygonShape,
+ , complex		= Complex
+ , nonconvex		= Nonconvex
+ , convex		= Convex
+ }
+
+-- Arc modes for PolyFillArc
+type   ArcMode		= Int
+#{enum ArcMode,
+ , arcChord		= ArcChord
+ , arcPieSlice		= ArcPieSlice
+ }
+
+-- GC components: masks used in CreateGC, CopyGC, ChangeGC, OR'ed into
+-- GC.stateChanges
+
+type   GCMask		= Int
+#{enum GCMask,
+ , gCFunction		= GCFunction
+ , gCPlaneMask		= GCPlaneMask
+ , gCForeground		= GCForeground
+ , gCBackground		= GCBackground
+ , gCLineWidth		= GCLineWidth
+ , gCLineStyle		= GCLineStyle
+ , gCCapStyle		= GCCapStyle
+ , gCJoinStyle		= GCJoinStyle
+ , gCFillStyle		= GCFillStyle
+ , gCFillRule		= GCFillRule
+ , gCTile		= GCTile
+ , gCStipple		= GCStipple
+ , gCTileStipXOrigin	= GCTileStipXOrigin
+ , gCTileStipYOrigin	= GCTileStipYOrigin
+ , gCFont		= GCFont
+ , gCSubwindowMode	= GCSubwindowMode
+ , gCGraphicsExposures	= GCGraphicsExposures
+ , gCClipXOrigin	= GCClipXOrigin
+ , gCClipYOrigin	= GCClipYOrigin
+ , gCClipMask		= GCClipMask
+ , gCDashOffset		= GCDashOffset
+ , gCDashList		= GCDashList
+ , gCArcMode		= GCArcMode
+ , gCLastBit		= GCLastBit
+ }
+
+type   CirculationDirection = Int
+#{enum CirculationDirection,
+ , raiseLowest		= RaiseLowest
+ , lowerHighest		= LowerHighest
+ }
+
+-- used in imageByteOrder and bitmapBitOrder
+type   ByteOrder	= Int
+#{enum ByteOrder,
+ , lSBFirst		= LSBFirst
+ , mSBFirst		= MSBFirst
+ }
+
+type   ColormapAlloc	= Int
+#{enum ColormapAlloc,
+ , allocNone		= AllocNone
+ , allocAll		= AllocAll
+ }
+
+type   MappingRequest   = Int
+#{enum MappingRequest,
+ , mappingModifier	= MappingModifier
+ , mappingKeyboard	= MappingKeyboard
+ , mappingPointer	= MappingPointer
+ }
+
+type   ChangeSaveSetMode = Int
+#{enum ChangeSaveSetMode,
+ , setModeInsert	= SetModeInsert
+ , setModeDelete	= SetModeDelete
+ }
+
+type   BitGravity	= Int
+#{enum BitGravity,
+ , forgetGravity	= ForgetGravity
+ , northWestGravity	= NorthWestGravity
+ , northGravity		= NorthGravity
+ , northEastGravity	= NorthEastGravity
+ , westGravity		= WestGravity
+ , centerGravity	= CenterGravity
+ , eastGravity		= EastGravity
+ , southWestGravity	= SouthWestGravity
+ , southGravity		= SouthGravity
+ , southEastGravity	= SouthEastGravity
+ , staticGravity	= StaticGravity
+ }
+
+-- All the BitGravity's plus ...
+type   WindowGravity   = Int
+#{enum WindowGravity,
+ , unmapGravity		= UnmapGravity
+ }
+
+-- Used in CreateWindow for backing-store hint
+type   BackingStore	= Int
+#{enum BackingStore,
+ , notUseful		= NotUseful
+ , whenMapped		= WhenMapped
+ , always		= Always
+ }
+
+#{enum Word8,
+ , doRed		= DoRed
+ , doGreen		= DoGreen
+ , doBlue		= DoBlue
+ }
+
+type   FontDirection    = Int
+#{enum FontDirection,
+ , fontLeftToRight	= FontLeftToRight
+ , fontRightToLeft	= FontRightToLeft
+ }
diff --git a/Graphics/X11/Xlib.hs b/Graphics/X11/Xlib.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib.hs
@@ -0,0 +1,89 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+-- 
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib.
+--
+-- The library aims to provide a direct translation of the X
+-- binding into Haskell so the most important documentation you
+-- should read is /The Xlib Programming Manual/, available online at
+-- <http://tronche.com/gui/x/xlib/>.  Let me say that again because
+-- it is very important.  Get hold of this documentation and read it:
+-- it tells you almost everything you need to know to use this library.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib 
+	( -- * Conventions
+	  -- $conventions
+
+	  -- * Types
+	  module Graphics.X11.Types,
+          -- module Graphics.X11.Xlib.Types,
+	  Display, Screen, Visual, GC, SetWindowAttributes,
+	  Point(..), Rectangle(..), Arc(..), Segment(..), Color(..),
+	  Pixel, Position, Dimension, Angle, ScreenNumber, Buffer,
+
+	  -- * X11 library functions
+          module Graphics.X11.Xlib.Event,
+          module Graphics.X11.Xlib.Display,
+          module Graphics.X11.Xlib.Screen,
+          module Graphics.X11.Xlib.Window,
+          module Graphics.X11.Xlib.Context,
+          module Graphics.X11.Xlib.Color,
+          module Graphics.X11.Xlib.Font,
+          module Graphics.X11.Xlib.Atom,
+          module Graphics.X11.Xlib.Region,
+          module Graphics.X11.Xlib.Misc,
+          
+	) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+import Graphics.X11.Xlib.Event
+import Graphics.X11.Xlib.Display
+import Graphics.X11.Xlib.Screen
+import Graphics.X11.Xlib.Window
+import Graphics.X11.Xlib.Context
+import Graphics.X11.Xlib.Color
+import Graphics.X11.Xlib.Font
+import Graphics.X11.Xlib.Atom
+import Graphics.X11.Xlib.Region
+import Graphics.X11.Xlib.Misc
+
+{- $conventions
+
+In translating the library, we had to change names to conform with
+Haskell's lexical syntax: function names and names of constants must start
+with a lowercase letter; type names must start with an uppercase letter.
+The case of the remaining letters is unchanged.
+
+In addition, we chose to take advantage of Haskell's module system to
+allow us to drop common prefixes (@X@, @XA_@, etc.) attached to X11
+identifiers.
+
+We named enumeration types so that function types would be easier
+to understand.  For example, we added 'Status', 'WindowClass', etc.
+Note that the types are synonyms for 'Int' so no extra typesafety was
+obtained.
+
+We consistently raise exceptions when a function returns an error code.
+In practice, this only affects the following functions because most Xlib
+functions do not return error codes: 'allocColor', 'allocNamedColor',
+'fetchBuffer', 'fetchBytes', 'fontFromGC', 'getGeometry', 'getIconName',
+'iconifyWindow', 'loadQueryFont', 'lookupColor', 'openDisplay',
+'parseColor', 'queryBestCursor', 'queryBestSize', 'queryBestStipple',
+'queryBestTile', 'rotateBuffers', 'selectInput', 'storeBuffer',
+'storeBytes', 'withdrawWindow'.
+
+-}
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Atom.hsc b/Graphics/X11/Xlib/Atom.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Atom.hsc
@@ -0,0 +1,193 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Atom
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of type declarations for interfacing with X11 Atoms.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Atom(
+        internAtom,
+
+        pRIMARY,
+        sECONDARY,
+        aRC,
+        aTOM,
+        bITMAP,
+        cARDINAL,
+        cOLORMAP,
+        cURSOR,
+        cUT_BUFFER0,
+        cUT_BUFFER1,
+        cUT_BUFFER2,
+        cUT_BUFFER3,
+        cUT_BUFFER4,
+        cUT_BUFFER5,
+        cUT_BUFFER6,
+        cUT_BUFFER7,
+        dRAWABLE,
+        fONT,
+        iNTEGER,
+        pIXMAP,
+        pOINT,
+        rECTANGLE,
+        rESOURCE_MANAGER,
+        rGB_COLOR_MAP,
+        rGB_BEST_MAP,
+        rGB_BLUE_MAP,
+        rGB_DEFAULT_MAP,
+        rGB_GRAY_MAP,
+        rGB_GREEN_MAP,
+        rGB_RED_MAP,
+        sTRING,
+        vISUALID,
+        wINDOW,
+        wM_COMMAND,
+        wM_HINTS,
+        wM_CLIENT_MACHINE,
+        wM_ICON_NAME,
+        wM_ICON_SIZE,
+        wM_NAME,
+        wM_NORMAL_HINTS,
+        wM_SIZE_HINTS,
+        wM_ZOOM_HINTS,
+        mIN_SPACE,
+        nORM_SPACE,
+        mAX_SPACE,
+        eND_SPACE,
+        sUPERSCRIPT_X,
+        sUPERSCRIPT_Y,
+        sUBSCRIPT_X,
+        sUBSCRIPT_Y,
+        uNDERLINE_POSITION,
+        uNDERLINE_THICKNESS,
+        sTRIKEOUT_ASCENT,
+        sTRIKEOUT_DESCENT,
+        iTALIC_ANGLE,
+        x_HEIGHT,
+        qUAD_WIDTH,
+        wEIGHT,
+        pOINT_SIZE,
+        rESOLUTION,
+        cOPYRIGHT,
+        nOTICE,
+        fONT_NAME,
+        fAMILY_NAME,
+        fULL_NAME,
+        cAP_HEIGHT,
+        wM_CLASS,
+        wM_TRANSIENT_FOR,
+        lAST_PREDEFINED,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+
+import Foreign.C.String
+
+#include "HsXlib.h"
+
+----------------------------------------------------------------
+-- Atoms
+----------------------------------------------------------------
+
+-- AC, 1/9/2000: Added definition for XInternAtom
+
+-- | interface to the X11 library function @XInternAtom()@.
+internAtom :: Display -> String -> Bool -> IO Atom
+internAtom display atom_name only_if_exists =
+	withCString atom_name $ \ c_atom_name ->
+	xInternAtom display c_atom_name only_if_exists
+foreign import ccall unsafe "XInternAtom"
+	xInternAtom :: Display -> CString -> Bool -> IO Atom
+
+-- XInternAtoms omitted
+-- XGetAtomName omitted
+-- XGetAtomNames omitted
+-- XConvertSelection omitted
+-- XListProperties omitted
+-- XChangeProperty omitted
+-- XDeleteProperty omitted
+
+#{enum Atom,
+ , pRIMARY 		= XA_PRIMARY
+ , sECONDARY 		= XA_SECONDARY
+ , aRC 			= XA_ARC
+ , aTOM 		= XA_ATOM
+ , bITMAP 		= XA_BITMAP
+ , cARDINAL 		= XA_CARDINAL
+ , cOLORMAP 		= XA_COLORMAP
+ , cURSOR 		= XA_CURSOR
+ , cUT_BUFFER0 		= XA_CUT_BUFFER0
+ , cUT_BUFFER1 		= XA_CUT_BUFFER1
+ , cUT_BUFFER2 		= XA_CUT_BUFFER2
+ , cUT_BUFFER3 		= XA_CUT_BUFFER3
+ , cUT_BUFFER4 		= XA_CUT_BUFFER4
+ , cUT_BUFFER5 		= XA_CUT_BUFFER5
+ , cUT_BUFFER6 		= XA_CUT_BUFFER6
+ , cUT_BUFFER7 		= XA_CUT_BUFFER7
+ , dRAWABLE 		= XA_DRAWABLE
+ , fONT 		= XA_FONT
+ , iNTEGER 		= XA_INTEGER
+ , pIXMAP 		= XA_PIXMAP
+ , pOINT 		= XA_POINT
+ , rECTANGLE 		= XA_RECTANGLE
+ , rESOURCE_MANAGER 	= XA_RESOURCE_MANAGER
+ , rGB_COLOR_MAP 	= XA_RGB_COLOR_MAP
+ , rGB_BEST_MAP 	= XA_RGB_BEST_MAP
+ , rGB_BLUE_MAP 	= XA_RGB_BLUE_MAP
+ , rGB_DEFAULT_MAP 	= XA_RGB_DEFAULT_MAP
+ , rGB_GRAY_MAP 	= XA_RGB_GRAY_MAP
+ , rGB_GREEN_MAP 	= XA_RGB_GREEN_MAP
+ , rGB_RED_MAP 		= XA_RGB_RED_MAP
+ , sTRING 		= XA_STRING
+ , vISUALID 		= XA_VISUALID
+ , wINDOW 		= XA_WINDOW
+ , wM_COMMAND 		= XA_WM_COMMAND
+ , wM_HINTS 		= XA_WM_HINTS
+ , wM_CLIENT_MACHINE 	= XA_WM_CLIENT_MACHINE
+ , wM_ICON_NAME 	= XA_WM_ICON_NAME
+ , wM_ICON_SIZE 	= XA_WM_ICON_SIZE
+ , wM_NAME 		= XA_WM_NAME
+ , wM_NORMAL_HINTS 	= XA_WM_NORMAL_HINTS
+ , wM_SIZE_HINTS 	= XA_WM_SIZE_HINTS
+ , wM_ZOOM_HINTS 	= XA_WM_ZOOM_HINTS
+ , mIN_SPACE 		= XA_MIN_SPACE
+ , nORM_SPACE 		= XA_NORM_SPACE
+ , mAX_SPACE 		= XA_MAX_SPACE
+ , eND_SPACE 		= XA_END_SPACE
+ , sUPERSCRIPT_X 	= XA_SUPERSCRIPT_X
+ , sUPERSCRIPT_Y 	= XA_SUPERSCRIPT_Y
+ , sUBSCRIPT_X 		= XA_SUBSCRIPT_X
+ , sUBSCRIPT_Y 		= XA_SUBSCRIPT_Y
+ , uNDERLINE_POSITION 	= XA_UNDERLINE_POSITION
+ , uNDERLINE_THICKNESS 	= XA_UNDERLINE_THICKNESS
+ , sTRIKEOUT_ASCENT 	= XA_STRIKEOUT_ASCENT
+ , sTRIKEOUT_DESCENT 	= XA_STRIKEOUT_DESCENT
+ , iTALIC_ANGLE 	= XA_ITALIC_ANGLE
+ , x_HEIGHT 		= XA_X_HEIGHT
+ , qUAD_WIDTH 		= XA_QUAD_WIDTH
+ , wEIGHT 		= XA_WEIGHT
+ , pOINT_SIZE 		= XA_POINT_SIZE
+ , rESOLUTION 		= XA_RESOLUTION
+ , cOPYRIGHT 		= XA_COPYRIGHT
+ , nOTICE 		= XA_NOTICE
+ , fONT_NAME 		= XA_FONT_NAME
+ , fAMILY_NAME 		= XA_FAMILY_NAME
+ , fULL_NAME 		= XA_FULL_NAME
+ , cAP_HEIGHT 		= XA_CAP_HEIGHT
+ , wM_CLASS 		= XA_WM_CLASS
+ , wM_TRANSIENT_FOR 	= XA_WM_TRANSIENT_FOR
+ , lAST_PREDEFINED 	= XA_LAST_PREDEFINED
+ }
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Color.hs b/Graphics/X11/Xlib/Color.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Color.hs
@@ -0,0 +1,162 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Color
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib Colors.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Color(
+
+        lookupColor,
+        allocNamedColor,
+        allocColor,
+        parseColor,
+        freeColors,
+        storeColor,
+        queryColor,
+        queryColors,
+        installColormap,
+        uninstallColormap,
+        copyColormapAndFree,
+        createColormap,
+        freeColormap,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+
+import Foreign
+import Foreign.C
+
+----------------------------------------------------------------
+-- Color and Colormaps
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XLookupColor()@.
+lookupColor :: Display -> Colormap -> String -> IO (Color, Color)
+lookupColor display colormap color_name =
+	withCString color_name $ \c_color_name ->
+	alloca $ \ exact_def_return ->
+	alloca $ \ screen_def_return -> do
+	throwIfZero "lookupColor" $
+		xLookupColor display colormap c_color_name
+			exact_def_return screen_def_return
+	exact_def <- peek exact_def_return
+	screen_def <- peek screen_def_return
+	return (exact_def, screen_def)
+foreign import ccall unsafe "HsXlib.h XLookupColor"
+	xLookupColor :: Display -> Colormap -> CString ->
+		Ptr Color -> Ptr Color -> IO Status
+
+-- | interface to the X11 library function @XAllocNamedColor()@.
+allocNamedColor :: Display -> Colormap -> String -> IO (Color, Color)
+allocNamedColor display colormap color_name =
+	withCString color_name $ \c_color_name ->
+	alloca $ \ exact_def_return ->
+	alloca $ \ screen_def_return -> do
+	throwIfZero "allocNamedColor" $
+		xAllocNamedColor display colormap c_color_name
+			exact_def_return screen_def_return
+	exact_def <- peek exact_def_return
+	screen_def <- peek screen_def_return
+	return (exact_def, screen_def)
+foreign import ccall unsafe "HsXlib.h XAllocNamedColor"
+	xAllocNamedColor :: Display -> Colormap -> CString ->
+		Ptr Color -> Ptr Color -> IO Status
+
+-- | interface to the X11 library function @XAllocColor()@.
+allocColor :: Display -> Colormap -> Color -> IO Color
+allocColor display colormap color =
+	with color $ \ color_ptr -> do
+	throwIfZero "allocColor" $
+		xAllocColor display colormap color_ptr
+	peek color_ptr
+foreign import ccall unsafe "HsXlib.h XAllocColor"
+	xAllocColor :: Display -> Colormap -> Ptr Color -> IO Status
+
+-- | interface to the X11 library function @XParseColor()@.
+parseColor :: Display -> Colormap -> String -> IO Color
+parseColor display colormap color_spec =
+	withCString color_spec $ \ spec ->
+	alloca $ \ exact_def_return -> do
+	throwIfZero "parseColor" $
+		xParseColor display colormap spec exact_def_return
+	peek exact_def_return
+foreign import ccall unsafe "HsXlib.h XParseColor"
+	xParseColor :: Display -> Colormap -> CString -> Ptr Color -> IO Status
+
+-- ToDo: Can't express relationship between arg4 and res1 properly (or arg5, res2)
+-- %errfun Zero XAllocColorCells :: Display -> Colormap -> Bool -> Int -> Int -> IO (ListPixel, ListPixel) using err = XAllocColorCells(arg1,arg2,arg3,arg4_size,res1,arg5_size,res2)
+
+-- ToDo: Can't express relationship between arg4 and res1 properly
+-- %errfun Zero XAllocColorPlanes :: Display -> Colormap -> Bool -> Int -> Int -> Int -> Int IO (ListPixel, Pixel, Pixel, Pixel) using err = XAllocColorPlanes(...)
+
+-- | interface to the X11 library function @XFreeColors()@.
+freeColors :: Display -> Colormap -> [Pixel] -> Pixel -> IO ()
+freeColors display colormap pixels planes =
+	withArray pixels $ \ pixel_array ->
+	xFreeColors display colormap pixel_array (length pixels) planes
+foreign import ccall unsafe "HsXlib.h XFreeColors"
+	xFreeColors :: Display -> Colormap -> Ptr Pixel -> Int -> Pixel -> IO ()
+
+-- | interface to the X11 library function @XStoreColor()@.
+storeColor :: Display -> Colormap -> Color -> IO ()
+storeColor display colormap color =
+	with color $ \ color_ptr ->
+	xStoreColor display colormap color_ptr
+foreign import ccall unsafe "HsXlib.h XStoreColor"
+	xStoreColor  :: Display -> Colormap -> Ptr Color -> IO ()
+
+-- %fun XStoreColors :: Display -> Colormap -> ListColor -> IO ()
+-- %code XStoreColors(arg1,arg2,arg3,arg3_size)
+-- %fun XStoreNamedColor :: Display -> Colormap -> String -> Pixel -> PrimaryMask -> IO ()
+
+-- | interface to the X11 library function @XQueryColor()@.
+queryColor :: Display -> Colormap -> Color -> IO Color
+queryColor display colormap color =
+	with color $ \ color_ptr -> do
+	xQueryColor display colormap color_ptr
+	peek color_ptr
+foreign import ccall unsafe "HsXlib.h XQueryColor"
+	xQueryColor  :: Display -> Colormap -> Ptr Color -> IO ()
+
+-- | interface to the X11 library function @XQueryColors()@.
+queryColors :: Display -> Colormap -> [Color] -> IO [Color]
+queryColors display colormap colors =
+	withArrayLen colors $ \ ncolors color_array -> do
+	xQueryColors display colormap color_array ncolors
+	peekArray ncolors color_array
+foreign import ccall unsafe "HsXlib.h XQueryColors"
+	xQueryColors :: Display -> Colormap -> Ptr Color -> Int -> IO ()
+
+-- | interface to the X11 library function @XInstallColormap()@.
+foreign import ccall unsafe "HsXlib.h XInstallColormap"
+	installColormap     :: Display -> Colormap -> IO ()
+
+-- | interface to the X11 library function @XUninstallColormap()@.
+foreign import ccall unsafe "HsXlib.h XUninstallColormap"
+	uninstallColormap   :: Display -> Colormap -> IO ()
+
+-- | interface to the X11 library function @XCopyColormapAndFree()@.
+foreign import ccall unsafe "HsXlib.h XCopyColormapAndFree"
+	copyColormapAndFree :: Display -> Colormap -> IO Colormap
+
+-- | interface to the X11 library function @XCreateColormap()@.
+foreign import ccall unsafe "HsXlib.h XCreateColormap"
+	createColormap      :: Display -> Window   -> Visual -> ColormapAlloc -> IO Colormap
+
+-- | interface to the X11 library function @XFreeColormap()@.
+foreign import ccall unsafe "HsXlib.h XFreeColormap"
+	freeColormap        :: Display -> Colormap -> IO ()
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Context.hs b/Graphics/X11/Xlib/Context.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Context.hs
@@ -0,0 +1,238 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Context
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib Graphics
+-- Contexts.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Context(
+
+        setArcMode,
+        setBackground,
+        setForeground,
+        setFunction,
+        setGraphicsExposures,
+        setClipMask,
+        setClipOrigin,
+        setDashes,
+        setFillRule,
+        setFillStyle,
+        setFont,
+        setLineAttributes,
+        setPlaneMask,
+        setState,
+        setStipple,
+        setSubwindowMode,
+        setTSOrigin,
+        setTile,
+        createGC,
+        gContextFromGC,
+        freeGC,
+        flushGC,
+        copyGC,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+
+import Foreign
+import Foreign.C
+
+----------------------------------------------------------------
+-- Graphics contexts
+----------------------------------------------------------------
+
+-- Convenience functions
+
+-- | interface to the X11 library function @XSetArcMode()@.
+foreign import ccall unsafe "HsXlib.h XSetArcMode"
+	setArcMode     	     :: Display -> GC -> ArcMode               -> IO ()
+
+-- | interface to the X11 library function @XSetBackground()@.
+foreign import ccall unsafe "HsXlib.h XSetBackground"
+	setBackground  	     :: Display -> GC -> Pixel                 -> IO ()
+
+-- | interface to the X11 library function @XSetForeground()@.
+foreign import ccall unsafe "HsXlib.h XSetForeground"
+	setForeground 	     :: Display -> GC -> Pixel                 -> IO ()
+
+-- | interface to the X11 library function @XSetFunction()@.
+foreign import ccall unsafe "HsXlib.h XSetFunction"
+	setFunction	     :: Display -> GC -> GXFunction            -> IO ()
+
+-- | interface to the X11 library function @XSetGraphicsExposures()@.
+foreign import ccall unsafe "HsXlib.h XSetGraphicsExposures"
+	setGraphicsExposures :: Display -> GC -> Bool                  -> IO ()
+
+-- | interface to the X11 library function @XSetClipMask()@.
+foreign import ccall unsafe "HsXlib.h XSetClipMask"
+	setClipMask          :: Display -> GC -> Pixmap                -> IO ()
+
+-- | interface to the X11 library function @XSetClipOrigin()@.
+foreign import ccall unsafe "HsXlib.h XSetClipOrigin"
+	setClipOrigin        :: Display -> GC -> Position -> Position  -> IO ()
+
+-- XSetClipRectangles omitted because it's not clear when it's safe to delete the
+-- array of rectangles
+
+-- | interface to the X11 library function @XSetDashes()@.
+setDashes            :: Display -> GC -> Int -> String -> Int  -> IO ()
+setDashes display gc dash_offset dashes n =
+	withCString dashes $ \ dash_list ->
+	xSetDashes display gc dash_offset dash_list n
+foreign import ccall unsafe "HsXlib.h XSetDashes"
+	xSetDashes           :: Display -> GC -> Int -> CString -> Int -> IO ()
+
+-- | interface to the X11 library function @XSetFillRule()@.
+foreign import ccall unsafe "HsXlib.h XSetFillRule"
+	setFillRule          :: Display -> GC -> FillRule              -> IO ()
+
+-- | interface to the X11 library function @XSetFillStyle()@.
+foreign import ccall unsafe "HsXlib.h XSetFillStyle"
+	setFillStyle         :: Display -> GC -> FillStyle             -> IO ()
+
+-- | interface to the X11 library function @XSetFont()@.
+foreign import ccall unsafe "HsXlib.h XSetFont"
+	setFont              :: Display -> GC -> Font                  -> IO ()
+
+-- | interface to the X11 library function @XSetLineAttributes()@.
+foreign import ccall unsafe "HsXlib.h XSetLineAttributes"
+	setLineAttributes    :: Display -> GC -> Int -> LineStyle ->
+					CapStyle -> JoinStyle -> IO ()
+
+-- | interface to the X11 library function @XSetPlaneMask()@.
+foreign import ccall unsafe "HsXlib.h XSetPlaneMask"
+	setPlaneMask         :: Display -> GC -> Pixel                 -> IO ()
+
+-- | interface to the X11 library function @XSetState()@.
+foreign import ccall unsafe "HsXlib.h XSetState"
+	setState             :: Display -> GC -> Pixel -> Pixel ->
+					GXFunction -> Pixel            -> IO ()
+
+-- | interface to the X11 library function @XSetStipple()@.
+foreign import ccall unsafe "HsXlib.h XSetStipple"
+	setStipple           :: Display -> GC -> Pixmap                -> IO ()
+
+-- | interface to the X11 library function @XSetSubwindowMode()@.
+foreign import ccall unsafe "HsXlib.h XSetSubwindowMode"
+	setSubwindowMode     :: Display -> GC -> SubWindowMode         -> IO ()
+
+-- | interface to the X11 library function @XSetTSOrigin()@.
+foreign import ccall unsafe "HsXlib.h XSetTSOrigin"
+	setTSOrigin          :: Display -> GC -> Position -> Position  -> IO ()
+
+-- | interface to the X11 library function @XSetTile()@.
+foreign import ccall unsafe "HsXlib.h XSetTile"
+	setTile              :: Display -> GC -> Pixmap                -> IO ()
+
+-- ToDo: create a real interface to this
+-- | partial interface to the X11 library function @XCreateGC()@.
+createGC :: Display -> Drawable -> IO GC
+createGC display d = xCreateGC display d 0 nullPtr
+foreign import ccall unsafe "HsXlib.h XCreateGC"
+	xCreateGC  :: Display -> Drawable -> ValueMask -> Ptr GCValues -> IO GC
+
+type ValueMask = Word32
+
+-- OLD:
+-- %synonym : GCValueSet : Ptr
+--   in rtsDummy
+--
+-- {%
+-- typedef unsigned long GCMask; /* cf XtGCMask */
+-- typedef struct _gcvalues {
+--     GCMask	mask;
+--     XGCValues	values;
+-- }* GCValueSet;
+-- %}
+--
+-- IMPURE GCValueSet	emptyGCValueSet()
+-- RESULT: (RETVAL = (GCValueSet) malloc(sizeof(struct _gcvalues))) ? RETVAL->mask = 0, RETVAL : RETVAL;
+-- POST: RETVAL != NULL
+--
+-- IMPURE void	setGCForeground(colour, set)
+-- IN Pixel	colour
+-- IN GCValueSet	set
+-- RESULT: set->mask |= GCForeground; set->values.foreground = colour
+--
+-- IMPURE void	setGCBackground(colour, set)
+-- IN Pixel	colour
+-- IN GCValueSet	set
+-- RESULT: set->mask |= GCBackground; set->values.background = colour
+--
+-- IMPURE void	freeGCValueSet(set)
+-- IN GCValueSet	set
+-- RESULT: free(set)
+--
+-- IMPURE GC	XCreateGC(display, d, set->mask, &(set->values))
+-- NAME: xCreateGC
+-- IN Display*	display
+-- IN Drawable	d
+-- IN GCValueSet	set
+--
+-- IMPURE void	XChangeGC(display, gc, set->mask, &(set->values))
+-- NAME: xChangeGC
+-- IN Display*	display
+-- IN GC		gc
+-- IN GCValueSet	set
+--
+-- STARTH
+-- -- Code that packages GCValueSets up in a clean monoidic way.
+--
+-- data GCSetter = GCSetter (GCValueSet -> IO ()) -- should be newtype
+--
+-- createGC :: Display -> Drawable -> GCSetter -> IO GC
+-- createGC display d (GCSetter setter) =
+--   emptyGCValueSet        >>= \ set ->
+--   setter set             >>
+--   xCreateGC display d set >>= \ gc ->
+--   freeGCValueSet set     >>
+--   return gc
+--
+-- changeGC :: Display -> Drawable -> GC -> GCSetter -> IO ()
+-- changeGC display d gc (GCSetter setter) =
+--   emptyGCValueSet        >>= \ set ->
+--   setter set             >>
+--   xChangeGC display d set >>= \ gc ->
+--   freeGCValueSet set
+--
+-- instance Monoid GCSetter where
+--   (GCSetter m) >>> (GCSetter k)
+--     = GCSetter (\ settings -> m settings >> k settings)
+--   unit = GCSetter (\ _ -> return ())
+--
+-- set_Background :: Pixel -> GCSetter
+-- set_Background c = GCSetter (setGCBackground c)
+--
+-- set_Foreground :: Pixel -> GCSetter
+-- set_Foreground c = GCSetter (setGCForeground c)
+-- ENDH
+
+-- | interface to the X11 library function @XGContextFromGC()@.
+foreign import ccall unsafe "HsXlib.h XGContextFromGC"
+	gContextFromGC :: GC -> GContext
+
+-- | interface to the X11 library function @XFreeGC()@.
+foreign import ccall unsafe "HsXlib.h XFreeGC"
+	freeGC  :: Display -> GC -> IO ()
+
+-- | interface to the X11 library function @XFlushGC()@.
+foreign import ccall unsafe "HsXlib.h XFlushGC"
+	flushGC :: Display -> GC -> IO ()
+
+-- | interface to the X11 library function @XCopyGC()@.
+foreign import ccall unsafe "HsXlib.h XCopyGC"
+	copyGC  :: Display -> GC -> Mask -> GC -> IO ()
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Display.hs b/Graphics/X11/Xlib/Display.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Display.hs
@@ -0,0 +1,231 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Display
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib Displays.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Display(
+
+        allPlanes_aux,
+        blackPixel,
+        whitePixel,
+        connectionNumber,
+        defaultColormap,
+        defaultGC,
+        defaultDepth,
+        defaultScreen,
+        defaultScreenOfDisplay,
+        displayHeight,
+        displayHeightMM,
+        displayWidth,
+        displayWidthMM,
+        maxRequestSize,
+        displayMotionBufferSize,
+        resourceManagerString,
+        screenResourceString,
+        displayString,
+        imageByteOrder,
+        protocolRevision,
+        protocolVersion,
+        serverVendor,
+        screenCount,
+        defaultVisual,
+        displayCells,
+        displayPlanes,
+        screenOfDisplay,
+        defaultRootWindow,
+        rootWindow,
+        qLength,
+        noOp,
+        openDisplay,
+        closeDisplay,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+
+import Foreign
+import Foreign.C
+
+----------------------------------------------------------------
+-- Display
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XAllPlanes()@.
+foreign import ccall unsafe "HsXlib.h XAllPlanes"
+	allPlanes_aux           :: Pixel
+
+-- | interface to the X11 library function @XBlackPixel()@.
+foreign import ccall unsafe "HsXlib.h XBlackPixel"
+	blackPixel              :: Display -> ScreenNumber -> Pixel
+
+-- | interface to the X11 library function @XWhitePixel()@.
+foreign import ccall unsafe "HsXlib.h XWhitePixel"
+	whitePixel              :: Display -> ScreenNumber -> Pixel
+
+-- This may vary from one execution to another but I believe it
+-- is constant during any given execution and so it can be made PURE
+-- without breaking referential transparency.
+--
+-- Note: underneath the opaque name, it turns out that this
+-- is the file descriptor.  You need to know this if you want to
+-- use select.
+
+-- | interface to the X11 library function @XConnectionNumber()@.
+foreign import ccall unsafe "HsXlib.h XConnectionNumber"
+	connectionNumber        :: Display -> Int
+
+-- | interface to the X11 library function @XDefaultColormap()@.
+foreign import ccall unsafe "HsXlib.h XDefaultColormap"
+	defaultColormap         :: Display -> ScreenNumber -> Colormap
+
+-- XListDepths :: Display -> ScreenNumber -> ListInt using res1 = XListDepths(arg1,arg2,&res1_size)
+
+-- | interface to the X11 library function @XDefaultGC()@.
+foreign import ccall unsafe "HsXlib.h XDefaultGC"
+	defaultGC               :: Display -> ScreenNumber -> GC
+
+-- | interface to the X11 library function @XDefaultDepth()@.
+foreign import ccall unsafe "HsXlib.h XDefaultDepth"
+	defaultDepth            :: Display -> ScreenNumber -> Int
+
+-- | interface to the X11 library function @XDefaultScreen()@.
+foreign import ccall unsafe "HsXlib.h XDefaultScreen"
+	defaultScreen           :: Display -> ScreenNumber
+
+-- | interface to the X11 library function @XDefaultScreenOfDisplay()@.
+foreign import ccall unsafe "HsXlib.h XDefaultScreenOfDisplay"
+	defaultScreenOfDisplay  :: Display -> Screen
+
+-- | interface to the X11 library function @XDisplayHeight()@.
+foreign import ccall unsafe "HsXlib.h XDisplayHeight"
+	displayHeight           :: Display -> ScreenNumber -> Int
+
+-- | interface to the X11 library function @XDisplayHeightMM()@.
+foreign import ccall unsafe "HsXlib.h XDisplayHeightMM"
+	displayHeightMM         :: Display -> ScreenNumber -> Int
+
+-- | interface to the X11 library function @XDisplayWidth()@.
+foreign import ccall unsafe "HsXlib.h XDisplayWidth"
+	displayWidth            :: Display -> ScreenNumber -> Int
+
+-- | interface to the X11 library function @XDisplayWidthMM()@.
+foreign import ccall unsafe "HsXlib.h XDisplayWidthMM"
+	displayWidthMM          :: Display -> ScreenNumber -> Int
+
+-- | interface to the X11 library function @XMaxRequestSize()@.
+foreign import ccall unsafe "HsXlib.h XMaxRequestSize"
+	maxRequestSize          :: Display -> Int
+
+-- | interface to the X11 library function @XDisplayMotionBufferSize()@.
+foreign import ccall unsafe "HsXlib.h XDisplayMotionBufferSize"
+	displayMotionBufferSize :: Display -> Int
+--Disnae exist in X11R5 	XExtendedMaxRequestSize :: Display -> Int
+
+-- | interface to the X11 library function @XResourceManagerString()@.
+resourceManagerString   :: Display -> String
+resourceManagerString display = xlibCString (xResourceManagerString display)
+foreign import ccall unsafe "HsXlib.h XResourceManagerString"
+	xResourceManagerString  :: Display -> IO CString
+
+-- | interface to the X11 library function @XScreenResourceString()@.
+screenResourceString    :: Screen   -> String
+screenResourceString screen = xlibCString (xScreenResourceString screen)
+foreign import ccall unsafe "HsXlib.h XScreenResourceString"
+	xScreenResourceString   :: Screen   -> IO CString
+
+-- | interface to the X11 library function @XDisplayString()@.
+displayString           :: Display -> String
+displayString display = xlibCString (xDisplayString display)
+foreign import ccall unsafe "HsXlib.h XDisplayString"
+	xDisplayString          :: Display -> IO CString
+
+-- | interface to the X11 library function @XImageByteOrder()@.
+foreign import ccall unsafe "HsXlib.h XImageByteOrder"
+	imageByteOrder          :: Display -> Int
+
+-- | interface to the X11 library function @XProtocolRevision()@.
+foreign import ccall unsafe "HsXlib.h XProtocolRevision"
+	protocolRevision        :: Display -> Int
+
+-- | interface to the X11 library function @XProtocolVersion()@.
+foreign import ccall unsafe "HsXlib.h XProtocolVersion"
+	protocolVersion         :: Display -> Int
+
+-- | interface to the X11 library function @XServerVendor()@.
+serverVendor            :: Display -> String
+serverVendor display = xlibCString (xServerVendor display)
+foreign import ccall unsafe "HsXlib.h XServerVendor"
+	xServerVendor           :: Display -> IO CString
+
+--Disnae exist: 	XServerRelease          :: Display -> Int
+
+-- | interface to the X11 library function @XScreenCount()@.
+foreign import ccall unsafe "HsXlib.h XScreenCount"
+	screenCount             :: Display -> Int
+
+-- | interface to the X11 library function @XDefaultVisual()@.
+foreign import ccall unsafe "HsXlib.h XDefaultVisual"
+	defaultVisual           :: Display -> ScreenNumber -> Visual
+
+-- | interface to the X11 library function @XDisplayCells()@.
+foreign import ccall unsafe "HsXlib.h XDisplayCells"
+	displayCells            :: Display -> ScreenNumber -> Int
+
+-- | interface to the X11 library function @XDisplayPlanes()@.
+foreign import ccall unsafe "HsXlib.h XDisplayPlanes"
+	displayPlanes           :: Display -> ScreenNumber -> Int
+
+-- | interface to the X11 library function @XScreenOfDisplay()@.
+foreign import ccall unsafe "HsXlib.h XScreenOfDisplay"
+	screenOfDisplay         :: Display -> ScreenNumber -> Screen
+
+-- | interface to the X11 library function @XDefaultRootWindow()@.
+foreign import ccall unsafe "HsXlib.h XDefaultRootWindow"
+	defaultRootWindow       :: Display -> Window
+
+-- The following are believed to be order dependent
+
+-- | interface to the X11 library function @XRootWindow()@.
+foreign import ccall unsafe "HsXlib.h XRootWindow"
+	rootWindow    	        :: Display -> ScreenNumber -> IO Window
+
+-- | interface to the X11 library function @XQLength()@.
+foreign import ccall unsafe "HsXlib.h XQLength"
+	qLength       	        :: Display -> IO Int
+
+-- | interface to the X11 library function @XNoOp()@.
+foreign import ccall unsafe "HsXlib.h XNoOp"
+	noOp          	        :: Display -> IO ()
+
+-- | interface to the X11 library function @XOpenDisplay()@.
+openDisplay :: String -> IO Display
+openDisplay name =
+	withCString name $ \ c_name -> do
+	display <- throwIfNull "openDisplay" (xOpenDisplay c_name)
+	return (Display display)
+foreign import ccall unsafe "HsXlib.h XOpenDisplay"
+	xOpenDisplay :: CString -> IO (Ptr Display)
+
+-- | interface to the X11 library function @XCloseDisplay()@.
+foreign import ccall unsafe "HsXlib.h XCloseDisplay"
+	closeDisplay            :: Display -> IO ()
+
+-- | convert a CString owned by Xlib to a Haskell String
+xlibCString :: IO CString -> String
+xlibCString act = unsafePerformIO $ do
+	cs <- act
+	peekCString cs
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Event.hsc b/Graphics/X11/Xlib/Event.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Event.hsc
@@ -0,0 +1,546 @@
+{-# OPTIONS_GHC -fglasgow-exts #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Event
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib Events.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Event(
+        QueuedMode,
+        queuedAlready,
+        queuedAfterFlush,
+        queuedAfterReading,
+        XEvent,
+        XEventPtr,
+        allocaXEvent,
+        get_EventType,
+        get_Window,
+        XKeyEvent,
+        XKeyEventPtr,
+        asKeyEvent,
+        XButtonEvent,
+        get_KeyEvent,
+        get_ButtonEvent,
+        get_MotionEvent,
+        XMotionEvent,
+        XExposeEvent,
+        get_ExposeEvent,
+        XMappingEvent,
+        XConfigureEvent,
+        get_ConfigureEvent,
+        waitForEvent,
+        gettimeofday_in_milliseconds,
+        -- gettimeofday_in_milliseconds_internal,
+        flush,
+        sync,
+        pending,
+        eventsQueued,
+        nextEvent,
+        allowEvents,
+        selectInput,
+        sendEvent,
+        windowEvent,
+        checkWindowEvent,
+        maskEvent,
+        checkMaskEvent,
+        checkTypedEvent,
+        checkTypedWindowEvent,
+        putBackEvent,
+        peekEvent,
+        refreshKeyboardMapping,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+import Graphics.X11.Xlib.Display( connectionNumber )
+
+import Foreign
+
+#if __GLASGOW_HASKELL__
+import Data.Generics
+#endif
+
+#include "HsXlib.h"
+
+{-# CFILES cbits/fdset.c #-}
+
+----------------------------------------------------------------
+-- Events
+----------------------------------------------------------------
+
+type   QueuedMode   = Int
+#{enum QueuedMode,
+ , queuedAlready	= QueuedAlready
+ , queuedAfterFlush	= QueuedAfterFlush
+ , queuedAfterReading	= QueuedAfterReading
+ }
+
+-- Because of the way the corresponding C types are defined,
+-- These "structs" are somewhat unusual - they omit fields which can
+-- be found in more general structs.
+-- For example, XAnyEvent omits type since it is in XEvent.
+-- Therefore, to get the complete contents of an event one typically
+-- writes:
+--   do
+--     ty <- get_XEvent e
+--     (serial,send_event,display,window) <- get_XAnyEvent
+--     window' <- get_XDestroyWindowEvent
+
+newtype XEvent = XEvent XEventPtr
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+type XEventPtr = Ptr XEvent
+
+allocaXEvent :: (XEventPtr -> IO a) -> IO a
+allocaXEvent = allocaBytes #{size XEvent}
+
+get_EventType :: XEventPtr -> IO EventType
+get_EventType = #{peek XEvent,type}
+
+get_Window :: XEventPtr -> IO Window
+get_Window = #{peek XAnyEvent,window}
+
+-- %struct : XAnyEvent : XAnyEvent arg1
+--   Int32     : serial            # # of last request processed by server
+--   Bool      : send_event        # true if this came from a SendEvent request
+--   Display   : display           # Display the event was read from
+--   Window    : window            # window on which event was requested in event mask
+
+type XKeyEvent =
+	( Window    -- root window that the event occured on
+	, Window    -- child window
+	, Time      -- milliseconds
+	, Int       -- pointer x, y coordinates in event window
+	, Int       --
+	, Int       -- coordinates relative to root
+	, Int       --
+	, Modifier  -- key or button mask
+	, KeyCode   -- detail
+	, Bool      -- same screen flag
+	)
+
+peekXKeyEvent :: Ptr XKeyEvent -> IO XKeyEvent
+peekXKeyEvent p = do
+	root		<- #{peek XKeyEvent,root} p
+	subwindow	<- #{peek XKeyEvent,subwindow} p
+	time		<- #{peek XKeyEvent,time} p
+	x		<- #{peek XKeyEvent,x} p
+	y		<- #{peek XKeyEvent,y} p
+	x_root		<- #{peek XKeyEvent,x_root} p
+	y_root		<- #{peek XKeyEvent,y_root} p
+	state		<- #{peek XKeyEvent,state} p
+	keycode		<- #{peek XKeyEvent,keycode} p
+	same_screen	<- #{peek XKeyEvent,same_screen} p
+	return (root, subwindow, time, x, y, x_root, y_root,
+		state, keycode, same_screen)
+
+get_KeyEvent :: XEventPtr -> IO XKeyEvent
+get_KeyEvent p = peekXKeyEvent (castPtr p)
+
+type XKeyEventPtr   = Ptr XKeyEvent
+
+asKeyEvent :: XEventPtr -> XKeyEventPtr
+asKeyEvent = castPtr
+
+type XButtonEvent =
+	( Window    --	root window that the event occured on
+	, Window    --	child window
+	, Time      --	milliseconds
+	, Int       --	pointer x, y coordinates in event window
+	, Int
+	, Int       --	coordinates relative to root
+	, Int
+	, Modifier  --	key or button mask
+	, Button    --	detail
+	, Bool      --	same screen flag
+	)
+
+peekXButtonEvent :: Ptr XButtonEvent -> IO XButtonEvent
+peekXButtonEvent p = do
+	root		<- #{peek XButtonEvent,root} p
+	subwindow	<- #{peek XButtonEvent,subwindow} p
+	time		<- #{peek XButtonEvent,time} p
+	x		<- #{peek XButtonEvent,x} p
+	y		<- #{peek XButtonEvent,y} p
+	x_root		<- #{peek XButtonEvent,x_root} p
+	y_root		<- #{peek XButtonEvent,y_root} p
+	state		<- #{peek XButtonEvent,state} p
+	button		<- #{peek XButtonEvent,button} p
+	same_screen	<- #{peek XButtonEvent,same_screen} p
+	return (root, subwindow, time, x, y, x_root, y_root,
+		state, button, same_screen)
+
+get_ButtonEvent :: XEventPtr -> IO XButtonEvent
+get_ButtonEvent p = peekXButtonEvent (castPtr p)
+
+type XMotionEvent =
+	( Window      -- root window that the event occured on
+	, Window      -- child window
+	, Time        -- milliseconds
+	, Int         -- pointer x, y coordinates in event window
+	, Int
+	, Int         -- coordinates relative to root
+	, Int
+	, Modifier    -- key or button mask
+	, NotifyMode  -- detail
+	, Bool        -- same screen flag
+	)
+
+peekXMotionEvent :: Ptr XMotionEvent -> IO XMotionEvent
+peekXMotionEvent p = do
+	root		<- #{peek XMotionEvent,root} p
+	subwindow	<- #{peek XMotionEvent,subwindow} p
+	time		<- #{peek XMotionEvent,time} p
+	x		<- #{peek XMotionEvent,x} p
+	y		<- #{peek XMotionEvent,y} p
+	x_root		<- #{peek XMotionEvent,x_root} p
+	y_root		<- #{peek XMotionEvent,y_root} p
+	state		<- #{peek XMotionEvent,state} p
+	is_hint		<- #{peek XMotionEvent,is_hint} p
+	same_screen	<- #{peek XMotionEvent,same_screen} p
+	return (root, subwindow, time, x, y, x_root, y_root,
+		state, is_hint, same_screen)
+
+get_MotionEvent :: XEventPtr -> IO XMotionEvent
+get_MotionEvent p = peekXMotionEvent (castPtr p)
+
+-- %struct : XCrossingEvent : XCrossingEvent arg1
+--   Window       : root 	        # root window that the event occured on
+--   Window       : subwindow 	# child window
+--   Time         : time 		# milliseconds
+--   Int          : x 		# pointer x, y coordinates in event window
+--   Int          : y
+--   Int          : x_root	 	# coordinates relative to root
+--   Int          : y_root
+--   NotifyMode   : mode
+--   NotifyDetail : detail
+--   Bool         : same_screen	# same screen flag
+--   Bool         : focus		# boolean focus
+--   Modifier     : state	        # key or button mask
+--
+-- %struct : XFocusChangeEvent : XFocusChangeEvent arg1
+--   NotifyMode   : mode
+--   NotifyDetail : detail
+--
+-- -- omitted: should be translated into bitmaps
+-- -- PURE void	getKeymapEvent(event)
+-- -- IN XEvent*	event
+-- -- OUT Window	window	 	= ((XKeymapEvent*)event)->window
+-- -- OUT array[32] Char key_vector 	= ((XKeymapEvent*)event)->key_vector
+-- -- RESULT:
+
+type XExposeEvent =
+	( Position	-- x
+	, Position	-- y
+	, Dimension	-- width
+	, Dimension	-- height
+	, Int		-- count
+	)
+
+peekXExposeEvent :: Ptr XExposeEvent -> IO XExposeEvent
+peekXExposeEvent p = do
+	x	<- #{peek XExposeEvent,x} p
+	y	<- #{peek XExposeEvent,y} p
+	width	<- #{peek XExposeEvent,width} p
+	height	<- #{peek XExposeEvent,height} p
+	count	<- #{peek XExposeEvent,count} p
+	return (x, y, width, height, count)
+
+get_ExposeEvent :: XEventPtr -> IO XExposeEvent
+get_ExposeEvent p = peekXExposeEvent (castPtr p)
+
+-- %struct : XGraphicsExposeEvent : XGraphicsExposeEvent arg1
+--   Position	: x
+--   Position	: y
+--   Dimension	: width	 	.
+--   Dimension	: height
+--   Int		: count
+--   Int		: major_code
+--   Int		: minor_code
+--
+-- %struct : XCirculateEvent : XCirculateEvent arg1
+--   Window	: window
+--   Place		: place
+--
+-- %struct : XConfigureEvent : XConfigureEvent arg1
+--   Window	: window
+--   Position	: x
+--   Position	: y
+--   Dimension	: width
+--   Dimension	: height
+--   Dimension	: border_width
+--   Window	: above
+--   Bool	        : override_redirect
+--
+-- %struct : XCreateWindowEvent : XCreateWindowEvent arg1
+--   Window	: window
+--   Position	: x
+--   Position	: y
+--   Dimension	: width
+--   Dimension	: height
+--   Dimension	: border_width
+--   Bool	        : override_redirect
+--
+-- %struct : XDestroyWindowEvent : XDestroyWindowEvent arg1
+--   Window	: window
+--
+-- %struct : XGravityEvent : XGravityEvent arg1
+--   Window	: window
+--   Position	: x
+--   Position	: y
+--
+-- %struct : XMapEvent : XMapEvent arg1
+--   Bool	        : override_redirect
+
+type XMappingEvent =
+	( MappingRequest  -- request
+	, KeyCode	  -- first_keycode
+	, Int		  -- count
+	)
+
+withXMappingEvent :: XMappingEvent -> (Ptr XMappingEvent -> IO a) -> IO a
+withXMappingEvent event_map f =
+	allocaBytes #{size XMappingEvent} $ \ event_map_ptr -> do
+	pokeXMappingEvent event_map_ptr event_map
+	f event_map_ptr
+
+pokeXMappingEvent :: Ptr XMappingEvent -> XMappingEvent -> IO ()
+pokeXMappingEvent p (request, first_keycode, count) = do
+	#{poke XMappingEvent,request}		p request
+	#{poke XMappingEvent,first_keycode}	p first_keycode
+	#{poke XMappingEvent,count}		p count
+
+type XConfigureEvent =
+	( Position
+	, Position
+	, Dimension
+	, Dimension
+	)
+
+peekXConfigureEvent :: Ptr XConfigureEvent -> IO XConfigureEvent
+peekXConfigureEvent p = do
+	x	<- #{peek XConfigureEvent,x} p
+	y	<- #{peek XConfigureEvent,y} p
+	width	<- #{peek XConfigureEvent,width} p
+	height	<- #{peek XConfigureEvent,height} p
+	return (x, y, width, height)
+
+get_ConfigureEvent :: XEventPtr -> IO XConfigureEvent
+get_ConfigureEvent p = peekXConfigureEvent (castPtr p)
+
+-- %struct : XResizeRequestEvent : XResizeRequestEvent arg1
+--   Dimension	: width
+--   Dimension	: height
+--
+
+-- %struct : XReparentEvent : XReparentEvent arg1
+--   Window	: window
+--   Window	: parent
+--   Position	: x
+--   Position	: y
+--   Bool	        : override_redirect
+--
+-- %struct : XUnmapEvent : XUnmapEvent arg1
+--   Window	: window
+--   Bool	        : from_configure
+--
+-- %struct : XVisibilityEvent : XVisibilityEvent arg1
+--   Visibility	: state
+--
+-- %struct : XCirculateRequestEvent : XCirculateRequestEvent arg1
+--   Place	        : place
+--
+-- -- omitted because valuemask looks tricky
+-- -- %struct : XConfigureRequestEvent : XConfigureRequestEvent arg1
+-- --   Window	 : window
+-- --   Position	 : x
+-- --   Position	 : y
+-- --   Dimension	 : width
+-- --   Dimension	 : height
+-- --   Dimension	 : border_width
+-- --   Window	 : above
+-- --   StackingMethod : detail
+-- --   ???	         : valuemask
+--
+-- %struct : XMapRequestEvent : XMapRequestEvent arg1
+--   Window	: window
+--
+-- %struct : XColormapEvent : XColormapEvent arg1
+--   Colormap		: colormap
+--   Bool		        : new
+--   ColormapNotification	: state
+--
+-- -- getClientMessageEvent omitted
+-- -- getPropertyEvent omitted
+-- -- getSelectionClearEvent omitted
+-- -- getSelectionRequestEvent omitted
+-- -- getSelectionEvent omitted
+
+-- functions
+
+-- The following is useful if you want to do a read with timeout.
+
+-- | Reads an event with a timeout (in microseconds).
+-- Returns True if timeout occurs.
+waitForEvent :: Display -> Word32 -> IO Bool
+waitForEvent display usecs =
+	with (TimeVal (usecs `div` 1000000) (usecs `mod` 1000000)) $ \ tv_ptr ->
+	allocaBytes #{size fd_set} $ \ readfds ->
+	allocaBytes #{size fd_set} $ \ nofds -> do
+	let fd = connectionNumber display
+	fdZero readfds
+	fdZero nofds
+	fdSet fd readfds
+	n <- select (fd+1) readfds nofds nofds tv_ptr
+	return (n == 0)
+
+newtype FdSet = FdSet (Ptr FdSet)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+foreign import ccall unsafe "HsXlib.h" fdZero :: Ptr FdSet -> IO ()
+foreign import ccall unsafe "HsXlib.h" fdSet :: Int -> Ptr FdSet -> IO ()
+
+foreign import ccall unsafe "HsXlib.h" select ::
+	Int -> Ptr FdSet -> Ptr FdSet -> Ptr FdSet -> Ptr TimeVal -> IO Int
+
+-- | This function is somewhat compatible with Win32's @TimeGetTime()@
+gettimeofday_in_milliseconds :: IO Integer
+gettimeofday_in_milliseconds =
+	alloca $ \ tv_ptr -> do
+	rc <- gettimeofday tv_ptr nullPtr
+	TimeVal sec usec <- peek tv_ptr
+	return (toInteger sec * 1000 + toInteger usec `div` 1000)
+
+data TimeVal = TimeVal Word32 Word32
+
+instance Storable TimeVal where
+	alignment _ = #{size int}
+	sizeOf _ = #{size struct timeval}
+	peek p = do
+		sec <- #{peek struct timeval,tv_sec} p
+		usec <- #{peek struct timeval,tv_usec} p
+		return (TimeVal sec usec)
+	poke p (TimeVal sec usec) = do
+		#{poke struct timeval,tv_sec} p sec
+		#{poke struct timeval,tv_usec} p usec
+
+newtype TimeZone = TimeZone (Ptr TimeZone)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+foreign import ccall unsafe "HsXlib.h"
+	gettimeofday :: Ptr TimeVal -> Ptr TimeZone -> IO ()
+
+-- | interface to the X11 library function @XFlush()@.
+foreign import ccall unsafe "HsXlib.h XFlush"
+	flush        :: Display ->               IO ()
+
+-- | interface to the X11 library function @XSync()@.
+foreign import ccall unsafe "HsXlib.h XSync"
+	sync         :: Display -> Bool ->       IO ()
+
+-- | interface to the X11 library function @XPending()@.
+foreign import ccall unsafe "HsXlib.h XPending"
+	pending      :: Display ->               IO Int
+
+-- | interface to the X11 library function @XEventsQueued()@.
+foreign import ccall unsafe "HsXlib.h XEventsQueued"
+	eventsQueued :: Display -> QueuedMode -> IO Int
+
+-- | interface to the X11 library function @XNextEvent()@.
+foreign import ccall unsafe "HsXlib.h XNextEvent"
+	nextEvent    :: Display -> XEventPtr  -> IO ()
+
+-- | interface to the X11 library function @XAllowEvents()@.
+foreign import ccall unsafe "HsXlib.h XAllowEvents"
+	allowEvents  :: Display -> AllowEvents -> Time -> IO ()
+
+-- ToDo: XFree(res1) after constructing result
+-- %fun XGetMotionEvents :: Display -> Window -> Time -> Time -> IO ListXTimeCoord
+-- %code res1 = XGetMotionEvents(arg1,arg2,arg3,arg4,&res1_size)
+
+-- | interface to the X11 library function @XSelectInput()@.
+foreign import ccall unsafe "HsXlib.h XSelectInput"
+	selectInput :: Display -> Window -> EventMask -> IO ()
+
+-- | interface to the X11 library function @XSendEvent()@.
+sendEvent :: Display -> Window -> Bool -> EventMask -> XEventPtr -> IO ()
+sendEvent display w propagate event_mask event_send =
+	throwIfZero "sendEvent" $
+		xSendEvent display w propagate event_mask event_send
+foreign import ccall unsafe "HsXlib.h XSendEvent"
+	xSendEvent :: Display -> Window -> Bool -> EventMask ->
+		XEventPtr -> IO Status
+
+-- | interface to the X11 library function @XWindowEvent()@.
+foreign import ccall unsafe "HsXlib.h XWindowEvent"
+	windowEvent :: Display -> Window -> EventMask -> XEventPtr -> IO ()
+
+-- | interface to the X11 library function @XCheckWindowEvent()@.
+foreign import ccall unsafe "HsXlib.h XCheckWindowEvent"
+	checkWindowEvent :: Display -> Window -> EventMask ->
+		XEventPtr -> IO Bool
+
+-- | interface to the X11 library function @XMaskEvent()@.
+foreign import ccall unsafe "HsXlib.h XMaskEvent"
+	maskEvent :: Display -> EventMask -> XEventPtr -> IO ()
+
+-- | interface to the X11 library function @XCheckMaskEvent()@.
+foreign import ccall unsafe "HsXlib.h XCheckMaskEvent"
+	checkMaskEvent :: Display -> EventMask -> XEventPtr -> IO Bool
+
+-- | interface to the X11 library function @XCheckTypedEvent()@.
+foreign import ccall unsafe "HsXlib.h XCheckTypedEvent"
+	checkTypedEvent :: Display -> EventType -> XEventPtr -> IO Bool
+
+-- | interface to the X11 library function @XCheckTypedWindowEvent()@.
+foreign import ccall unsafe "HsXlib.h XCheckTypedWindowEvent"
+	checkTypedWindowEvent :: Display -> Window -> EventType ->
+		XEventPtr -> IO Bool
+
+-- | interface to the X11 library function @XPutBackEvent()@.
+foreign import ccall unsafe "HsXlib.h XPutBackEvent"
+	putBackEvent :: Display -> XEventPtr -> IO ()
+
+-- | interface to the X11 library function @XPeekEvent()@.
+foreign import ccall unsafe "HsXlib.h XPeekEvent"
+	peekEvent :: Display -> XEventPtr -> IO ()
+
+-- XFilterEvent omitted (can't find documentation)
+-- XIfEvent omitted (can't pass predicates (yet))
+-- XCheckIfEvent omitted (can't pass predicates (yet))
+-- XPeekIfEvent omitted (can't pass predicates (yet))
+
+-- | interface to the X11 library function @XRefreshKeyboardMapping()@.
+refreshKeyboardMapping :: XMappingEvent -> IO ()
+refreshKeyboardMapping event_map =
+	withXMappingEvent event_map $ \ event_map_ptr ->
+	xRefreshKeyboardMapping event_map_ptr
+foreign import ccall unsafe "HsXlib.h XRefreshKeyboardMapping"
+	xRefreshKeyboardMapping :: Ptr XMappingEvent -> IO ()
+
+-- XSynchronize omitted (returns C function)
+-- XSetAfterFunction omitted (can't pass functions (yet))
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Font.hsc b/Graphics/X11/Xlib/Font.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Font.hsc
@@ -0,0 +1,250 @@
+{-# OPTIONS_GHC -fglasgow-exts #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Font
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib Fonts.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Font(
+
+        Glyph,
+        queryFont,
+        fontFromGC,
+        loadQueryFont,
+        freeFont,
+	FontStruct,
+        fontFromFontStruct,
+        ascentFromFontStruct,
+        descentFromFontStruct,
+        CharStruct,
+        textExtents,
+        textWidth,
+
+        ) where
+
+#include "HsXlib.h"
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+
+import Foreign
+import Foreign.C
+
+#if __GLASGOW_HASKELL__
+import Data.Generics
+#endif
+
+----------------------------------------------------------------
+-- Fonts
+----------------------------------------------------------------
+
+-- A glyph (or Char2b) is a 16 bit character identification.
+-- The top 8 bits are zero in many fonts.
+type Glyph = Word16
+
+-- | pointer to an X11 @XFontStruct@ structure
+newtype FontStruct = FontStruct (Ptr FontStruct)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+-- Disnae exist: %fun LoadFont       :: Display -> String -> IO Font
+-- Disnae exist: %fun UnloadFont     :: Display -> Font -> IO ()
+
+-- Argument can be a Font or a GContext.
+-- But, if it's a GContext, the fontStruct will use the GContext as the
+-- FontID - which will cause most things to break so it's probably
+-- safer using XGetGCValues to get a genuine font ID
+
+-- | interface to the X11 library function @XQueryFont()@.
+foreign import ccall unsafe "HsXlib.h XQueryFont"
+	queryFont     :: Display -> Font -> IO FontStruct
+
+-- Note that this _WILL NOT WORK_ unless you have explicitly set the font.
+-- I'm slowly but surely coming to the conclusion that Xlib is a pile of
+-- steaming shit.
+
+-- | interface to the X11 library function @XGetGCValues()@.
+fontFromGC :: Display -> GC -> IO Font
+fontFromGC display gc =
+	allocaBytes #{size XGCValues} $ \ values -> do
+	throwIfZero "fontFromGC" $
+		xGetGCValues display gc #{const GCFont} values
+	#{peek XGCValues,font} values
+foreign import ccall unsafe "HsXlib.h XGetGCValues"
+	xGetGCValues :: Display -> GC -> ValueMask -> Ptr GCValues -> IO Int
+
+type ValueMask = #{type unsigned long}
+
+-- | interface to the X11 library function @XLoadQueryFont()@.
+loadQueryFont :: Display -> String -> IO FontStruct
+loadQueryFont display name =
+	withCString name $ \ c_name -> do
+	fs <- throwIfNull "loadQueryFont" $ xLoadQueryFont display c_name
+	return (FontStruct fs)
+foreign import ccall unsafe "HsXlib.h XLoadQueryFont"
+	xLoadQueryFont :: Display -> CString -> IO (Ptr FontStruct)
+
+-- | interface to the X11 library function @XFreeFont()@.
+foreign import ccall unsafe "HsXlib.h XFreeFont"
+	freeFont      :: Display -> FontStruct -> IO ()
+-- %fun XSetFontPath  :: Display -> ListString  -> IO () using XSetFontPath(arg1,arg2,arg2_size)
+
+fontFromFontStruct :: FontStruct -> Font
+fontFromFontStruct (FontStruct fs) = unsafePerformIO $
+	#{peek XFontStruct,fid} fs
+
+ascentFromFontStruct :: FontStruct -> Int32
+ascentFromFontStruct (FontStruct fs) = unsafePerformIO $
+	#{peek XFontStruct,ascent} fs
+
+descentFromFontStruct :: FontStruct -> Int32
+descentFromFontStruct (FontStruct fs) = unsafePerformIO $
+	#{peek XFontStruct,descent} fs
+
+-- %prim XGetFontPath :: Display -> IO ListString
+--Int r_size;
+--String* r = XGetFontPath(arg1,&r_size);
+-- %update(r);
+--XFreeFontPath(r);
+--return;
+
+-- %prim XListFonts :: Display -> String -> Int -> IO ListString
+--Int r_size;
+--String *r = XListFonts(arg1,arg2,arg3,&r_size);
+-- %update(r);
+--XFreeFontNames(r);
+--return;
+
+-- XListFontsWithInfo omitted (no support for FontStruct yet)
+
+-- XQueryTextExtents omitted (no support for CharStruct yet)
+-- XQueryTextExtents16 omitted (no support for CharStruct yet)
+
+-- We marshall this across right away because it's usually one-off info
+type CharStruct =
+	( Int            -- lbearing (origin to left edge of raster)
+	, Int            -- rbearing (origin to right edge of raster)
+	, Int            -- width    (advance to next char's origin)
+	, Int            -- ascent   (baseline to top edge of raster)
+	, Int            -- descent  (baseline to bottom edge of raster)
+	-- attributes omitted
+	)
+
+peekCharStruct :: Ptr CharStruct -> IO CharStruct
+peekCharStruct p = do
+	lbearing <- #{peek XCharStruct,lbearing} p
+	rbearing <- #{peek XCharStruct,rbearing} p
+	width    <- #{peek XCharStruct,width} p
+	ascent   <- #{peek XCharStruct,ascent} p
+	descent  <- #{peek XCharStruct,descent} p
+	return (fromIntegral (lbearing::CShort),
+		fromIntegral (rbearing::CShort),
+		fromIntegral (width::CShort),
+		fromIntegral (ascent::CShort),
+		fromIntegral (descent::CShort))
+
+-- No need to put this in the IO monad - this info is essentially constant
+
+-- | interface to the X11 library function @XTextExtents()@.
+textExtents :: FontStruct -> String -> (FontDirection, Int32, Int32, CharStruct)
+textExtents font_struct string = unsafePerformIO $
+	withCStringLen string $ \ (c_string, nchars) ->
+	alloca $ \ direction_return ->
+	alloca $ \ font_ascent_return ->
+	alloca $ \ font_descent_return ->
+	allocaBytes #{size XCharStruct} $ \ overall_return -> do
+	xTextExtents font_struct c_string nchars direction_return
+		font_ascent_return font_descent_return overall_return
+	direction <- peek direction_return
+	ascent <- peek font_ascent_return
+	descent <- peek font_descent_return
+	cs <- peekCharStruct overall_return
+	return (direction, ascent, descent, cs)
+foreign import ccall unsafe "HsXlib.h XTextExtents"
+	xTextExtents :: FontStruct -> CString -> Int ->
+		Ptr FontDirection -> Ptr Int32 -> Ptr Int32 ->
+		Ptr CharStruct -> IO Int
+
+-- No need to put ths in the IO monad - this info is essentially constant
+
+-- | interface to the X11 library function @XTextWidth()@.
+textWidth :: FontStruct -> String -> Int32
+textWidth font_struct string = unsafePerformIO $
+	withCStringLen string $ \ (c_string, len) ->
+	xTextWidth font_struct c_string len
+foreign import ccall unsafe "HsXlib.h XTextWidth"
+	xTextWidth :: FontStruct -> CString -> Int -> IO Int32
+
+-- XTextExtents16 omitted
+-- XTextWidth16 omitted
+
+-- XGetFontProperty omitted
+-- XFreeFontInfo omitted
+-- XFreeFontNames omitted
+
+-- XCreateFontSet omitted (no documentation available)
+-- XFreeFontSet omitted (no documentation available)
+-- XFontsOfFontSet omitted (no documentation available)
+-- XBaseFontNameListOfFontSet omitted (no documentation available)
+-- XLocaleOfFontSet omitted (no documentation available)
+-- XExtentsOfFontSet omitted (no documentation available)
+
+-- XContextDependentDrawing omitted
+-- XDirectionalDependentDrawing omitted
+-- XContextualDrawing omitted
+
+-- XmbTextEscapement omitted
+-- XwcTextEscapement omitted
+-- XmbTextExtents omitted
+-- XwcTextExtents omitted
+-- XmbTextPerCharExtents omitted
+-- XwcTextPerCharExtents omitted
+-- XmbDrawText omitted
+-- XwcDrawText omitted
+-- XmbDrawString omitted
+-- XwcDrawString omitted
+-- XmbDrawImageString omitted
+-- XwcDrawImageString omitted
+
+-- XOpenIM omitted
+-- XCloseIM omitted
+-- XGetIMValues omitted
+-- XSetIMValues omitted
+-- DisplayOfIM omitted
+-- XLocaleOfIM omitted
+
+-- XCreateIC omitted
+-- XDestroyIC omitted
+-- XSetICFocus omitted
+-- XUnsetICFocus omitted
+-- XwcResetIC omitted
+-- XmbResetIC omitted
+-- XSetICValues omitted
+-- XGetICValues omitted
+-- XIMOfIC omitted
+
+-- XRegisterIMInstantiateCallback omitted
+-- XUnregisterIMInstantiateCallback omitted
+
+-- XInternalConnectionNumbers omitted
+-- XProcessInternalConnection omitted
+-- XAddConnectionWatch omitted
+-- XRemoveConnectionWatch omitted
+
+-- XmbLookupString omitted
+-- XwcLookupString omitted
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Misc.hsc b/Graphics/X11/Xlib/Misc.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Misc.hsc
@@ -0,0 +1,1262 @@
+{-# OPTIONS_GHC -fglasgow-exts #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Misc
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Misc(
+
+        rmInitialize,
+        autoRepeatOff,
+        autoRepeatOn,
+        bell,
+        setCloseDownMode,
+        lastKnownRequestProcessed,
+        getInputFocus,
+        setInputFocus,
+        grabButton,
+        ungrabButton,
+        grabPointer,
+        ungrabPointer,
+        grabKey,
+        ungrabKey,
+        grabKeyboard,
+        ungrabKeyboard,
+        grabServer,
+        ungrabServer,
+        queryBestTile,
+        queryBestStipple,
+        queryBestCursor,
+        queryBestSize,
+        queryPointer,
+
+	-- * Error reporting
+        displayName,
+        setDefaultErrorHandler,
+
+	-- * Geometry
+        geometry,
+        getGeometry,
+
+	-- * Locale
+        supportsLocale,
+        setLocaleModifiers,
+
+	-- * Screen saver
+        AllowExposuresMode,
+        dontAllowExposures,
+        allowExposures,
+        defaultExposures,
+        PreferBlankingMode,
+        dontPreferBlanking,
+        preferBlanking,
+        defaultBlanking,
+        ScreenSaverMode,
+        screenSaverActive,
+        screenSaverReset,
+        getScreenSaver,
+        setScreenSaver,
+        activateScreenSaver,
+        resetScreenSaver,
+        forceScreenSaver,
+
+	-- * Pointer
+        getPointerControl,
+        warpPointer,
+
+	-- * Pixmaps
+        createPixmap,
+        freePixmap,
+        bitmapBitOrder,
+        bitmapUnit,
+        bitmapPad,
+
+	-- * Keycodes
+        displayKeycodes,
+        lookupKeysym,
+        keycodeToKeysym,
+        keysymToKeycode,
+        keysymToString,
+        stringToKeysym,
+        noSymbol,
+        lookupString,
+
+	-- * Icons
+        getIconName,
+        setIconName,
+
+	-- * Cursors
+        defineCursor,
+        undefineCursor,
+        createPixmapCursor,
+        createGlyphCursor,
+        createFontCursor,
+        freeCursor,
+        recolorCursor,
+
+	-- * Window manager stuff
+        setWMProtocols,
+
+	-- * Set window attributes
+        allocaSetWindowAttributes,
+        set_background_pixmap,
+        set_background_pixel,
+        set_border_pixmap,
+        set_border_pixel,
+        set_bit_gravity,
+        set_win_gravity,
+        set_backing_store,
+        set_backing_planes,
+        set_backing_pixel,
+        set_save_under,
+        set_event_mask,
+        set_do_not_propagate_mask,
+        set_override_redirect,
+        set_colormap,
+        set_cursor,
+
+	-- * Drawing
+        drawPoint,
+        drawPoints,
+        drawLine,
+        drawLines,
+        drawSegments,
+        drawRectangle,
+        drawRectangles,
+        drawArc,
+        drawArcs,
+        fillRectangle,
+        fillRectangles,
+        fillPolygon,
+        fillArc,
+        fillArcs,
+        copyArea,
+        copyPlane,
+        drawString,
+        drawImageString,
+
+	-- * Cut and paste buffers
+        storeBuffer,
+        storeBytes,
+        fetchBuffer,
+        fetchBytes,
+        rotateBuffers,
+
+	-- * Window properties
+        setTextProperty,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+import Graphics.X11.Xlib.Atom
+import Graphics.X11.Xlib.Event
+import Graphics.X11.Xlib.Font
+
+import Foreign
+import Foreign.C
+
+#if __GLASGOW_HASKELL__
+import Data.Generics
+#endif
+
+#include "HsXlib.h"
+
+-- I'm not sure why I added this since I don't have any of the related
+-- functions.
+
+-- | interface to the X11 library function @XrmInitialize()@.
+foreign import ccall unsafe "HsXlib.h XrmInitialize"
+	rmInitialize :: IO ()
+
+-- %fun XGetDefault :: Display -> String -> String -> IO ()
+
+-- | interface to the X11 library function @XAutoRepeatOff()@.
+foreign import ccall unsafe "HsXlib.h XAutoRepeatOff"
+	autoRepeatOff    :: Display -> IO ()
+
+-- | interface to the X11 library function @XAutoRepeatOn()@.
+foreign import ccall unsafe "HsXlib.h XAutoRepeatOn"
+	autoRepeatOn     :: Display -> IO ()
+
+-- | interface to the X11 library function @XBell()@.
+foreign import ccall unsafe "HsXlib.h XBell"
+	bell             :: Display -> Int -> IO ()
+
+-- | interface to the X11 library function @XSetCloseDownMode()@.
+foreign import ccall unsafe "HsXlib.h XSetCloseDownMode"
+	setCloseDownMode :: Display -> CloseDownMode -> IO ()
+
+-- | interface to the X11 library function @XLastKnownRequestProcessed()@.
+foreign import ccall unsafe "HsXlib.h XLastKnownRequestProcessed"
+	lastKnownRequestProcessed :: Display -> IO Int
+
+-- | interface to the X11 library function @XGetInputFocus()@.
+getInputFocus :: Display -> IO (Window, FocusMode)
+getInputFocus display =
+	alloca $ \ focus_return ->
+	alloca $ \ revert_to_return -> do
+	xGetInputFocus display focus_return revert_to_return
+	focus <- peek focus_return
+	revert_to <- peek revert_to_return
+	return (focus, revert_to)
+foreign import ccall unsafe "HsXlib.h XGetInputFocus"
+	xGetInputFocus :: Display -> Ptr Window -> Ptr FocusMode -> IO ()
+
+-- | interface to the X11 library function @XSetInputFocus()@.
+foreign import ccall unsafe "HsXlib.h XSetInputFocus"
+	setInputFocus   :: Display -> Window -> FocusMode -> Time -> IO ()
+
+-- XAllocID omitted
+-- XKillClient omitted
+-- XFetchName omitted
+-- XGetKeyboardControl omitted
+-- XChangeKeyboardControl omitted
+-- XChangeKeyboardMapping omitted
+-- XChangePointerControl omitted
+
+-- | interface to the X11 library function @XGrabButton()@.
+foreign import ccall unsafe "HsXlib.h XGrabButton"
+	grabButton     :: Display -> Button -> ButtonMask -> Window -> Bool -> EventMask -> GrabMode -> GrabMode -> Window -> Cursor -> IO ()
+
+-- | interface to the X11 library function @XUngrabButton()@.
+foreign import ccall unsafe "HsXlib.h XUngrabButton"
+	ungrabButton   :: Display -> Button -> ButtonMask -> Window -> IO ()
+
+-- | interface to the X11 library function @XGrabPointer()@.
+foreign import ccall unsafe "HsXlib.h XGrabPointer"
+	grabPointer    :: Display -> Window -> Bool -> EventMask -> GrabMode -> GrabMode -> Window -> Cursor -> Time -> IO GrabStatus
+
+-- | interface to the X11 library function @XUngrabPointer()@.
+foreign import ccall unsafe "HsXlib.h XUngrabPointer"
+	ungrabPointer  :: Display -> Time -> IO ()
+
+-- | interface to the X11 library function @XGrabKey()@.
+foreign import ccall unsafe "HsXlib.h XGrabKey"
+	grabKey        :: Display -> KeyCode -> ButtonMask -> Window -> Bool -> GrabMode -> GrabMode -> IO ()
+
+-- | interface to the X11 library function @XUngrabKey()@.
+foreign import ccall unsafe "HsXlib.h XUngrabKey"
+	ungrabKey      :: Display -> KeyCode -> ButtonMask -> Window -> IO ()
+
+-- | interface to the X11 library function @XGrabKeyboard()@.
+foreign import ccall unsafe "HsXlib.h XGrabKeyboard"
+	grabKeyboard   :: Display -> Window -> Bool -> GrabMode -> GrabMode -> Time -> IO GrabStatus
+
+-- | interface to the X11 library function @XUngrabKeyboard()@.
+foreign import ccall unsafe "HsXlib.h XUngrabKeyboard"
+	ungrabKeyboard :: Display -> Time -> IO ()
+
+-- | interface to the X11 library function @XGrabServer()@.
+foreign import ccall unsafe "HsXlib.h XGrabServer"
+	grabServer   :: Display -> IO ()
+
+-- | interface to the X11 library function @XUngrabServer()@.
+foreign import ccall unsafe "HsXlib.h XUngrabServer"
+	ungrabServer :: Display -> IO ()
+
+-- XChangeActivePointerGrab omitted
+
+-- | interface to the X11 library function @XFree()@.
+foreign import ccall unsafe "HsXlib.h XFree" xFree :: Ptr a -> IO ()
+
+-- XFreeStringList omitted
+
+-- | interface to the X11 library function @XQueryBestTile()@.
+queryBestTile    :: Display -> Drawable -> Dimension -> Dimension ->
+			IO (Dimension, Dimension)
+queryBestTile display which_screen width height =
+	outParameters2 (throwIfZero "queryBestTile") $
+		xQueryBestTile display which_screen width height
+foreign import ccall unsafe "HsXlib.h XQueryBestTile"
+	xQueryBestTile    :: Display -> Drawable -> Dimension -> Dimension ->
+				Ptr Dimension -> Ptr Dimension -> IO Status
+
+-- | interface to the X11 library function @XQueryBestStipple()@.
+queryBestStipple :: Display -> Drawable -> Dimension -> Dimension ->
+			IO (Dimension, Dimension)
+queryBestStipple display which_screen width height =
+	outParameters2 (throwIfZero "queryBestStipple") $
+		xQueryBestStipple display which_screen width height
+foreign import ccall unsafe "HsXlib.h XQueryBestStipple"
+	xQueryBestStipple :: Display -> Drawable -> Dimension -> Dimension ->
+				Ptr Dimension -> Ptr Dimension -> IO Status
+
+-- | interface to the X11 library function @XQueryBestCursor()@.
+queryBestCursor  :: Display -> Drawable -> Dimension -> Dimension ->
+			IO (Dimension, Dimension)
+queryBestCursor display d width height =
+	outParameters2 (throwIfZero "queryBestCursor") $
+		xQueryBestCursor display d width height
+foreign import ccall unsafe "HsXlib.h XQueryBestCursor"
+	xQueryBestCursor  :: Display -> Drawable -> Dimension -> Dimension ->
+				Ptr Dimension -> Ptr Dimension -> IO Status
+
+-- | interface to the X11 library function @XQueryBestSize()@.
+queryBestSize    :: Display -> QueryBestSizeClass -> Drawable ->
+			Dimension -> Dimension -> IO (Dimension, Dimension)
+queryBestSize display shape_class which_screen width height =
+	outParameters2 (throwIfZero "queryBestSize") $
+		xQueryBestSize display shape_class which_screen width height
+foreign import ccall unsafe "HsXlib.h XQueryBestSize"
+	xQueryBestSize    :: Display -> QueryBestSizeClass -> Drawable ->
+				Dimension -> Dimension ->
+				Ptr Dimension -> Ptr Dimension -> IO Status
+
+-- Note: Returns false if pointer not in window w (and win_x = win_y = 0)
+-- ToDo: more effective use of Maybes?
+
+-- | interface to the X11 library function @XQueryPointer()@.
+queryPointer :: Display -> Window ->
+		IO (Bool, Window, Window, Int, Int, Int, Int, Modifier)
+queryPointer display w =
+	alloca $ \ root_return ->
+	alloca $ \ child_return ->
+	alloca $ \ root_x_return ->
+	alloca $ \ root_y_return ->
+	alloca $ \ win_x_return ->
+	alloca $ \ win_y_return ->
+	alloca $ \ mask_return -> do
+	rel <- xQueryPointer display w root_return child_return root_x_return
+		root_y_return win_x_return win_y_return mask_return
+	root <- peek root_return
+	child <- peek child_return
+	root_x <- peek root_x_return
+	root_y <- peek root_y_return
+	win_x <- peek win_x_return
+	win_y <- peek win_y_return
+	mask <- peek mask_return
+	return (rel, root, child, root_x, root_y, win_x, win_y, mask)
+foreign import ccall unsafe "HsXlib.h XQueryPointer"
+	xQueryPointer :: Display -> Window ->
+		Ptr Window -> Ptr Window -> Ptr Int -> Ptr Int ->
+		Ptr Int -> Ptr Int -> Ptr Modifier -> IO Bool
+
+-- XSetSelectionOwner omitted
+
+-- XOpenOM omitted
+-- XCloseOM omitted
+-- XSetOMValues omitted
+-- XGetOMValues omitted
+-- DisplayOfOM omitted
+-- XLocaleOfOM omitted
+
+-- XCreateOC omitted
+-- XDestroyOC omitted
+-- XOMOfOC omitted
+-- XSetOCValues omitted
+-- XGetOCValues omitted
+
+-- XVaCreateNestedList omitted
+
+----------------------------------------------------------------
+-- Error reporting
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XDisplayName()@.
+displayName :: String -> String
+displayName str = unsafePerformIO $
+	withCString str $ \ c_str -> do
+	c_name <- xDisplayName c_str
+	peekCString c_name
+foreign import ccall unsafe "HsXlib.h XDisplayName"
+	xDisplayName :: CString -> IO CString
+
+-- type ErrorHandler   = Display -> ErrorEvent -> IO Int
+-- %dis errorHandler x = (stable x)
+--
+-- type IOErrorHandler = Display ->                IO Int
+-- %dis ioErrorHandler x = (stable x)
+
+-- Sadly, this code doesn't work because hugs->runIO creates a fresh
+-- stack of exception handlers so the exception gets thrown to the
+-- wrong place.
+--
+-- %C
+-- % static HugsStablePtr ioErrorHandlerPtr;
+-- %
+-- % int genericIOErrorHandler(Display *d)
+-- % {
+-- %     if (ioErrorHandlerPtr >= 0) {
+-- %     	  hugs->putStablePtr(ioErrorHandlerPtr);
+-- %     	  hugs->putAddr(d);
+-- %     	  if (hugs->runIO(1)) { /* exitWith value returned */
+-- %     	   return hugs->getInt();
+-- %     	  } else {
+-- %     	   return hugs->getWord();
+-- %     	  }
+-- %     }
+-- %     return 1;
+-- % }
+
+-- Here's what we might do instead.  The two error handlers set flags
+-- when they fire and every single call to X contains the line:
+--
+--   %fail { errorFlags != 0 } { XError(errorFlags) }
+--
+-- This really sucks.
+-- Oh, and it won't even work with IOErrors since they terminate
+-- the process if the handler returns.  I don't know what the hell they
+-- think they're doing taking it upon themselves to terminate MY
+-- process when THEIR library has a problem but I don't think anyone
+-- ever accused X of being well-designed.
+--
+-- % static int genericIOErrorHandler(Display *d)
+-- % {
+-- %     if (ioErrorHandlerPtr >= 0) {
+-- %     	  hugs->putStablePtr(ioErrorHandlerPtr);
+-- %     	  hugs->putAddr(d);
+-- %     	  if (hugs->runIO(1)) { /* exitWith value returned */
+-- %     	   return hugs->getInt();
+-- %     	  } else {
+-- %     	   return hugs->getWord();
+-- %     	  }
+-- %     }
+-- %     return 1;
+-- % }
+
+-- HN 2001-02-06
+-- Moved to auxiliaries.c to make it easier to use the inlining option.
+-- -- Sigh, for now we just use an error handler that prints an error
+-- -- message on the screen
+-- %C
+-- % static int defaultErrorHandler(Display *d, XErrorEvent *ev)
+-- % {
+-- % 	  char buffer[1000];
+-- % 	  XGetErrorText(d,ev->error_code,buffer,1000);
+-- % 	  printf("Error: %s\n", buffer);
+-- % 	  return 0;
+-- % }
+
+{-# CFILES cbits/auxiliaries.c #-}
+
+newtype XErrorEvent = XErrorEvent (Ptr XErrorEvent)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+type ErrorHandler = FunPtr (Display -> Ptr XErrorEvent -> IO Int)
+
+foreign import ccall unsafe "HsXlib.h &defaultErrorHandler"
+	defaultErrorHandler :: FunPtr (Display -> Ptr XErrorEvent -> IO Int)
+
+-- | The Xlib library reports most errors by invoking a user-provided
+-- error handler.  This function installs an error handler that prints a
+-- textual representation of the error.
+setDefaultErrorHandler :: IO ()
+setDefaultErrorHandler = do
+	xSetErrorHandler defaultErrorHandler
+	return ()
+
+-- %fun XSetIOErrorHandler :: IOErrorHandler -> IO IOErrorHandler
+
+foreign import ccall unsafe "HsXlib.h XSetErrorHandler"
+	xSetErrorHandler   :: ErrorHandler   -> IO ErrorHandler
+
+-- XGetErrorDatabaseText omitted
+-- XGetErrorText omitted
+
+----------------------------------------------------------------
+-- -- Buffers
+-- ----------------------------------------------------------------
+--
+-- -- OLD: Would arrays be more appropriate?
+-- --
+-- -- IMPURE void	XStoreBytes(display, bytes, nbytes)
+-- -- IN Display*		display
+-- -- VAR Int			nbytes
+-- -- IN list[nbytes] Byte	bytes
+-- --
+-- -- IMPURE list[nbytes] Byte	XFetchBytes(display, &nbytes)
+-- -- IN Display*	display
+-- -- VAR Int		nbytes
+-- --
+-- -- IMPURE void	XStoreBuffer(display, bytes, nbytes, buffer)
+-- -- IN Display*		display
+-- -- VAR Int			nbytes
+-- -- IN list[nbytes] Byte	bytes
+-- -- IN Buffer		buffer
+-- --
+-- -- IMPURE list[nbytes] Byte	XFetchBuffer(display, &nbytes, buffer)
+-- -- IN Display*	display
+-- -- VAR Int		nbytes
+-- -- IN Buffer	buffer
+-- --
+-- -- IMPURE void	XRotateBuffers(display, rotate)
+-- -- IN Display*	display
+-- -- VAR Int		rotate
+
+----------------------------------------------------------------
+-- Extensions
+----------------------------------------------------------------
+
+-- ToDo: Use XFreeExtensionList
+-- %fun XListExtensions :: Display -> IO ListString using res1 = XListExtensions(arg1,&res1_size)
+
+-- %errfun False XQueryExtension :: Display -> String -> IO (Int,Int,Int) using res4 = XQueryExtension(arg1,arg2,&res1,&res2,&res3)->(res1,res2,res3)
+-- %fun XInitExtensions :: Display -> String -> IO XExtCodes
+-- %fun XAddExtensions  :: Display ->           IO XExtCodes
+
+-- XAddToExtensionList omitted
+-- XFindOnExtensionList omitted
+-- XEHeadOfExtensionList omitted
+
+----------------------------------------------------------------
+-- Hosts
+----------------------------------------------------------------
+
+-- ToDo: operations to construct and destruct an XHostAddress
+
+-- %fun XAddHost :: Display -> XHostAddress -> IO ()
+-- %fun XRemoveHost :: Display -> XHostAddress -> IO ()
+--
+-- %fun XAddHosts    :: Display -> ListXHostAddress -> IO () using XAddHosts(arg1,arg2,arg2_size)
+-- %fun XRemoveHosts :: Display -> ListXHostAddress -> IO () using XRemoveHosts(arg1,arg2,arg2_size)
+--
+-- -- Uses %prim to let us call XFree
+-- %prim XListHosts :: Display -> IO (ListXHostAddress, Bool)
+-- Bool state;
+-- Int r_size;
+-- XHostAddress* r = XListHosts(arg1,&r_size,&state);
+-- %update(r,state);
+-- XFree(r);
+-- return;
+
+-- %fun XEnableAccessControl  :: Display -> IO ()
+-- %fun XDisableAccessControl :: Display -> IO ()
+-- %fun XSetAccessControl     :: Display -> Access -> IO ()
+
+----------------------------------------------------------------
+-- Geometry
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XGeometry()@.
+geometry :: Display -> Int -> String -> String ->
+		Dimension -> Dimension -> Dimension -> Int -> Int ->
+		IO (Int, Position, Position, Dimension, Dimension)
+geometry display screen position default_position
+		bwidth fwidth fheight xadder yadder =
+	withCString position $ \ c_position ->
+	withCString default_position $ \ c_default_position ->
+	alloca $ \ x_return ->
+	alloca $ \ y_return ->
+	alloca $ \ width_return ->
+	alloca $ \ height_return -> do
+	res <- xGeometry display screen c_position c_default_position
+		bwidth fwidth fheight xadder yadder
+		x_return y_return width_return height_return
+	x <- peek x_return
+	y <- peek y_return
+	width <- peek width_return
+	height <- peek height_return
+	return (res, x, y, width, height)
+foreign import ccall unsafe "HsXlib.h XGeometry"
+	xGeometry :: Display -> Int -> CString -> CString ->
+		Dimension -> Dimension -> Dimension -> Int -> Int ->
+		Ptr Position -> Ptr Position ->
+		Ptr Dimension -> Ptr Dimension -> IO Int
+
+-- | interface to the X11 library function @XGetGeometry()@.
+getGeometry :: Display -> Drawable ->
+	IO (Window, Position, Position, Dimension, Dimension, Dimension, Int)
+getGeometry display d =
+	outParameters7 (throwIfZero "getGeometry") $
+		xGetGeometry display d
+foreign import ccall unsafe "HsXlib.h XGetGeometry"
+	xGetGeometry :: Display -> Drawable ->
+		Ptr Window -> Ptr Position -> Ptr Position -> Ptr Dimension ->
+		Ptr Dimension -> Ptr Dimension -> Ptr Int -> IO Status
+
+-- XParseGeometry omitted (returned bitset too weird)
+
+----------------------------------------------------------------
+-- Locale
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XSupportsLocale()@.
+foreign import ccall unsafe "HsXlib.h XSupportsLocale"
+	supportsLocale :: IO Bool
+
+-- | interface to the X11 library function @XSetLocaleModifiers()@.
+setLocaleModifiers :: String -> IO String
+setLocaleModifiers mods =
+	withCString mods $ \ modifier_list -> do
+	c_str <- xSetLocaleModifiers modifier_list
+	peekCString c_str
+foreign import ccall unsafe "HsXlib.h XSetLocaleModifiers"
+	xSetLocaleModifiers :: CString -> IO CString
+
+----------------------------------------------------------------
+-- Screen Saver
+----------------------------------------------------------------
+
+type AllowExposuresMode = Int
+#{enum AllowExposuresMode,
+ , dontAllowExposures	= DontAllowExposures
+ , allowExposures	= AllowExposures
+ , defaultExposures	= DefaultExposures
+ }
+
+type PreferBlankingMode = Int
+#{enum PreferBlankingMode,
+ , dontPreferBlanking	= DontPreferBlanking
+ , preferBlanking	= PreferBlanking
+ , defaultBlanking	= DefaultBlanking
+ }
+
+type ScreenSaverMode = Int
+#{enum ScreenSaverMode,
+ , screenSaverActive	= ScreenSaverActive
+ , screenSaverReset	= ScreenSaverReset
+ }
+
+getScreenSaver :: Display ->
+	IO (Int, Int, PreferBlankingMode, AllowExposuresMode)
+getScreenSaver display = outParameters4 id (xGetScreenSaver display)
+foreign import ccall unsafe "HsXlib.h XGetScreenSaver"
+	xGetScreenSaver :: Display -> Ptr Int -> Ptr Int ->
+		Ptr PreferBlankingMode -> Ptr AllowExposuresMode -> IO ()
+
+-- | interface to the X11 library function @XSetScreenSaver()@.
+foreign import ccall unsafe "HsXlib.h XSetScreenSaver"
+	setScreenSaver      :: Display -> Int -> Int ->
+		PreferBlankingMode -> AllowExposuresMode -> IO ()
+
+-- | interface to the X11 library function @XActivateScreenSaver()@.
+foreign import ccall unsafe "HsXlib.h XActivateScreenSaver"
+	activateScreenSaver :: Display -> IO ()
+
+-- | interface to the X11 library function @XResetScreenSaver()@.
+foreign import ccall unsafe "HsXlib.h XResetScreenSaver"
+	resetScreenSaver    :: Display -> IO ()
+
+-- | interface to the X11 library function @XForceScreenSaver()@.
+foreign import ccall unsafe "HsXlib.h XForceScreenSaver"
+	forceScreenSaver    :: Display -> ScreenSaverMode -> IO ()
+
+----------------------------------------------------------------
+-- Pointer
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XGetPointerControl()@.
+getPointerControl :: Display -> IO (Int, Int, Int)
+getPointerControl display = outParameters3 id (xGetPointerControl display)
+foreign import ccall unsafe "HsXlib.h XGetPointerControl"
+	xGetPointerControl :: Display -> Ptr Int -> Ptr Int -> Ptr Int -> IO ()
+
+-- | interface to the X11 library function @XWarpPointer()@.
+foreign import ccall unsafe "HsXlib.h XWarpPointer"
+	warpPointer :: Display -> Window -> Window -> Position -> Position ->
+		Dimension -> Dimension -> Position -> Position -> IO ()
+
+-- XGetPointerMapping omitted
+-- XSetPointerMapping omitted
+
+----------------------------------------------------------------
+-- Visuals
+----------------------------------------------------------------
+
+-- XVisualIDFromVisual omitted
+
+----------------------------------------------------------------
+-- Threads
+----------------------------------------------------------------
+
+-- XInitThreads omitted (leary of thread stuff)
+-- XLockDisplay omitted (leary of thread stuff)
+-- XUnlockDisplay omitted (leary of thread stuff)
+
+----------------------------------------------------------------
+-- Pixmaps
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XCreatePixmap()@.
+foreign import ccall unsafe "HsXlib.h XCreatePixmap"
+	createPixmap :: Display -> Drawable -> Dimension -> Dimension -> Int -> IO Pixmap
+
+-- | interface to the X11 library function @XFreePixmap()@.
+foreign import ccall unsafe "HsXlib.h XFreePixmap"
+	freePixmap :: Display -> Pixmap -> IO ()
+
+-- XCreatePixmapFromBitmapData omitted (type looks strange)
+
+-- %fun XListPixmapFormatValues = res1 = XListPixmapFormatValues(display, &res1_size) :: Display -> ListXPixmapFormatValues
+
+----------------------------------------------------------------
+-- Bitmaps
+----------------------------------------------------------------
+
+-- ToDo: do these need to be available to the programmer?
+-- Maybe I could just wire them into all other operations?
+
+-- | interface to the X11 library function @XBitmapBitOrder()@.
+foreign import ccall unsafe "HsXlib.h XBitmapBitOrder"
+	bitmapBitOrder :: Display -> ByteOrder
+
+-- | interface to the X11 library function @XBitmapUnit()@.
+foreign import ccall unsafe "HsXlib.h XBitmapUnit"
+	bitmapUnit     :: Display -> Int
+
+-- | interface to the X11 library function @XBitmapPad()@.
+foreign import ccall unsafe "HsXlib.h XBitmapPad"
+	bitmapPad      :: Display -> Int
+
+-- ToDo: make sure that initialisation works correctly for x/y_hot
+-- omitted
+-- IMPURE void	XWriteBitmapFile(display, filename, bitmap, width, height, x_hot, y_hot) RAISES Either
+-- RETURNTYPE	BitmapFileStatus
+-- GLOBAL ERROR BitmapFileStatus	RETVAL
+-- IN Display*	display
+-- IN String	filename
+-- IN Pixmap	bitmap
+-- IN Dimension	width
+-- IN Dimension	height
+-- IN Maybe Int	x_hot = -1
+-- IN Maybe Int	y_hot = -1
+-- POST: RETVAL == BitmapSuccess
+
+-- omitted
+-- IMPURE void	XReadBitmapFile(display, d, filename, bitmap, width, height, x_hot, y_hot) RAISES Either
+-- RETURNTYPE	BitmapFileStatus
+-- GLOBAL ERROR BitmapFileStatus	RETVAL
+-- IN Display*	display
+-- IN Drawable	d
+-- IN String	filename
+-- OUT Pixmap	bitmap
+-- OUT Dimension	width
+-- OUT Dimension	height
+-- OUT Int		x_hot RAISES Maybe IF x_hot == -1
+-- OUT Int		y_hot RAISES Maybe IF x_hot == -1
+-- POST: RETVAL == BitmapSuccess
+
+-- XCreateBitmapFromData omitted (awkward looking type)
+-- XReadBitmapFileData omitted (awkward looking type)
+
+----------------------------------------------------------------
+-- Keycodes
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XDisplayKeycodes()@.
+displayKeycodes :: Display -> (Int,Int)
+displayKeycodes display =
+	unsafePerformIO $ outParameters2 id $ xDisplayKeycodes display
+foreign import ccall unsafe "HsXlib.h XDisplayKeycodes"
+	xDisplayKeycodes :: Display -> Ptr Int -> Ptr Int -> IO ()
+
+-- | interface to the X11 library function @XLookupKeysym()@.
+foreign import ccall unsafe "HsXlib.h XLookupKeysym"
+	lookupKeysym    :: XKeyEventPtr -> Int -> IO KeySym
+
+-- | interface to the X11 library function @XKeycodeToKeysym()@.
+foreign import ccall unsafe "HsXlib.h XKeycodeToKeysym"
+	keycodeToKeysym :: Display -> KeyCode -> Int -> IO KeySym
+
+-- | interface to the X11 library function @XKeysymToKeycode()@.
+foreign import ccall unsafe "HsXlib.h XKeysymToKeycode"
+	keysymToKeycode :: Display -> KeySym  -> IO KeyCode
+
+-- | interface to the X11 library function @XKeysymToString()@.
+keysymToString  :: KeySym -> String
+keysymToString keysym = unsafePerformIO $ do
+	c_str <- xKeysymToString keysym
+	peekCString c_str
+foreign import ccall unsafe "HsXlib.h XKeysymToString"
+	xKeysymToString  :: KeySym -> IO CString
+
+-- | interface to the X11 library function @XStringToKeysym()@.
+stringToKeysym  :: String -> KeySym
+stringToKeysym str = unsafePerformIO $
+	withCString str $ \ c_str ->
+	xStringToKeysym c_str
+foreign import ccall unsafe "HsXlib.h XStringToKeysym"
+	xStringToKeysym  :: CString -> IO KeySym
+
+noSymbol :: KeySym
+noSymbol = #{const NoSymbol}
+
+newtype XComposeStatus = XComposeStatus (Ptr XComposeStatus)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+-- XLookupString cannot handle compose, it seems.
+
+-- | interface to the X11 library function @XLookupString()@.
+lookupString :: XKeyEventPtr -> IO (Maybe KeySym, String)
+lookupString event_ptr =
+	allocaBytes 100 $ \ buf ->
+	alloca $ \ keysym_return -> do
+	n <- xLookupString event_ptr buf 100 keysym_return nullPtr
+	str <- peekCStringLen (buf, n)
+	keysym <- peek keysym_return
+	return (if keysym == noSymbol then Nothing else Just keysym, str)
+foreign import ccall unsafe "HsXlib.h XLookupString"
+	xLookupString :: XKeyEventPtr -> CString -> Int ->
+		Ptr KeySym -> Ptr XComposeStatus -> IO Int
+
+-- XQueryKeymap omitted
+-- XRebindKeysym omitted
+-- XDeleteModifiermapEntry omitted
+-- XInsertModifiermapEntry omitted
+-- XNewModifiermap omitted
+-- XFreeModifiermap omitted
+-- XSetModifierMapping omitted
+-- XGetModifierMapping omitted
+-- XGetKeyboardMapping omitted
+
+----------------------------------------------------------------
+-- Image
+----------------------------------------------------------------
+
+-- XCreateImage omitted
+-- XInitImage omitted
+-- XGetImage omitted
+-- XPutImage omitted
+-- XGetSubImage omitted
+
+----------------------------------------------------------------
+-- Icons
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XGetIconName()@.
+getIconName :: Display -> Window -> IO String
+getIconName display w =
+	alloca $ \ icon_name_return -> do
+	throwIfZero "getIconName" $
+		xGetIconName display w icon_name_return
+	c_icon_name <- peek icon_name_return
+	peekCString c_icon_name
+foreign import ccall unsafe "HsXlib.h XGetIconName"
+	xGetIconName :: Display -> Window -> Ptr CString -> IO Status
+
+-- | interface to the X11 library function @XSetIconName()@.
+setIconName :: Display -> Window -> String -> IO ()
+setIconName display w icon_name =
+	withCString icon_name $ \ c_icon_name ->
+	xSetIconName display w c_icon_name
+foreign import ccall unsafe "HsXlib.h XSetIconName"
+	xSetIconName :: Display -> Window -> CString -> IO ()
+
+----------------------------------------------------------------
+-- Cursors
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XDefineCursor()@.
+foreign import ccall unsafe "HsXlib.h XDefineCursor"
+	defineCursor       :: Display -> Window -> Cursor -> IO ()
+
+-- | interface to the X11 library function @XUndefineCursor()@.
+foreign import ccall unsafe "HsXlib.h XUndefineCursor"
+	undefineCursor     :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XCreatePixmapCursor()@.
+createPixmapCursor :: Display -> Pixmap -> Pixmap -> Color -> Color ->
+	Dimension -> Dimension -> IO Cursor
+createPixmapCursor display source mask fg_color bg_color x y =
+	with fg_color $ \ fg_color_ptr ->
+	with bg_color $ \ bg_color_ptr ->
+	xCreatePixmapCursor display source mask fg_color_ptr bg_color_ptr x y
+foreign import ccall unsafe "HsXlib.h XCreatePixmapCursor"
+	xCreatePixmapCursor :: Display -> Pixmap -> Pixmap ->
+		Ptr Color -> Ptr Color -> Dimension -> Dimension -> IO Cursor
+
+-- | interface to the X11 library function @XCreateGlyphCursor()@.
+createGlyphCursor  :: Display -> Font   -> Font -> Glyph -> Glyph ->
+	Color -> Color -> IO Cursor
+createGlyphCursor display source_font mask_font source_char mask_char
+		fg_color bg_color =
+	with fg_color $ \ fg_color_ptr ->
+	with bg_color $ \ bg_color_ptr ->
+	xCreateGlyphCursor display source_font mask_font source_char mask_char
+		fg_color_ptr bg_color_ptr
+foreign import ccall unsafe "HsXlib.h XCreateGlyphCursor"
+	xCreateGlyphCursor  :: Display -> Font   -> Font -> Glyph -> Glyph ->
+		Ptr Color -> Ptr Color -> IO Cursor
+
+-- | interface to the X11 library function @XCreateFontCursor()@.
+foreign import ccall unsafe "HsXlib.h XCreateFontCursor"
+	createFontCursor   :: Display -> Glyph  -> IO Cursor
+
+-- | interface to the X11 library function @XFreeCursor()@.
+foreign import ccall unsafe "HsXlib.h XFreeCursor"
+	freeCursor         :: Display -> Font   -> IO ()
+
+-- | interface to the X11 library function @XRecolorCursor()@.
+recolorCursor      :: Display -> Cursor -> Color -> Color -> IO ()
+recolorCursor display cursor fg_color bg_color =
+	with fg_color $ \ fg_color_ptr ->
+	with bg_color $ \ bg_color_ptr ->
+	xRecolorCursor display cursor fg_color_ptr bg_color_ptr
+foreign import ccall unsafe "HsXlib.h XRecolorCursor"
+	xRecolorCursor      :: Display -> Cursor -> Ptr Color -> Ptr Color -> IO ()
+
+----------------------------------------------------------------
+-- Window Manager stuff
+----------------------------------------------------------------
+
+-- XConfigureWMWindow omitted (can't find documentation)
+-- XReconfigureWMWindow omitted (can't find documentation)
+-- XWMGeometry omitted (can't find documentation)
+-- XGetWMColormapWindows omitted (can't find documentation)
+-- XSetWMColormapWindows omitted (can't find documentation)
+-- XGetWMProtocols omitted
+
+-- AC, 1/9/2000: Added definition for XSetWMProtocols
+
+-- | interface to the X11 library function @XSetWMProtocols()@.
+setWMProtocols :: Display -> Window -> [Atom] -> IO ()
+setWMProtocols display w protocols =
+	withArray protocols $ \ protocol_array ->
+	xSetWMProtocols display w protocol_array (length protocols)
+foreign import ccall unsafe "HsXlib.h XSetWMProtocols"
+	xSetWMProtocols :: Display -> Window -> Ptr Atom -> Int -> IO ()
+
+----------------------------------------------------------------
+-- Set Window Attributes
+----------------------------------------------------------------
+
+-- ToDo: generate this kind of stuff automatically.
+
+allocaSetWindowAttributes :: (Ptr SetWindowAttributes -> IO a) -> IO a
+allocaSetWindowAttributes = allocaBytes #{size XSetWindowAttributes}
+
+---------------- Access to individual fields ----------------
+
+set_background_pixmap :: Ptr SetWindowAttributes -> Pixmap -> IO ()
+set_background_pixmap = #{poke XSetWindowAttributes,background_pixmap}
+
+set_background_pixel :: Ptr SetWindowAttributes -> Pixel -> IO ()
+set_background_pixel = #{poke XSetWindowAttributes,background_pixel}
+
+set_border_pixmap :: Ptr SetWindowAttributes -> Pixmap -> IO ()
+set_border_pixmap = #{poke XSetWindowAttributes,border_pixmap}
+
+set_border_pixel :: Ptr SetWindowAttributes -> Pixel -> IO ()
+set_border_pixel = #{poke XSetWindowAttributes,border_pixel}
+
+set_bit_gravity :: Ptr SetWindowAttributes -> BitGravity -> IO ()
+set_bit_gravity = #{poke XSetWindowAttributes,bit_gravity}
+
+set_win_gravity :: Ptr SetWindowAttributes -> WindowGravity -> IO ()
+set_win_gravity = #{poke XSetWindowAttributes,win_gravity}
+
+set_backing_store :: Ptr SetWindowAttributes -> BackingStore -> IO ()
+set_backing_store = #{poke XSetWindowAttributes,backing_store}
+
+set_backing_planes :: Ptr SetWindowAttributes -> Pixel -> IO ()
+set_backing_planes = #{poke XSetWindowAttributes,backing_planes}
+
+set_backing_pixel :: Ptr SetWindowAttributes -> Pixel -> IO ()
+set_backing_pixel = #{poke XSetWindowAttributes,backing_pixel}
+
+set_save_under :: Ptr SetWindowAttributes -> Bool -> IO ()
+set_save_under = #{poke XSetWindowAttributes,save_under}
+
+set_event_mask :: Ptr SetWindowAttributes -> EventMask -> IO ()
+set_event_mask = #{poke XSetWindowAttributes,event_mask}
+
+set_do_not_propagate_mask :: Ptr SetWindowAttributes -> EventMask -> IO ()
+set_do_not_propagate_mask = #{poke XSetWindowAttributes,do_not_propagate_mask}
+
+set_override_redirect :: Ptr SetWindowAttributes -> Bool -> IO ()
+set_override_redirect = #{poke XSetWindowAttributes,override_redirect}
+
+set_colormap :: Ptr SetWindowAttributes -> Colormap -> IO ()
+set_colormap = #{poke XSetWindowAttributes,colormap}
+
+set_cursor :: Ptr SetWindowAttributes -> Cursor -> IO ()
+set_cursor = #{poke XSetWindowAttributes,cursor}
+
+----------------------------------------------------------------
+-- Drawing
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XDrawPoint()@.
+foreign import ccall unsafe "HsXlib.h XDrawPoint"
+	drawPoint      :: Display -> Drawable -> GC -> Position -> Position -> IO ()
+
+-- | interface to the X11 library function @XDrawPoints()@.
+drawPoints :: Display -> Drawable -> GC -> [Point] -> CoordinateMode -> IO ()
+drawPoints display d gc points mode =
+	withArrayLen points $ \ npoints point_array ->
+	xDrawPoints display d gc point_array npoints mode
+foreign import ccall unsafe "HsXlib.h XDrawPoints"
+	xDrawPoints     :: Display -> Drawable -> GC -> Ptr Point -> Int ->
+				CoordinateMode -> IO ()
+
+-- | interface to the X11 library function @XDrawLine()@.
+foreign import ccall unsafe "HsXlib.h XDrawLine"
+	drawLine       :: Display -> Drawable -> GC -> Position -> Position ->
+				Position -> Position -> IO ()
+
+-- | interface to the X11 library function @XDrawLines()@.
+drawLines :: Display -> Drawable -> GC -> [Point] -> CoordinateMode -> IO ()
+drawLines display d gc points mode =
+	withArrayLen points $ \ npoints point_array ->
+	xDrawLines display d gc point_array npoints mode
+foreign import ccall unsafe "HsXlib.h XDrawLines"
+	xDrawLines      :: Display -> Drawable -> GC -> Ptr Point -> Int ->
+				CoordinateMode -> IO ()
+
+-- | interface to the X11 library function @XDrawSegments()@.
+drawSegments :: Display -> Drawable -> GC -> [Segment] -> IO ()
+drawSegments display d gc segments =
+	withArrayLen segments $ \ nsegments segment_array ->
+	xDrawSegments display d gc segment_array nsegments
+foreign import ccall unsafe "HsXlib.h XDrawSegments"
+	xDrawSegments   :: Display -> Drawable -> GC -> Ptr Segment -> Int -> IO ()
+
+-- | interface to the X11 library function @XDrawRectangle()@.
+foreign import ccall unsafe "HsXlib.h XDrawRectangle"
+	drawRectangle  :: Display -> Drawable -> GC -> Position -> Position -> Dimension -> Dimension -> IO ()
+
+-- | interface to the X11 library function @XDrawRectangles()@.
+drawRectangles :: Display -> Drawable -> GC -> [Rectangle] -> IO ()
+drawRectangles display d gc rectangles =
+	withArrayLen rectangles $ \ nrectangles rectangle_array ->
+	xDrawRectangles display d gc rectangle_array nrectangles
+foreign import ccall unsafe "HsXlib.h XDrawRectangles"
+	xDrawRectangles :: Display -> Drawable -> GC -> Ptr Rectangle -> Int -> IO ()
+
+-- | interface to the X11 library function @XDrawArc()@.
+foreign import ccall unsafe "HsXlib.h XDrawArc"
+	drawArc        :: Display -> Drawable -> GC -> Position -> Position ->
+			Dimension -> Dimension -> Angle -> Angle -> IO ()
+
+-- | interface to the X11 library function @XDrawArcs()@.
+drawArcs :: Display -> Drawable -> GC -> [Arc] -> IO ()
+drawArcs display d gc arcs =
+	withArrayLen arcs $ \ narcs arc_array ->
+	xDrawArcs display d gc arc_array narcs
+foreign import ccall unsafe "HsXlib.h XDrawArcs"
+	xDrawArcs       :: Display -> Drawable -> GC -> Ptr Arc -> Int -> IO ()
+
+-- | interface to the X11 library function @XFillRectangle()@.
+foreign import ccall unsafe "HsXlib.h XFillRectangle"
+	fillRectangle  :: Display -> Drawable -> GC -> Position -> Position ->
+				Dimension -> Dimension -> IO ()
+
+-- | interface to the X11 library function @XFillRectangles()@.
+fillRectangles :: Display -> Drawable -> GC -> [Rectangle] -> IO ()
+fillRectangles display d gc rectangles =
+	withArrayLen rectangles $ \ nrectangles rectangle_array ->
+	xFillRectangles display d gc rectangle_array nrectangles
+foreign import ccall unsafe "HsXlib.h XFillRectangles"
+	xFillRectangles :: Display -> Drawable -> GC -> Ptr Rectangle -> Int -> IO ()
+
+-- | interface to the X11 library function @XFillPolygon()@.
+fillPolygon :: Display -> Drawable -> GC -> [Point] -> PolygonShape -> CoordinateMode -> IO ()
+fillPolygon display d gc points shape mode =
+	withArrayLen points $ \ npoints point_array ->
+	xFillPolygon display d gc point_array npoints shape mode
+foreign import ccall unsafe "HsXlib.h XFillPolygon"
+	xFillPolygon    :: Display -> Drawable -> GC -> Ptr Point -> Int -> PolygonShape -> CoordinateMode -> IO ()
+
+-- | interface to the X11 library function @XFillArc()@.
+foreign import ccall unsafe "HsXlib.h XFillArc"
+	fillArc        :: Display -> Drawable -> GC -> Position -> Position ->
+			Dimension -> Dimension -> Angle -> Angle -> IO ()
+
+-- | interface to the X11 library function @XFillArcs()@.
+fillArcs :: Display -> Drawable -> GC -> [Arc] -> IO ()
+fillArcs display d gc arcs =
+	withArrayLen arcs $ \ narcs arc_array ->
+	xFillArcs display d gc arc_array narcs
+foreign import ccall unsafe "HsXlib.h XFillArcs"
+	xFillArcs       :: Display -> Drawable -> GC -> Ptr Arc -> Int -> IO ()
+
+-- | interface to the X11 library function @XCopyArea()@.
+foreign import ccall unsafe "HsXlib.h XCopyArea"
+	copyArea       :: Display -> Drawable -> Drawable -> GC -> Position -> Position -> Dimension -> Dimension -> Position -> Position -> IO ()
+
+-- | interface to the X11 library function @XCopyPlane()@.
+foreign import ccall unsafe "HsXlib.h XCopyPlane"
+	copyPlane      :: Display -> Drawable -> Drawable -> GC -> Position -> Position -> Dimension -> Dimension -> Position -> Position -> Pixel -> IO ()
+
+-- draw characters over existing background
+
+-- | interface to the X11 library function @XDrawString()@.
+drawString :: Display -> Drawable -> GC -> Position -> Position -> String -> IO ()
+drawString display d gc x y str =
+	withCStringLen str $ \ (c_str, len) ->
+	xDrawString display d gc x y c_str len
+foreign import ccall unsafe "HsXlib.h XDrawString"
+	xDrawString     :: Display -> Drawable -> GC -> Position -> Position -> CString -> Int -> IO ()
+
+-- draw characters over a blank rectangle of current background colour
+
+-- | interface to the X11 library function @XDrawImageString()@.
+drawImageString :: Display -> Drawable -> GC -> Position -> Position -> String -> IO ()
+drawImageString display d gc x y str =
+	withCStringLen str $ \ (c_str, len) ->
+	xDrawImageString display d gc x y c_str len
+foreign import ccall unsafe "HsXlib.h XDrawImageString"
+	xDrawImageString :: Display -> Drawable -> GC -> Position -> Position -> CString -> Int -> IO ()
+
+-- XDrawString16 omitted (16bit chars not supported)
+-- XDrawImageString16 omitted (16bit chars not supported)
+-- XDrawText omitted (XTextItem not supported)
+-- XDrawText16 omitted (XTextItem not supported)
+
+----------------------------------------------------------------
+-- Cut and paste buffers
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XStoreBuffer()@.
+storeBuffer :: Display -> String -> Int -> IO ()
+storeBuffer display bytes buffer =
+	withCStringLen bytes $ \ (c_bytes, nbytes) ->
+	throwIfZero "storeBuffer" $
+		xStoreBuffer display c_bytes nbytes buffer
+foreign import ccall unsafe "HsXlib.h XStoreBuffer"
+	xStoreBuffer :: Display -> CString -> Int -> Int -> IO Status
+
+-- | interface to the X11 library function @XStoreBytes()@.
+storeBytes :: Display -> String -> IO ()
+storeBytes display bytes =
+	withCStringLen bytes $ \ (c_bytes, nbytes) ->
+	throwIfZero "storeBytes" $
+		xStoreBytes display c_bytes nbytes
+foreign import ccall unsafe "HsXlib.h XStoreBytes"
+	xStoreBytes :: Display -> CString -> Int -> IO Status
+
+-- | interface to the X11 library function @XFetchBuffer()@.
+fetchBuffer :: Display -> Int -> IO String
+fetchBuffer display buffer =
+	alloca $ \ nbytes_return -> do
+	c_bytes <- throwIfNull "fetchBuffer" $
+		xFetchBuffer display nbytes_return buffer
+	nbytes <- peek nbytes_return
+	bytes <- peekCStringLen (c_bytes, nbytes)
+	xFree c_bytes
+	return bytes
+foreign import ccall unsafe "HsXlib.h XFetchBuffer"
+	xFetchBuffer :: Display -> Ptr Int -> Int -> IO CString
+
+-- | interface to the X11 library function @XFetchBytes()@.
+fetchBytes :: Display -> IO String
+fetchBytes display =
+	alloca $ \ nbytes_return -> do
+	c_bytes <- throwIfNull "fetchBytes" $
+		xFetchBytes display nbytes_return
+	nbytes <- peek nbytes_return
+	bytes <- peekCStringLen (c_bytes, nbytes)
+	xFree c_bytes
+	return bytes
+foreign import ccall unsafe "HsXlib.h XFetchBytes"
+	xFetchBytes :: Display -> Ptr Int -> IO CString
+
+-- | interface to the X11 library function @XRotateBuffers()@.
+rotateBuffers :: Display -> Int -> IO ()
+rotateBuffers display rotate =
+	throwIfZero "rotateBuffers" $
+		xRotateBuffers display rotate
+foreign import ccall unsafe "HsXlib.h XRotateBuffers"
+	xRotateBuffers :: Display -> Int -> IO Status
+
+----------------------------------------------------------------
+-- Window properties
+----------------------------------------------------------------
+
+newtype XTextProperty = XTextProperty (Ptr XTextProperty)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+-- | interface to the X11 library function @XSetTextProperty()@.
+setTextProperty :: Display -> Window -> String -> Atom -> IO ()
+setTextProperty display w value property =
+	withCStringLen value $ \ (c_value, value_len) ->
+	allocaBytes #{size XTextProperty} $ \ text_prop -> do
+	#{poke XTextProperty,value} text_prop c_value
+	#{poke XTextProperty,encoding} text_prop sTRING
+	#{poke XTextProperty,format} text_prop (8::Int)
+	#{poke XTextProperty,nitems} text_prop (fromIntegral value_len::Word32)
+	xSetTextProperty display w text_prop property
+foreign import ccall unsafe "HsXlib.h XSetTextProperty"
+	xSetTextProperty :: Display -> Window -> Ptr XTextProperty -> Atom -> IO ()
+
+-- %fun XSetStandardProperties :: Display -> Window -> String -> String -> Pixmap -> [String] -> XSizeHints -> IO ()
+-- %code Status err = XSetStandardProperties(arg1,arg2,arg3,arg4,arg5,arg6,arg6_size,&arg7)
+-- %fail { Success != err }{ BadStatus(err,XSetStandardProperties) }
+
+----------------------------------------------------------------
+-- Canned handling of output parameters
+----------------------------------------------------------------
+
+outParameters2 :: (Storable a, Storable b) =>
+	(IO r -> IO ()) -> (Ptr a -> Ptr b -> IO r) -> IO (a,b)
+outParameters2 check fn =
+	alloca $ \ a_return ->
+	alloca $ \ b_return -> do
+	check (fn a_return b_return)
+	a <- peek a_return
+	b <- peek b_return
+	return (a,b)
+
+outParameters3 :: (Storable a, Storable b, Storable c) =>
+	(IO r -> IO ()) -> (Ptr a -> Ptr b -> Ptr c -> IO r) -> IO (a,b,c)
+outParameters3 check fn =
+	alloca $ \ a_return ->
+	alloca $ \ b_return ->
+	alloca $ \ c_return -> do
+	check (fn a_return b_return c_return)
+	a <- peek a_return
+	b <- peek b_return
+	c <- peek c_return
+	return (a,b,c)
+
+outParameters4 :: (Storable a, Storable b, Storable c, Storable d) =>
+	(IO r -> IO ()) -> (Ptr a -> Ptr b -> Ptr c -> Ptr d -> IO r) ->
+	IO (a,b,c,d)
+outParameters4 check fn =
+	alloca $ \ a_return ->
+	alloca $ \ b_return ->
+	alloca $ \ c_return ->
+	alloca $ \ d_return -> do
+	check (fn a_return b_return c_return d_return)
+	a <- peek a_return
+	b <- peek b_return
+	c <- peek c_return
+	d <- peek d_return
+	return (a,b,c,d)
+
+outParameters7 :: (Storable a, Storable b, Storable c, Storable d, Storable e, Storable f, Storable g) =>
+	(IO r -> IO ()) -> (Ptr a -> Ptr b -> Ptr c -> Ptr d -> Ptr e -> Ptr f -> Ptr g -> IO r) ->
+	IO (a,b,c,d,e,f,g)
+outParameters7 check fn =
+	alloca $ \ a_return ->
+	alloca $ \ b_return ->
+	alloca $ \ c_return ->
+	alloca $ \ d_return ->
+	alloca $ \ e_return ->
+	alloca $ \ f_return ->
+	alloca $ \ g_return -> do
+	check (fn a_return b_return c_return d_return e_return f_return g_return)
+	a <- peek a_return
+	b <- peek b_return
+	c <- peek c_return
+	d <- peek d_return
+	e <- peek e_return
+	f <- peek f_return
+	g <- peek g_return
+	return (a,b,c,d,e,f,g)
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Region.hs b/Graphics/X11/Xlib/Region.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Region.hs
@@ -0,0 +1,272 @@
+{-# OPTIONS_GHC -cpp -fglasgow-exts #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Region
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib Regions.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Region(
+        Region,
+
+        RectInRegionResult,
+        rectangleOut,
+        rectangleIn,
+        rectanglePart,
+
+        createRegion,
+        polygonRegion,
+        intersectRegion,
+        subtractRegion,
+        unionRectWithRegion,
+        unionRegion,
+        xorRegion,
+        emptyRegion,
+        equalRegion,
+        pointInRegion,
+        rectInRegion,
+        clipBox,
+        offsetRegion,
+        shrinkRegion,
+        setRegion,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+
+import Foreign.ForeignPtr
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Array
+import Foreign.Marshal.Utils
+
+#if __GLASGOW_HASKELL__
+import Data.Generics
+#endif
+
+----------------------------------------------------------------
+-- Regions
+----------------------------------------------------------------
+
+newtype Region = Region (ForeignPtr Region)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+withRegion :: Region -> (Ptr Region -> IO a) -> IO a
+withRegion (Region r) = withForeignPtr r
+
+type RectInRegionResult = Int
+
+-- Return values from XRectInRegion()
+rectangleOut, rectangleIn, rectanglePart :: RectInRegionResult
+rectangleOut  = 0
+rectangleIn   = 1
+rectanglePart = 2
+
+----------------------------------------------------------------
+-- Creating regions
+----------------------------------------------------------------
+
+-- regions deallocation is handled by the GC (ForeignPtr magic)
+-- so we don't provide XDestroyRegion explicitly
+-- no idea what the int is for
+-- %fun XDestroyRegion :: Region -> IO Int
+foreign import ccall unsafe "HsXlib.h &XDestroyRegion"
+        xDestroyRegionPtr :: FunPtr (Ptr Region -> IO ())
+
+makeRegion :: Ptr Region -> IO Region
+makeRegion rp = do
+	r <- newForeignPtr xDestroyRegionPtr rp
+	return (Region r)
+
+-- an empty region
+-- (often used as "out argument" to binary operators which return regions)
+
+-- | interface to the X11 library function @XCreateRegion()@.
+createRegion :: IO Region
+createRegion = do
+	rp <- xCreateRegion
+	makeRegion rp
+foreign import ccall unsafe "HsXlib.h XCreateRegion"
+        xCreateRegion :: IO (Ptr Region)
+
+-- | interface to the X11 library function @XPolygonRegion()@.
+polygonRegion :: [Point] -> FillRule -> IO Region
+polygonRegion points fill_rule =
+	withArrayLen points $ \ n point_arr -> do
+	rp <- xPolygonRegion point_arr n fill_rule
+	makeRegion rp
+foreign import ccall unsafe "HsXlib.h XPolygonRegion"
+	xPolygonRegion :: Ptr Point -> Int -> FillRule -> IO (Ptr Region)
+
+----------------------------------------------------------------
+-- Combining Regions
+--
+-- The usual shoddy state of Xlib documentation fails to mention
+-- what the Int is for.
+--
+-- All operations overwrite the region in their third argument
+-- which is usually a freshly created region.
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XIntersectRegion()@.
+intersectRegion     :: Region -> Region -> Region -> IO Int
+intersectRegion src1 src2 dest =
+	withRegion src1 $ \ src1_ptr ->
+	withRegion src2 $ \ src2_ptr ->
+	withRegion dest $ \ dest_ptr ->
+	xIntersectRegion src1_ptr src2_ptr dest_ptr
+foreign import ccall unsafe
+	"HsXlib.h XIntersectRegion" xIntersectRegion ::
+	Ptr Region -> Ptr Region -> Ptr Region -> IO Int
+
+-- | interface to the X11 library function @XSubtractRegion()@.
+subtractRegion     :: Region -> Region -> Region -> IO Int
+subtractRegion src1 src2 dest =
+	withRegion src1 $ \ src1_ptr ->
+	withRegion src2 $ \ src2_ptr ->
+	withRegion dest $ \ dest_ptr ->
+	xSubtractRegion src1_ptr src2_ptr dest_ptr
+foreign import ccall unsafe
+	"HsXlib.h XSubtractRegion" xSubtractRegion ::
+	Ptr Region -> Ptr Region -> Ptr Region -> IO Int
+
+-- | interface to the X11 library function @XUnionRectWithRegion()@.
+unionRectWithRegion     :: Rectangle -> Region -> Region -> IO Int
+unionRectWithRegion rect src dest =
+	with rect $ \ rect_ptr ->
+	withRegion src $ \ src_ptr ->
+	withRegion dest $ \ dest_ptr ->
+	xUnionRectWithRegion rect_ptr src_ptr dest_ptr
+foreign import ccall unsafe
+	"HsXlib.h XUnionRectWithRegion" xUnionRectWithRegion ::
+	Ptr Rectangle -> Ptr Region -> Ptr Region -> IO Int
+
+-- | interface to the X11 library function @XUnionRegion()@.
+unionRegion     :: Region -> Region -> Region -> IO Int
+unionRegion src1 src2 dest =
+	withRegion src1 $ \ src1_ptr ->
+	withRegion src2 $ \ src2_ptr ->
+	withRegion dest $ \ dest_ptr ->
+	xUnionRegion src1_ptr src2_ptr dest_ptr
+foreign import ccall unsafe
+	"HsXlib.h XUnionRegion" xUnionRegion ::
+	Ptr Region -> Ptr Region -> Ptr Region -> IO Int
+
+-- | interface to the X11 library function @XXorRegion()@.
+xorRegion     :: Region -> Region -> Region -> IO Int
+xorRegion src1 src2 dest =
+	withRegion src1 $ \ src1_ptr ->
+	withRegion src2 $ \ src2_ptr ->
+	withRegion dest $ \ dest_ptr ->
+	xXorRegion src1_ptr src2_ptr dest_ptr
+foreign import ccall unsafe
+	"HsXlib.h XXorRegion" xXorRegion ::
+	Ptr Region -> Ptr Region -> Ptr Region -> IO Int
+
+----------------------------------------------------------------
+-- Examining regions (tests, bounding boxes, etc)
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XEmptyRegion()@.
+emptyRegion :: Region -> IO Bool
+emptyRegion r = withRegion r xEmptyRegion
+foreign import ccall unsafe "HsXlib.h XEmptyRegion"
+	xEmptyRegion :: Ptr Region -> IO Bool
+
+-- | interface to the X11 library function @XEqualRegion()@.
+equalRegion :: Region -> Region -> IO Bool
+equalRegion r1 r2 =
+	withRegion r1 $ \ rp1 ->
+	withRegion r2 $ \ rp2 ->
+	xEqualRegion rp1 rp2
+foreign import ccall unsafe "HsXlib.h XEqualRegion"
+	xEqualRegion :: Ptr Region -> Ptr Region -> IO Bool
+
+-- | interface to the X11 library function @XPointInRegion()@.
+pointInRegion :: Region -> Point -> IO Bool
+pointInRegion r (Point x y) =
+	withRegion r $ \ rp ->
+	xPointInRegion rp x y
+foreign import ccall unsafe "HsXlib.h XPointInRegion"
+	xPointInRegion :: Ptr Region -> Position -> Position -> IO Bool
+
+-- | interface to the X11 library function @XRectInRegion()@.
+rectInRegion :: Region -> Rectangle -> IO RectInRegionResult
+rectInRegion r (Rectangle x y w h) =
+	withRegion r $ \ rp ->
+	xRectInRegion rp x y w h
+foreign import ccall unsafe "HsXlib.h XRectInRegion"
+	xRectInRegion :: Ptr Region -> Position -> Position ->
+		Dimension -> Dimension -> IO RectInRegionResult
+
+-- I have no idea what the int is for
+
+-- | interface to the X11 library function @XClipBox()@.
+clipBox :: Region -> IO (Rectangle,Int)
+clipBox r =
+	withRegion r $ \ rp ->
+	alloca $ \ rect_ptr -> do
+	res <- xClipBox rp rect_ptr
+	rect <- peek rect_ptr
+	return (rect, res)
+foreign import ccall unsafe "HsXlib.h XClipBox"
+	xClipBox :: Ptr Region -> Ptr Rectangle -> IO Int
+
+----------------------------------------------------------------
+-- Modifying regions
+-- (If you use any of these, you can't make regions look like
+--  first class data structures.)
+----------------------------------------------------------------
+
+-- translate region
+
+-- | interface to the X11 library function @XOffsetRegion()@.
+offsetRegion :: Region -> Point -> IO Int
+offsetRegion r (Point x y) =
+	withRegion r $ \ rp ->
+	xOffsetRegion rp x y
+foreign import ccall unsafe "HsXlib.h XOffsetRegion"
+	xOffsetRegion :: Ptr Region -> Position -> Position -> IO Int
+
+-- increase size of region by +ve or -ve number of pixels
+-- while preserving the centre of the region (ie half the pixels
+-- come off the left, and half off the right)
+
+-- | interface to the X11 library function @XShrinkRegion()@.
+shrinkRegion :: Region -> Point -> IO Int
+shrinkRegion r (Point x y) =
+	withRegion r $ \ rp ->
+	xShrinkRegion rp x y
+foreign import ccall unsafe "HsXlib.h XShrinkRegion"
+	xShrinkRegion :: Ptr Region -> Position -> Position -> IO Int
+
+----------------------------------------------------------------
+-- Graphics Context
+----------------------------------------------------------------
+
+-- set clip mask of GC
+
+-- | interface to the X11 library function @XSetRegion()@.
+setRegion :: Display -> GC -> Region -> IO Int
+setRegion disp gc r =
+	withRegion r $ \ rp ->
+	xSetRegion disp gc rp
+foreign import ccall unsafe "HsXlib.h XSetRegion"
+	xSetRegion :: Display -> GC -> Ptr Region -> IO Int
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Screen.hs b/Graphics/X11/Xlib/Screen.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Screen.hs
@@ -0,0 +1,132 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Screen
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib Screens.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Screen(
+
+        blackPixelOfScreen,
+        whitePixelOfScreen,
+        cellsOfScreen,
+        defaultColormapOfScreen,
+        defaultDepthOfScreen,
+        defaultGCOfScreen,
+        defaultVisualOfScreen,
+        doesBackingStore,
+        doesSaveUnders,
+        displayOfScreen,
+        eventMaskOfScreen,
+        minCmapsOfScreen,
+        maxCmapsOfScreen,
+        rootWindowOfScreen,
+        widthOfScreen,
+        widthMMOfScreen,
+        heightOfScreen,
+        heightMMOfScreen,
+        planesOfScreen,
+        screenNumberOfScreen,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+
+----------------------------------------------------------------
+-- Screen
+----------------------------------------------------------------
+
+-- Many flags assumed to be PURE.
+
+-- | interface to the X11 library function @XBlackPixelOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XBlackPixelOfScreen"
+	blackPixelOfScreen      :: Screen -> Pixel
+
+-- | interface to the X11 library function @XWhitePixelOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XWhitePixelOfScreen"
+	whitePixelOfScreen      :: Screen -> Pixel
+
+-- | interface to the X11 library function @XCellsOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XCellsOfScreen"
+	cellsOfScreen           :: Screen -> Int
+
+-- | interface to the X11 library function @XDefaultColormapOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XDefaultColormapOfScreen"
+	defaultColormapOfScreen :: Screen -> Colormap
+
+-- | interface to the X11 library function @XDefaultDepthOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XDefaultDepthOfScreen"
+	defaultDepthOfScreen    :: Screen -> Int
+
+-- | interface to the X11 library function @XDefaultGCOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XDefaultGCOfScreen"
+	defaultGCOfScreen       :: Screen -> GC
+
+-- | interface to the X11 library function @XDefaultVisualOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XDefaultVisualOfScreen"
+	defaultVisualOfScreen   :: Screen -> Visual
+
+-- | interface to the X11 library function @XDoesBackingStore()@.
+foreign import ccall unsafe "HsXlib.h XDoesBackingStore"
+	doesBackingStore        :: Screen -> Bool
+
+-- | interface to the X11 library function @XDoesSaveUnders()@.
+foreign import ccall unsafe "HsXlib.h XDoesSaveUnders"
+	doesSaveUnders          :: Screen -> Bool
+
+-- | interface to the X11 library function @XDisplayOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XDisplayOfScreen"
+	displayOfScreen         :: Screen -> Display
+
+-- | interface to the X11 library function @XEventMaskOfScreen()@.
+-- Event mask at connection setup time - not current event mask!
+foreign import ccall unsafe "HsXlib.h XEventMaskOfScreen"
+	eventMaskOfScreen       :: Screen -> EventMask
+
+-- | interface to the X11 library function @XMinCmapsOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XMinCmapsOfScreen"
+	minCmapsOfScreen        :: Screen -> Int
+
+-- | interface to the X11 library function @XMaxCmapsOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XMaxCmapsOfScreen"
+	maxCmapsOfScreen        :: Screen -> Int
+
+-- | interface to the X11 library function @XRootWindowOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XRootWindowOfScreen"
+	rootWindowOfScreen      :: Screen -> Window
+
+-- | interface to the X11 library function @XWidthOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XWidthOfScreen"
+	widthOfScreen           :: Screen -> Dimension
+
+-- | interface to the X11 library function @XWidthMMOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XWidthMMOfScreen"
+	widthMMOfScreen         :: Screen -> Dimension
+
+-- | interface to the X11 library function @XHeightOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XHeightOfScreen"
+	heightOfScreen          :: Screen -> Dimension
+
+-- | interface to the X11 library function @XHeightMMOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XHeightMMOfScreen"
+	heightMMOfScreen        :: Screen -> Dimension
+
+-- | interface to the X11 library function @XPlanesOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XPlanesOfScreen"
+	planesOfScreen          :: Screen -> Int
+
+-- | interface to the X11 library function @XScreenNumberOfScreen()@.
+foreign import ccall unsafe "HsXlib.h XScreenNumberOfScreen"
+	screenNumberOfScreen    :: Screen -> ScreenNumber
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Types.hsc b/Graphics/X11/Xlib/Types.hsc
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Types.hsc
@@ -0,0 +1,293 @@
+{-# OPTIONS_GHC -fglasgow-exts #-}
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Types
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of type declarations for interfacing with Xlib.
+--
+-----------------------------------------------------------------------------
+
+-- #hide
+module Graphics.X11.Xlib.Types(
+	Display(..), Screen, Visual, GC, GCValues, SetWindowAttributes,
+	Point(..), Rectangle(..), Arc(..), Segment(..), Color(..),
+	Pixel, Position, Dimension, Angle, ScreenNumber, Buffer
+        ) where
+
+import Control.Monad( zipWithM_ )
+import Data.Int
+import Data.Word
+import Foreign.C.Types
+import Foreign.Marshal.Alloc( allocaBytes )
+import Foreign.Ptr
+import Foreign.Storable( Storable(..) )
+
+#if __GLASGOW_HASKELL__
+import Data.Generics
+#endif
+
+#include "HsXlib.h"
+
+----------------------------------------------------------------
+-- Types
+----------------------------------------------------------------
+
+-- | pointer to an X11 @Display@ structure
+newtype Display    = Display    (Ptr Display)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+-- | pointer to an X11 @Screen@ structure
+newtype Screen     = Screen     (Ptr Screen)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+-- | pointer to an X11 @Visual@ structure
+newtype Visual     = Visual     (Ptr Visual)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+-- | pointer to an X11 @GC@ structure
+newtype GC         = GC         (Ptr GC)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+-- | pointer to an X11 @XGCValues@ structure
+newtype GCValues   = GCValues  (Ptr GCValues)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+-- | pointer to an X11 @XSetWindowAttributes@ structure
+newtype SetWindowAttributes = SetWindowAttributes (Ptr SetWindowAttributes)
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Ord, Show, Typeable, Data)
+#else
+	deriving (Eq, Ord, Show)
+#endif
+
+type Pixel         = #{type unsigned long}
+type Position      = #{type int}
+type Dimension     = #{type unsigned int}
+type Angle         = Int
+type ScreenNumber  = Word32
+type Buffer        = Int
+
+----------------------------------------------------------------
+-- Short forms used in structs
+----------------------------------------------------------------
+
+type ShortPosition = CShort
+type ShortDimension = CUShort
+type ShortAngle    = CShort
+
+peekPositionField :: Ptr a -> Int -> IO Position
+peekPositionField ptr off = do
+	v <- peekByteOff ptr off
+	return (fromIntegral (v::ShortPosition))
+
+peekDimensionField :: Ptr a -> Int -> IO Dimension
+peekDimensionField ptr off = do
+	v <- peekByteOff ptr off
+	return (fromIntegral (v::ShortDimension))
+
+peekAngleField :: Ptr a -> Int -> IO Angle
+peekAngleField ptr off = do
+	v <- peekByteOff ptr off
+	return (fromIntegral (v::ShortAngle))
+
+pokePositionField :: Ptr a -> Int -> Position -> IO ()
+pokePositionField ptr off v =
+	pokeByteOff ptr off (fromIntegral v::ShortPosition)
+
+pokeDimensionField :: Ptr a -> Int -> Dimension -> IO ()
+pokeDimensionField ptr off v =
+	pokeByteOff ptr off (fromIntegral v::ShortDimension)
+
+pokeAngleField :: Ptr a -> Int -> Angle -> IO ()
+pokeAngleField ptr off v =
+	pokeByteOff ptr off (fromIntegral v::ShortAngle)
+
+----------------------------------------------------------------
+-- Point
+----------------------------------------------------------------
+
+-- | counterpart of an X11 @XPoint@ structure
+data Point = Point { pt_x :: Position, pt_y :: Position }
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Show, Typeable, Data)
+#else
+	deriving (Eq, Show)
+#endif
+
+instance Storable Point where
+	sizeOf _ = #{size XPoint}
+	alignment _ = alignment (undefined::CInt)
+	peek p = do
+		x <- peekPositionField p #{offset XPoint,x}
+		y <- peekPositionField p #{offset XPoint,y}
+		return (Point x y)
+	poke p (Point x y) = do
+		pokePositionField p #{offset XPoint,x} x
+		pokePositionField p #{offset XPoint,y} y
+
+----------------------------------------------------------------
+-- Rectangle
+----------------------------------------------------------------
+
+-- | counterpart of an X11 @XRectangle@ structure
+data Rectangle = Rectangle {
+	rect_x :: Position,
+	rect_y :: Position,
+	rect_width :: Dimension,
+	rect_height :: Dimension
+	}
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Show, Typeable, Data)
+#else
+	deriving (Eq, Show)
+#endif
+
+instance Storable Rectangle where
+	sizeOf _ = #{size XRectangle}
+	alignment _ = alignment (undefined::CInt)
+	peek p = do
+		x	<- peekPositionField p #{offset XRectangle,x}
+		y	<- peekPositionField p #{offset XRectangle,y}
+		width	<- peekDimensionField p #{offset XRectangle,width}
+		height	<- peekDimensionField p #{offset XRectangle,height}
+		return (Rectangle x y width height)
+	poke p (Rectangle x y width height) = do
+		pokePositionField p #{offset XRectangle,x} x
+		pokePositionField p #{offset XRectangle,y} y
+		pokeDimensionField p #{offset XRectangle,width} width
+		pokeDimensionField p #{offset XRectangle,height} height
+
+----------------------------------------------------------------
+-- Arc
+----------------------------------------------------------------
+
+-- | counterpart of an X11 @XArc@ structure
+data Arc = Arc {
+	arc_x :: Position,
+	arc_y :: Position,
+	arc_width :: Dimension,
+	arc_height :: Dimension,
+	arc_angle1 :: Angle,
+	arc_angle2 :: Angle
+	}
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Show, Typeable, Data)
+#else
+	deriving (Eq, Show)
+#endif
+
+instance Storable Arc where
+	sizeOf _ = #{size XArc}
+	alignment _ = alignment (undefined::CInt)
+	peek p = do
+		x	<- peekPositionField p #{offset XArc,x}
+		y	<- peekPositionField p #{offset XArc,y}
+		width	<- peekDimensionField p #{offset XArc,width}
+		height	<- peekDimensionField p #{offset XArc,height}
+		angle1	<- peekAngleField p #{offset XArc,angle1}
+		angle2	<- peekAngleField p #{offset XArc,angle2}
+		return (Arc x y width height angle1 angle2)
+	poke p (Arc x y width height angle1 angle2) = do
+		pokePositionField p #{offset XArc,x} x
+		pokePositionField p #{offset XArc,y} y
+		pokeDimensionField p #{offset XArc,width} width
+		pokeDimensionField p #{offset XArc,height} height
+		pokeAngleField p #{offset XArc,angle1} angle1
+		pokeAngleField p #{offset XArc,angle2} angle2
+
+----------------------------------------------------------------
+-- Segment
+----------------------------------------------------------------
+
+-- | counterpart of an X11 @XSegment@ structure
+data Segment = Segment {
+	seg_x1 :: Position,
+	seg_y1 :: Position,
+	seg_x2 :: Position,
+	seg_y2 :: Position
+	}
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Show, Typeable, Data)
+#else
+	deriving (Eq, Show)
+#endif
+
+instance Storable Segment where
+	sizeOf _ = #{size XSegment}
+	alignment _ = alignment (undefined::CInt)
+	peek p = do
+		x1 <- peekPositionField p #{offset XSegment,x1}
+		y1 <- peekPositionField p #{offset XSegment,y1}
+		x2 <- peekPositionField p #{offset XSegment,x2}
+		y2 <- peekPositionField p #{offset XSegment,y2}
+		return (Segment x1 y1 x2 y2)
+	poke p (Segment x1 y1 x2 y2) = do
+		pokePositionField p #{offset XSegment,x1} x1
+		pokePositionField p #{offset XSegment,y1} y1
+		pokePositionField p #{offset XSegment,x2} x2
+		pokePositionField p #{offset XSegment,y2} y2
+
+----------------------------------------------------------------
+-- Color
+----------------------------------------------------------------
+
+-- | counterpart of an X11 @XColor@ structure
+data Color = Color {
+	color_pixel :: Pixel,
+	color_red :: Word16,
+	color_green :: Word16,
+	color_blue :: Word16,
+	color_flags :: Word8
+	}
+#if __GLASGOW_HASKELL__
+	deriving (Eq, Show, Typeable, Data)
+#else
+	deriving (Eq, Show)
+#endif
+
+instance Storable Color where
+	sizeOf _ = #{size XColor}
+	alignment _ = alignment (undefined::CInt)
+	peek p = do
+		pixel	<- #{peek XColor,pixel}	p
+		red	<- #{peek XColor,red}	p
+		green	<- #{peek XColor,green}	p
+		blue	<- #{peek XColor,blue}	p
+		flags	<- #{peek XColor,flags}	p
+		return (Color pixel red green blue flags)
+	poke p (Color pixel red green blue flags) = do
+		#{poke XColor,pixel}	p pixel
+		#{poke XColor,red}	p red
+		#{poke XColor,green}	p green
+		#{poke XColor,blue}	p blue
+		#{poke XColor,flags}	p flags
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/Graphics/X11/Xlib/Window.hs b/Graphics/X11/Xlib/Window.hs
new file mode 100644
--- /dev/null
+++ b/Graphics/X11/Xlib/Window.hs
@@ -0,0 +1,277 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  Graphics.X11.Xlib.Window
+-- Copyright   :  (c) Alastair Reid, 1999-2003
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+--
+-- Maintainer  :  libraries@haskell.org
+-- Stability   :  provisional
+-- Portability :  portable
+--
+-- A collection of FFI declarations for interfacing with Xlib Windows.
+--
+-----------------------------------------------------------------------------
+
+module Graphics.X11.Xlib.Window(
+        storeName,
+        createSimpleWindow,
+        createWindow,
+        translateCoordinates,
+        moveResizeWindow,
+        resizeWindow,
+        moveWindow,
+        reparentWindow,
+        mapSubwindows,
+        unmapSubwindows,
+        mapWindow,
+        lowerWindow,
+        raiseWindow,
+        circulateSubwindowsDown,
+        circulateSubwindowsUp,
+        circulateSubwindows,
+        iconifyWindow,
+        withdrawWindow,
+        destroyWindow,
+        destroySubwindows,
+        setWindowBorder,
+        setWindowBorderPixmap,
+        setWindowBorderWidth,
+        setWindowBackground,
+        setWindowBackgroundPixmap,
+        setWindowColormap,
+        addToSaveSet,
+        removeFromSaveSet,
+        changeSaveSet,
+        clearWindow,
+        clearArea,
+        restackWindows,
+
+        ) where
+
+import Graphics.X11.Types
+import Graphics.X11.Xlib.Types
+
+import Foreign
+import Foreign.C
+
+----------------------------------------------------------------
+-- Windows
+----------------------------------------------------------------
+
+-- | interface to the X11 library function @XStoreName()@.
+storeName :: Display -> Window -> String -> IO ()
+storeName display window name =
+	withCString name $ \ c_name ->
+	xStoreName display window c_name
+foreign import ccall unsafe "HsXlib.h XStoreName"
+	xStoreName :: Display -> Window -> CString -> IO ()
+
+-- | interface to the X11 library function @XCreateSimpleWindow()@.
+foreign import ccall unsafe "HsXlib.h XCreateSimpleWindow"
+	createSimpleWindow :: Display -> Window -> Position -> Position ->
+		Dimension -> Dimension -> Int -> Pixel -> Pixel -> IO Window
+
+-- | interface to the X11 library function @XCreateWindow()@.
+foreign import ccall unsafe "HsXlib.h XCreateWindow"
+	createWindow :: Display -> Window -> Position -> Position ->
+		Dimension -> Dimension -> Int -> Int -> WindowClass ->
+		Visual -> AttributeMask -> Ptr SetWindowAttributes -> IO Window
+
+----------------------------------------------------------------
+
+--ToDo: find an effective way to use Maybes
+
+-- | interface to the X11 library function @XTranslateCoordinates()@.
+translateCoordinates :: Display -> Window -> Window -> Position -> Position ->
+	IO (Bool,Position,Position,Window)
+translateCoordinates display src_w dest_w src_x src_y =
+	alloca $ \ dest_x_return ->
+	alloca $ \ dest_y_return ->
+	alloca $ \ child_return -> do
+	res <- xTranslateCoordinates display src_w dest_w src_x src_y
+			dest_x_return dest_y_return child_return
+	dest_x <- peek dest_x_return
+	dest_y <- peek dest_y_return
+	child  <- peek child_return
+	return (res, dest_x, dest_y, child)
+foreign import ccall unsafe "HsXlib.h XTranslateCoordinates"
+	xTranslateCoordinates :: Display -> Window -> Window ->
+		Position -> Position ->
+		Ptr Position -> Ptr Position -> Ptr Window -> IO Bool
+
+-- | interface to the X11 library function @XMoveResizeWindow()@.
+foreign import ccall unsafe "HsXlib.h XMoveResizeWindow"
+	moveResizeWindow             :: Display -> Window -> Position  -> Position  -> Dimension -> Dimension -> IO ()
+
+-- | interface to the X11 library function @XResizeWindow()@.
+foreign import ccall unsafe "HsXlib.h XResizeWindow"
+	resizeWindow                 :: Display -> Window -> Dimension -> Dimension -> IO ()
+
+-- | interface to the X11 library function @XMoveWindow()@.
+foreign import ccall unsafe "HsXlib.h XMoveWindow"
+	moveWindow                   :: Display -> Window -> Position  -> Position  -> IO ()
+
+-- | interface to the X11 library function @XReparentWindow()@.
+foreign import ccall unsafe "HsXlib.h XReparentWindow"
+	reparentWindow               :: Display -> Window -> Window -> Position -> Position  -> IO ()
+
+-- | interface to the X11 library function @XMapSubwindows()@.
+foreign import ccall unsafe "HsXlib.h XMapSubwindows"
+	mapSubwindows                :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XUnmapSubwindows()@.
+foreign import ccall unsafe "HsXlib.h XUnmapSubwindows"
+	unmapSubwindows              :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XMapWindow()@.
+foreign import ccall unsafe "HsXlib.h XMapWindow"
+	mapWindow                    :: Display -> Window -> IO ()
+-- Disnae exist: %fun XUnmapWindows                :: Display -> Window -> IO ()
+-- Disnae exist: %fun XMapRaisedWindow             :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XLowerWindow()@.
+foreign import ccall unsafe "HsXlib.h XLowerWindow"
+	lowerWindow                  :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XRaiseWindow()@.
+foreign import ccall unsafe "HsXlib.h XRaiseWindow"
+	raiseWindow                  :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XCirculateSubwindowsDown()@.
+foreign import ccall unsafe "HsXlib.h XCirculateSubwindowsDown"
+	circulateSubwindowsDown      :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XCirculateSubwindowsUp()@.
+foreign import ccall unsafe "HsXlib.h XCirculateSubwindowsUp"
+	circulateSubwindowsUp        :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XCirculateSubwindows()@.
+foreign import ccall unsafe "HsXlib.h XCirculateSubwindows"
+	circulateSubwindows          :: Display -> Window -> CirculationDirection -> IO ()
+
+-- | interface to the X11 library function @XIconifyWindow()@.
+iconifyWindow  :: Display -> Window -> ScreenNumber -> IO ()
+iconifyWindow display window screenno =
+	throwIfZero "iconifyWindow"
+		(xIconifyWindow display window screenno)
+foreign import ccall unsafe "HsXlib.h XIconifyWindow"
+	xIconifyWindow  :: Display -> Window -> ScreenNumber -> IO Status
+
+-- | interface to the X11 library function @XWithdrawWindow()@.
+withdrawWindow :: Display -> Window -> ScreenNumber -> IO ()
+withdrawWindow display window screenno =
+	throwIfZero "withdrawWindow"
+		(xWithdrawWindow display window screenno)
+foreign import ccall unsafe "HsXlib.h XWithdrawWindow"
+	xWithdrawWindow :: Display -> Window -> ScreenNumber -> IO Status
+
+-- | interface to the X11 library function @XDestroyWindow()@.
+foreign import ccall unsafe "HsXlib.h XDestroyWindow"
+	destroyWindow                :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XDestroySubwindows()@.
+foreign import ccall unsafe "HsXlib.h XDestroySubwindows"
+	destroySubwindows            :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XSetWindowBorder()@.
+foreign import ccall unsafe "HsXlib.h XSetWindowBorder"
+	setWindowBorder              :: Display -> Window -> Pixel     -> IO ()
+
+-- | interface to the X11 library function @XSetWindowBorderPixmap()@.
+foreign import ccall unsafe "HsXlib.h XSetWindowBorderPixmap"
+	setWindowBorderPixmap        :: Display -> Window -> Pixmap    -> IO ()
+
+-- | interface to the X11 library function @XSetWindowBorderWidth()@.
+foreign import ccall unsafe "HsXlib.h XSetWindowBorderWidth"
+	setWindowBorderWidth         :: Display -> Window -> Dimension -> IO ()
+
+-- | interface to the X11 library function @XSetWindowBackground()@.
+foreign import ccall unsafe "HsXlib.h XSetWindowBackground"
+	setWindowBackground          :: Display -> Window -> Pixel     -> IO ()
+
+-- | interface to the X11 library function @XSetWindowBackgroundPixmap()@.
+foreign import ccall unsafe "HsXlib.h XSetWindowBackgroundPixmap"
+	setWindowBackgroundPixmap    :: Display -> Window -> Pixmap    -> IO ()
+
+-- | interface to the X11 library function @XSetWindowColormap()@.
+foreign import ccall unsafe "HsXlib.h XSetWindowColormap"
+	setWindowColormap            :: Display -> Window -> Colormap  -> IO ()
+
+-- | interface to the X11 library function @XAddToSaveSet()@.
+foreign import ccall unsafe "HsXlib.h XAddToSaveSet"
+	addToSaveSet                 :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XRemoveFromSaveSet()@.
+foreign import ccall unsafe "HsXlib.h XRemoveFromSaveSet"
+	removeFromSaveSet            :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XChangeSaveSet()@.
+foreign import ccall unsafe "HsXlib.h XChangeSaveSet"
+	changeSaveSet                :: Display -> Window -> ChangeSaveSetMode -> IO ()
+
+-- | interface to the X11 library function @XClearWindow()@.
+foreign import ccall unsafe "HsXlib.h XClearWindow"
+	clearWindow                  :: Display -> Window -> IO ()
+
+-- | interface to the X11 library function @XClearArea()@.
+foreign import ccall unsafe "HsXlib.h XClearArea"
+	clearArea                    :: Display -> Window ->
+		Position -> Position -> Dimension -> Dimension -> Bool -> IO ()
+
+-- This is almost good enough - but doesn't call XFree
+-- -- %errfun BadStatus XQueryTree :: Display -> Window -> IO (Window, Window, ListWindow) using err = XQueryTree(arg1,arg2,&res1,&res2,&res3,&res3_size)
+-- %prim XQueryTree :: Display -> Window -> IO (Window, Window, ListWindow)
+-- Window root_w, parent;
+-- Int children_size;
+-- Window *children;
+-- Status r = XQueryTree(arg1,arg2,&root_w, &parent, &children, &children_size);
+-- if (Success != r) { %failWith(BadStatus,r); }
+-- %update(root_w,parent,children);
+-- XFree(children);
+-- return;
+
+-- | interface to the X11 library function @XRestackWindows()@.
+restackWindows :: Display -> [Window] -> IO ()
+restackWindows display windows =
+	withArray windows $ \ window_array ->
+	xRestackWindows display window_array (length windows)
+foreign import ccall unsafe "HsXlib.h XRestackWindows"
+	xRestackWindows :: Display -> Ptr Window -> Int -> IO ()
+
+-- ToDo: I want to be able to write this
+-- -- %fun XListInstalledColormaps :: Display -> Window -> IO ListColormap using res1 = XListInstalledColormaps(arg1,arg2,&res1_size)
+-- -- But I have to write this instead - need to add a notion of cleanup code!
+-- %prim XListInstalledColormaps :: Display -> Window -> IO ListColormap
+-- Int r_size;
+-- Colormap* r = XListInstalledColormaps(arg1,arg2,&r_size);
+-- %update(r);
+-- XFree(r);
+-- return;
+--
+-- -- Again, this is almost good enough
+-- -- %errfun BadStatus XGetCommand :: Display -> Window -> IO ListString using err = XGetCommand(arg1,arg2,&res1,&res1_size)
+-- -- but not quite
+-- -- %prim XGetCommand :: Display -> Window -> IO ListString
+-- --Int    argv_size;
+-- --String *argv;
+-- --Status r = XGetCommand(arg1,arg2,&argv,&argv_size);
+-- --if (Success != r) { %failWith(BadStatus, r); }
+-- -- %update(argv);
+-- --XFreeStringList(argv);
+-- --return;
+--
+-- -- %fun XSetCommand :: Display -> Window -> ListString -> IO ()            using XSetCommand(arg1,arg2,arg3,res3_size)
+--
+-- %errfun BadStatus XGetTransientForHint :: Display -> Window -> IO Window using err = XGetTransientForHint(arg1,arg2,&res1)
+--
+-- %fun XSetTransientForHint :: Display -> Window -> Window -> IO ()
+--
+-- -- XRotateWindowProperties omitted
+-- -- XGetWindowProperty omitted
+--
+-- -- XGetWindowAttributes omitted
+-- -- XChangeWindowAttributes omitted
+
+----------------------------------------------------------------
+-- End
+----------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,26 @@
+The HSX11 Library is Copyright (c) Alastair Reid,
+1997-2003, All rights reserved, and is distributed as free software
+under the following license.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+- Neither name of the copyright holders nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,6 @@
+module Main (main) where
+
+import Distribution.Simple (defaultMainWithHooks, defaultUserHooks)
+
+main :: IO ()
+main = defaultMainWithHooks defaultUserHooks
diff --git a/X11.buildinfo.in b/X11.buildinfo.in
new file mode 100644
--- /dev/null
+++ b/X11.buildinfo.in
@@ -0,0 +1,6 @@
+-- @configure_input@
+-- System-dependent values used by Distribution.Simple.defaultUserHooks
+--
+buildable: @BUILD_PACKAGE_BOOL@
+cc-options: @X_CFLAGS@
+ld-options: @X_LIBS@
diff --git a/X11.cabal b/X11.cabal
new file mode 100644
--- /dev/null
+++ b/X11.cabal
@@ -0,0 +1,43 @@
+name:		X11
+version:	1.2
+license:	BSD3
+license-file:	LICENSE
+copyright:	Alastair Reid, 1999-2003
+maintainer:	<libraries@haskell.org>
+category:	Graphics
+synopsis:	A binding to the X11 graphics library
+description:	A Haskell binding to the X11 graphics library.
+	.
+	The binding is a direct translation of the C binding; for
+	documentation of these calls, refer to "The Xlib Programming
+	Manual", available online at <http://tronche.com/gui/x/xlib/>.
+extra-source-files:
+	configure.ac configure
+	config.mk.in X11.buildinfo.in include/HsX11Config.h.in
+	include/HsXlib.h
+extra-tmp-files:
+	config.log config.status autom4te.cache
+	config.mk X11.buildinfo include/HsX11Config.h
+exposed-modules:
+	Graphics.X11,
+	Graphics.X11.Types,
+	Graphics.X11.Xlib,
+	Graphics.X11.Xlib.Atom,
+	Graphics.X11.Xlib.Color,
+	Graphics.X11.Xlib.Context,
+	Graphics.X11.Xlib.Display,
+	Graphics.X11.Xlib.Event,
+	Graphics.X11.Xlib.Font,
+	Graphics.X11.Xlib.Misc,
+	Graphics.X11.Xlib.Region,
+	Graphics.X11.Xlib.Screen,
+	Graphics.X11.Xlib.Types,
+	Graphics.X11.Xlib.Window
+c-sources:
+	cbits/fdset.c,
+	cbits/auxiliaries.c
+extensions:	ForeignFunctionInterface, CPP
+extra-libraries: "X11"
+include-dirs:	include
+install-includes: HsXlib.h
+build-depends:	base
diff --git a/cbits/auxiliaries.c b/cbits/auxiliaries.c
new file mode 100644
--- /dev/null
+++ b/cbits/auxiliaries.c
@@ -0,0 +1,11 @@
+#include <stdio.h>
+#include <X11/X.h>
+#include <X11/Xlib.h>
+
+int defaultErrorHandler(Display *d, XErrorEvent *ev)
+{
+    char buffer[1000];
+    XGetErrorText(d,ev->error_code,buffer,1000);
+    printf("Error: %s\n", buffer);
+    return 0;
+}
diff --git a/cbits/fdset.c b/cbits/fdset.c
new file mode 100644
--- /dev/null
+++ b/cbits/fdset.c
@@ -0,0 +1,4 @@
+#include "HsXlib.h"
+
+void fdZero(fd_set *set) { FD_ZERO(set); }
+void fdSet(int fd, fd_set *set) { FD_SET(fd, set); }
diff --git a/config.mk.in b/config.mk.in
new file mode 100644
--- /dev/null
+++ b/config.mk.in
@@ -0,0 +1,10 @@
+X11_BUILD_PACKAGE=@X11_BUILD_PACKAGE@
+ifneq "$(X11_BUILD_PACKAGE)" "no"
+X_CFLAGS=@X_CFLAGS@
+X_PRE_LIBS=@X_PRE_LIBS@
+X_LIBS=@X_LIBS@
+X_EXTRA_LIBS=@X_EXTRA_LIBS@
+PACKAGE=@PACKAGE_TARNAME@
+VERSION=@PACKAGE_VERSION@
+MAINTAINER=@PACKAGE_BUGREPORT@
+endif
diff --git a/configure b/configure
new file mode 100644
--- /dev/null
+++ b/configure
@@ -0,0 +1,4718 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.57 for Haskell X11 package 1.1.
+#
+# Report bugs to <libraries@haskell.org>.
+#
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete.  It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='Haskell X11 package'
+PACKAGE_TARNAME='X11'
+PACKAGE_VERSION='1.1'
+PACKAGE_STRING='Haskell X11 package 1.1'
+PACKAGE_BUGREPORT='libraries@haskell.org'
+
+ac_unique_file="include/HsXlib.h"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS X11_BUILD_PACKAGE BUILD_PACKAGE_BOOL LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_option in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    eval "enable_$ac_feature=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+   { (exit 1); exit 1; }; }
+    ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_$ac_feature='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case $ac_option in
+      *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_$ac_package='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid package name: $ac_package" >&2
+   { (exit 1); exit 1; }; }
+    ac_package=`echo $ac_package | sed 's/-/_/g'`
+    eval "with_$ac_package=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+   { (exit 1); exit 1; }; }
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+   { (exit 1); exit 1; }; }
+    ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+    eval "$ac_envvar='$ac_optarg'"
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  { echo "$as_me: error: missing argument to $ac_option" >&2
+   { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+              localstatedir libdir includedir oldincludedir infodir mandir
+do
+  eval ac_val=$`echo $ac_var`
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* ) ;;
+    *)  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used." >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$0" : 'X\(//\)[^/]' \| \
+         X"$0" : 'X\(//\)$' \| \
+         X"$0" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+   { (exit 1); exit 1; }; }
+  else
+    { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+   { (exit 1); exit 1; }; }
+  fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures Haskell X11 package 1.1 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+  cat <<_ACEOF
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR           user executables [EPREFIX/bin]
+  --sbindir=DIR          system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR       program executables [EPREFIX/libexec]
+  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
+  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
+  --libdir=DIR           object code libraries [EPREFIX/lib]
+  --includedir=DIR       C header files [PREFIX/include]
+  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
+  --infodir=DIR          info documentation [PREFIX/info]
+  --mandir=DIR           man documentation [PREFIX/man]
+_ACEOF
+
+  cat <<\_ACEOF
+
+X features:
+  --x-includes=DIR    X include files are in DIR
+  --x-libraries=DIR   X library files are in DIR
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of Haskell X11 package 1.1:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --enable-x11            build a Haskell binding for X11.
+                          (default=autodetect)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-x                use the X Window System
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
+              headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <libraries@haskell.org>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  ac_popdir=`pwd`
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d $ac_dir || continue
+    ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+    cd $ac_dir
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_srcdir/configure.gnu; then
+      echo
+      $SHELL $ac_srcdir/configure.gnu  --help=recursive
+    elif test -f $ac_srcdir/configure; then
+      echo
+      $SHELL $ac_srcdir/configure  --help=recursive
+    elif test -f $ac_srcdir/configure.ac ||
+           test -f $ac_srcdir/configure.in; then
+      echo
+      $ac_configure --help
+    else
+      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi
+    cd $ac_popdir
+  done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+  cat <<\_ACEOF
+Haskell X11 package configure 1.1
+generated by GNU Autoconf 2.57
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by Haskell X11 package $as_me 1.1, which was
+generated by GNU Autoconf 2.57.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo               = `(hostinfo) 2>/dev/null               || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+        ac_must_keep_next=false # Got value, back to normal.
+      else
+        case $ac_arg in
+          *=* | --config-cache | -C | -disable-* | --disable-* \
+          | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+          | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+          | -with-* | --with-* | -without-* | --without-* | --x)
+            case "$ac_configure_args0 " in
+              "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+            esac
+            ;;
+          -* ) ac_must_keep_next=true ;;
+        esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+{
+  (set) 2>&1 |
+    case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      sed -n \
+        "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+      ;;
+    *)
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+}
+    echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+        echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+      echo
+      sed "/^$/d" confdefs.h | sort
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      echo "$as_me: caught signal $ac_signal"
+    echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core core.* *.core &&
+  rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+     ' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special
+  # files actually), so we avoid doing that.
+  if test -f "$cache_file"; then
+    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . $cache_file;;
+      *)                      . ./$cache_file;;
+    esac
+  fi
+else
+  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+               sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+  eval ac_new_val="\$ac_env_${ac_var}_value"
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+        { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+        { echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
+echo "$as_me:   former value:  $ac_old_val" >&2;}
+        { echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
+echo "$as_me:   current value: $ac_new_val" >&2;}
+        ac_cache_corrupted=:
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --enable-x11 or --disable-x11 was given.
+if test "${enable_x11+set}" = set; then
+  enableval="$enable_x11"
+  enable_x11=$enableval
+else
+  enable_x11=yes
+fi;
+
+
+if test "$enable_x11" = no; then
+  X11_BUILD_PACKAGE=no
+  BUILD_PACKAGE_BOOL=False
+else
+# Safety check: Ensure that we are in the correct source directory.
+
+
+          ac_config_headers="$ac_config_headers include/HsX11Config.h"
+
+
+# Check for X11 include paths and libraries
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  CC=$ac_ct_CC
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for ac_exec_ext in '' $ac_executable_extensions; do
+  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+  echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+  test -n "$ac_ct_CC" && break
+done
+
+  CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+     "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+  (eval $ac_compiler --version </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+  (eval $ac_compiler -v </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+  (eval $ac_compiler -V </dev/null >&5) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+  (eval $ac_link_default) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # Find the output, starting from the most likely.  This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+        ;;
+    conftest.$ac_ext )
+        # This is the source file.
+        ;;
+    [ab].out )
+        # We found the default executable, but exeext='' is most
+        # certainly right.
+        break;;
+    *.* )
+        ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+        # FIXME: I believe we export ac_cv_exeext for Libtool,
+        # but it would be cool to find out if it's true.  Does anybody
+        # maintain Libtool? --akim.
+        export ac_cv_exeext
+        break;;
+    * )
+        break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+   { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+  if { ac_try='./$ac_file'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+    fi
+  fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+          export ac_cv_exeext
+          break;;
+    * ) break;;
+  esac
+done
+else
+  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_compiler_gnu=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_g=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+  *)
+    echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C.  Since we use `exit',
+# in C++ we need to declare it.  In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+  choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdlib.h>
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if test "${ac_cv_prog_CPP+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+                     Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether non-existent headers
+  # can be detected and how.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # Broken: success on invalid input.
+continue
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+  :
+else
+  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for X" >&5
+echo $ECHO_N "checking for X... $ECHO_C" >&6
+
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+  withval="$with_x"
+
+fi;
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+  # The user explicitly disabled X.
+  have_x=disabled
+else
+  if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+    # Both variables are already set.
+    have_x=yes
+  else
+    if test "${ac_cv_have_x+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -fr conftest.dir
+if mkdir conftest.dir; then
+  cd conftest.dir
+  # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+  cat >Imakefile <<'_ACEOF'
+acfindx:
+	@echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+_ACEOF
+  if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+    eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+    for ac_extension in a so sl; do
+      if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
+         test -f $ac_im_libdir/libX11.$ac_extension; then
+        ac_im_usrlibdir=$ac_im_libdir; break
+      fi
+    done
+    # Screen out bogus values from the imake configuration.  They are
+    # bogus both because they are the default anyway, and because
+    # using them would break gcc on systems where it needs fixed includes.
+    case $ac_im_incroot in
+	/usr/include) ;;
+	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+    esac
+    case $ac_im_usrlibdir in
+	/usr/lib | /lib) ;;
+	*) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+    esac
+  fi
+  cd ..
+  rm -fr conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+  # Guess where to find include files, by looking for Intrinsic.h.
+  # First, try using that file with no special directory specified.
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <X11/Intrinsic.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  for ac_dir in $ac_x_header_dirs; do
+  if test -r "$ac_dir/X11/Intrinsic.h"; then
+    ac_x_includes=$ac_dir
+    break
+  fi
+done
+fi
+rm -f conftest.err conftest.$ac_ext
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+  # Check for the libraries.
+  # See if we find them without any special options.
+  # Don't add to $LIBS permanently.
+  ac_save_LIBS=$LIBS
+  LIBS="-lXt $LIBS"
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <X11/Intrinsic.h>
+int
+main ()
+{
+XtMalloc (0)
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+LIBS=$ac_save_LIBS
+for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+  # Don't even attempt the hair of trying to link an X program!
+  for ac_extension in a so sl; do
+    if test -r $ac_dir/libXt.$ac_extension; then
+      ac_x_libraries=$ac_dir
+      break 2
+    fi
+  done
+done
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then
+  # Didn't find X anywhere.  Cache the known absence of X.
+  ac_cv_have_x="have_x=no"
+else
+  # Record where we found X for the cache.
+  ac_cv_have_x="have_x=yes \
+	        ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+
+  fi
+  eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+  echo "$as_me:$LINENO: result: $have_x" >&5
+echo "${ECHO_T}$have_x" >&6
+  no_x=yes
+else
+  # If each of the values was on the command line, it overrides each guess.
+  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+  # Update the cache value to reflect the command line values.
+  ac_cv_have_x="have_x=yes \
+		ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+  echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5
+echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6
+fi
+
+if test "$no_x" = yes; then
+  # Not all programs may use this symbol, but it does not hurt to define it.
+
+cat >>confdefs.h <<\_ACEOF
+#define X_DISPLAY_MISSING 1
+_ACEOF
+
+  X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
+else
+  if test -n "$x_includes"; then
+    X_CFLAGS="$X_CFLAGS -I$x_includes"
+  fi
+
+  # It would also be nice to do this for all -L options, not just this one.
+  if test -n "$x_libraries"; then
+    X_LIBS="$X_LIBS -L$x_libraries"
+    # For Solaris; some versions of Sun CC require a space after -R and
+    # others require no space.  Words are not sufficient . . . .
+    case `(uname -sr) 2>/dev/null` in
+    "SunOS 5"*)
+      echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5
+echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6
+      ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+      cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_R_nospace=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_R_nospace=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+      if test $ac_R_nospace = yes; then
+	echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+	X_LIBS="$X_LIBS -R$x_libraries"
+      else
+	LIBS="$ac_xsave_LIBS -R $x_libraries"
+	cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_R_space=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_R_space=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+	if test $ac_R_space = yes; then
+	  echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+	  X_LIBS="$X_LIBS -R $x_libraries"
+	else
+	  echo "$as_me:$LINENO: result: neither works" >&5
+echo "${ECHO_T}neither works" >&6
+	fi
+      fi
+      LIBS=$ac_xsave_LIBS
+    esac
+  fi
+
+  # Check for system-dependent libraries X programs must link with.
+  # Do this before checking for the system-independent R6 libraries
+  # (-lICE), since we may need -lsocket or whatever for X linking.
+
+  if test "$ISC" = yes; then
+    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+  else
+    # Martyn Johnson says this is needed for Ultrix, if the X
+    # libraries were built with DECnet support.  And Karl Berry says
+    # the Alpha needs dnet_stub (dnet does not exist).
+    ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+    cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char XOpenDisplay ();
+int
+main ()
+{
+XOpenDisplay ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dnet_ntoa ();
+int
+main ()
+{
+dnet_ntoa ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dnet_dnet_ntoa=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6
+if test $ac_cv_lib_dnet_dnet_ntoa = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+      echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char dnet_ntoa ();
+int
+main ()
+{
+dnet_ntoa ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6
+if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+    fi
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+    LIBS="$ac_xsave_LIBS"
+
+    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+    # to get the SysV transport functions.
+    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+    # needs -lnsl.
+    # The nsl library prevents programs from opening the X display
+    # on Irix 5.2, according to T.E. Dickey.
+    # The functions gethostbyname, getservbyname, and inet_addr are
+    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+    echo "$as_me:$LINENO: checking for gethostbyname" >&5
+echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6
+if test "${ac_cv_func_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char gethostbyname (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+char (*f) () = gethostbyname;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != gethostbyname;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_gethostbyname=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6
+
+    if test $ac_cv_func_gethostbyname = no; then
+      echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5
+echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname ();
+int
+main ()
+{
+gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_nsl_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
+if test $ac_cv_lib_nsl_gethostbyname = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+      if test $ac_cv_lib_nsl_gethostbyname = no; then
+        echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5
+echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char gethostbyname ();
+int
+main ()
+{
+gethostbyname ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_bsd_gethostbyname=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6
+if test $ac_cv_lib_bsd_gethostbyname = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+      fi
+    fi
+
+    # lieder@skyler.mavd.honeywell.com says without -lsocket,
+    # socket/setsockopt and other routines are undefined under SCO ODT
+    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
+    # on later versions), says Simon Leinen: it contains gethostby*
+    # variants that don't use the name server (or something).  -lsocket
+    # must be given before -lnsl if both are needed.  We assume that
+    # if connect needs -lnsl, so does gethostbyname.
+    echo "$as_me:$LINENO: checking for connect" >&5
+echo $ECHO_N "checking for connect... $ECHO_C" >&6
+if test "${ac_cv_func_connect+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char connect (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char connect ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_connect) || defined (__stub___connect)
+choke me
+#else
+char (*f) () = connect;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != connect;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_connect=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_connect=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5
+echo "${ECHO_T}$ac_cv_func_connect" >&6
+
+    if test $ac_cv_func_connect = no; then
+      echo "$as_me:$LINENO: checking for connect in -lsocket" >&5
+echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_connect+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char connect ();
+int
+main ()
+{
+connect ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_socket_connect=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_socket_connect=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6
+if test $ac_cv_lib_socket_connect = yes; then
+  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+    fi
+
+    # Guillermo Gomez says -lposix is necessary on A/UX.
+    echo "$as_me:$LINENO: checking for remove" >&5
+echo $ECHO_N "checking for remove... $ECHO_C" >&6
+if test "${ac_cv_func_remove+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char remove (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char remove ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_remove) || defined (__stub___remove)
+choke me
+#else
+char (*f) () = remove;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != remove;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_remove=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_remove=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5
+echo "${ECHO_T}$ac_cv_func_remove" >&6
+
+    if test $ac_cv_func_remove = no; then
+      echo "$as_me:$LINENO: checking for remove in -lposix" >&5
+echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6
+if test "${ac_cv_lib_posix_remove+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char remove ();
+int
+main ()
+{
+remove ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_posix_remove=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_posix_remove=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5
+echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6
+if test $ac_cv_lib_posix_remove = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+    fi
+
+    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+    echo "$as_me:$LINENO: checking for shmat" >&5
+echo $ECHO_N "checking for shmat... $ECHO_C" >&6
+if test "${ac_cv_func_shmat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shmat (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shmat ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shmat) || defined (__stub___shmat)
+choke me
+#else
+char (*f) () = shmat;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shmat;
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_func_shmat=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shmat=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5
+echo "${ECHO_T}$ac_cv_func_shmat" >&6
+
+    if test $ac_cv_func_shmat = no; then
+      echo "$as_me:$LINENO: checking for shmat in -lipc" >&5
+echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6
+if test "${ac_cv_lib_ipc_shmat+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc  $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char shmat ();
+int
+main ()
+{
+shmat ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_ipc_shmat=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_ipc_shmat=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5
+echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6
+if test $ac_cv_lib_ipc_shmat = yes; then
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+    fi
+  fi
+
+  # Check for libraries that X11R6 Xt/Xaw programs need.
+  ac_save_LDFLAGS=$LDFLAGS
+  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+  # check for ICE first), but we must link in the order -lSM -lICE or
+  # we get undefined symbols.  So assume we have SM if we have ICE.
+  # These have to be linked with before -lX11, unlike the other
+  # libraries we check for below, so use a different variable.
+  # John Interrante, Karl Berry
+  echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5
+echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6
+if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+/* Override any gcc2 internal prototype to avoid an error.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+   builtin and then its argument prototype would still apply.  */
+char IceConnectionNumber ();
+int
+main ()
+{
+IceConnectionNumber ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6
+if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then
+  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+  LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+
+# AC_PATH_XTRA doesn't actually check that the C compiler can
+# really include the X headers, so double-check here.  In particular,
+# this will catch the case of using a mingw32 gcc on a Cygwin system:
+# Cygwin has the X headers & libs installed, but the mingw32 gcc can't
+# use them, and we want to disable the package in this case.
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <X11/Xlib.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } >/dev/null; then
+  if test -s conftest.err; then
+    ac_cpp_err=$ac_c_preproc_warn_flag
+  else
+    ac_cpp_err=
+  fi
+else
+  ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+  :
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+  no_x=yes
+fi
+rm -f conftest.err conftest.$ac_ext
+
+# Build the package if we found X11 stuff
+if test "$no_x" = yes; then
+  X11_BUILD_PACKAGE=no
+  BUILD_PACKAGE_BOOL=False
+else
+  X11_BUILD_PACKAGE=yes
+  BUILD_PACKAGE_BOOL=True
+fi
+fi
+
+
+
+# Define CPP variables used in package.conf.in
+if test "$X11_BUILD_PACKAGE" = yes; then
+
+
+cat >>confdefs.h <<_ACEOF
+#define X_CFLAGS `echo '' $X_CFLAGS | sed -e 's/-[^ ]*/,"&"/g' -e 's/^ *,//'`
+_ACEOF
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define X_LIBS `echo '' $X_LIBS | sed -e 's/-[^ ]*/,"&"/g' -e 's/^ *,//'`
+_ACEOF
+
+
+fi
+
+                    ac_config_files="$ac_config_files config.mk X11.buildinfo"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+  (set) 2>&1 |
+    case `(ac_space=' '; set | grep ac_space) 2>&1` in
+    *ac_space=\ *)
+      # `set' does not quote correctly, so add quotes (double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \).
+      sed -n \
+        "s/'/'\\\\''/g;
+    	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;;
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n \
+        "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+      ;;
+    esac;
+} |
+  sed '
+     t clear
+     : clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+  if test -w $cache_file; then
+    test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+    cat confcache >$cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ 	]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ 	]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+         sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+  LC_TELEPHONE LC_TIME
+do
+  if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  echo "#! /bin/sh" >conf$$.sh
+  echo  "exit 0"   >>conf$$.sh
+  chmod +x conf$$.sh
+  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+    PATH_SEPARATOR=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+   { (exit 1); exit 1; }; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.  Logging --version etc. is OK.
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by Haskell X11 package $as_me 1.1, which was
+generated by GNU Autoconf 2.57.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+  echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+  echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+  echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+  echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number, then exit
+  -q, --quiet      do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+  --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+  --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+Haskell X11 package config.status 1.1
+configured by $0, generated by GNU Autoconf 2.57,
+  with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value.  By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=*)
+    ac_option=`expr "x$1" : 'x\([^=]*\)='`
+    ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  *) # This is not an option, so the user has probably given explicit
+     # arguments.
+     ac_option=$1
+     ac_need_defaults=false;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --vers* | -V )
+    echo "$ac_cs_version"; exit 0 ;;
+  --he | --h)
+    # Conflict between --help and --header
+    { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; };;
+  --help | --hel | -h )
+    echo "$ac_cs_usage"; exit 0 ;;
+  --debug | --d* | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+   { (exit 1); exit 1; }; } ;;
+
+  *) ac_config_targets="$ac_config_targets $1" ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+  case "$ac_config_target" in
+  # Handling of arguments.
+  "config.mk" ) CONFIG_FILES="$CONFIG_FILES config.mk" ;;
+  "X11.buildinfo" ) CONFIG_FILES="$CONFIG_FILES X11.buildinfo" ;;
+  "include/HsX11Config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/HsX11Config.h" ;;
+  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+   { (exit 1); exit 1; }; };;
+  esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=./confstat$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in ." >&2
+   { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+  # Protect against being on the right side of a sed subst in config.status.
+  sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+   s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@CPP@,$CPP,;t t
+s,@X_CFLAGS@,$X_CFLAGS,;t t
+s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t
+s,@X_LIBS@,$X_LIBS,;t t
+s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t
+s,@X11_BUILD_PACKAGE@,$X11_BUILD_PACKAGE,;t t
+s,@BUILD_PACKAGE_BOOL@,$BUILD_PACKAGE_BOOL,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+  cat >>$CONFIG_STATUS <<\_ACEOF
+  # Split the substitutions into bite-sized pieces for seds with
+  # small command number limits, like on Digital OSF/1 and HP-UX.
+  ac_max_sed_lines=48
+  ac_sed_frag=1 # Number of current file.
+  ac_beg=1 # First line for current file.
+  ac_end=$ac_max_sed_lines # Line after last line for current file.
+  ac_more_lines=:
+  ac_sed_cmds=
+  while $ac_more_lines; do
+    if test $ac_beg -gt 1; then
+      sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    else
+      sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+    fi
+    if test ! -s $tmp/subs.frag; then
+      ac_more_lines=false
+    else
+      # The purpose of the label and of the branching condition is to
+      # speed up the sed processing (if there are no `@' at all, there
+      # is no need to browse any of the substitutions).
+      # These are the two extra sed commands mentioned above.
+      (echo ':t
+  /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+      if test -z "$ac_sed_cmds"; then
+  	ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+      else
+  	ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+      fi
+      ac_sed_frag=`expr $ac_sed_frag + 1`
+      ac_beg=$ac_end
+      ac_end=`expr $ac_end + $ac_max_sed_lines`
+    fi
+  done
+  if test -z "$ac_sed_cmds"; then
+    ac_sed_cmds=cat
+  fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+  ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$as_dir" : 'X\(//\)[^/]' \| \
+         X"$as_dir" : 'X\(//\)$' \| \
+         X"$as_dir" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+  ac_builddir=.
+
+if test "$ac_dir" != .; then
+  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  # A "../" for each directory in $ac_dir_suffix.
+  ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+  ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+  .)  # No --srcdir option.  We are building in place.
+    ac_srcdir=.
+    if test -z "$ac_top_builddir"; then
+       ac_top_srcdir=.
+    else
+       ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+    fi ;;
+  [\\/]* | ?:[\\/]* )  # Absolute path.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir ;;
+  *) # Relative path.
+    ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
+# absolute.
+ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
+ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
+ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
+
+
+
+  if test x"$ac_file" != x-; then
+    { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+    rm -f "$ac_file"
+  fi
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    configure_input=
+  else
+    configure_input="$ac_file.  "
+  fi
+  configure_input=$configure_input"Generated from `echo $ac_file_in |
+                                     sed 's,.*/,,'` by configure."
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+  sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+  rm -f $tmp/stdin
+  if test x"$ac_file" != x-; then
+    mv $tmp/out $ac_file
+  else
+    cat $tmp/out
+    rm -f $tmp/out
+  fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+ac_dB='[ 	].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case $ac_file in
+  - | *:- | *:-:* ) # input from stdin
+        cat >$tmp/stdin
+        ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+        ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+  * )   ac_file_in=$ac_file.in ;;
+  esac
+
+  test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+  # First look for the input files in the build tree, otherwise in the
+  # src tree.
+  ac_file_inputs=`IFS=:
+    for f in $ac_file_in; do
+      case $f in
+      -) echo $tmp/stdin ;;
+      [\\/$]*)
+         # Absolute (can't be DOS-style, as IFS=:)
+         test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         echo $f;;
+      *) # Relative
+         if test -f "$f"; then
+           # Build tree
+           echo $f
+         elif test -f "$srcdir/$f"; then
+           # Source tree
+           echo $srcdir/$f
+         else
+           # /dev/null tree
+           { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+   { (exit 1); exit 1; }; }
+         fi;;
+      esac
+    done` || { (exit 1); exit 1; }
+  # Remove the trailing spaces.
+  sed 's/[ 	]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h.  The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status.  Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ 	]*#[ 	]*define[ 	][ 	]*\([^ 	(][^ 	(]*\)\(([^)]*)\)[ 	]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ 	]*#[ 	]*define[ 	][ 	]*\([^ 	][^ 	]*\)[ 	]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless.  Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo '  if grep "^[ 	]*#[ 	]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo '  :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+  # Write a limited-size here document to $tmp/defines.sed.
+  echo '  cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#define' lines.
+  echo '/^[ 	]*#[ 	]*define/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/defines.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+  rm -f conftest.defines
+  mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo '  fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo '  # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+  # Write a limited-size here document to $tmp/undefs.sed.
+  echo '  cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+  # Speed up: don't consider the non `#undef'
+  echo '/^[ 	]*#[ 	]*undef/!b' >>$CONFIG_STATUS
+  # Work around the forget-to-reset-the-flag bug.
+  echo 't clr' >>$CONFIG_STATUS
+  echo ': clr' >>$CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+  echo 'CEOF
+  sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+  rm -f $tmp/in
+  mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+  rm -f conftest.undefs
+  mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+  # Let's still pretend it is `configure' which instantiates (i.e., don't
+  # use $as_me), people would be surprised to read:
+  #    /* config.h.  Generated by config.status.  */
+  if test x"$ac_file" = x-; then
+    echo "/* Generated by configure.  */" >$tmp/config.h
+  else
+    echo "/* $ac_file.  Generated by configure.  */" >$tmp/config.h
+  fi
+  cat $tmp/in >>$tmp/config.h
+  rm -f $tmp/in
+  if test x"$ac_file" != x-; then
+    if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$ac_file" : 'X\(//\)[^/]' \| \
+         X"$ac_file" : 'X\(//\)$' \| \
+         X"$ac_file" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+         X"$as_dir" : 'X\(//\)[^/]' \| \
+         X"$as_dir" : 'X\(//\)$' \| \
+         X"$as_dir" : 'X\(/\)' \| \
+         .     : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
+
+      rm -f $ac_file
+      mv $tmp/config.h $ac_file
+    fi
+  else
+    cat $tmp/config.h
+    rm -f $tmp/config.h
+  fi
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/configure.ac b/configure.ac
new file mode 100644
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,51 @@
+AC_INIT([Haskell X11 package], [1.1], [libraries@haskell.org], [X11])
+
+FP_ARG_X11
+
+if test "$enable_x11" = no; then
+  X11_BUILD_PACKAGE=no
+  BUILD_PACKAGE_BOOL=False
+else
+# Safety check: Ensure that we are in the correct source directory.
+AC_CONFIG_SRCDIR([include/HsXlib.h])
+
+AC_CONFIG_HEADERS([include/HsX11Config.h])
+
+# Check for X11 include paths and libraries
+AC_PATH_XTRA
+
+# AC_PATH_XTRA doesn't actually check that the C compiler can
+# really include the X headers, so double-check here.  In particular,
+# this will catch the case of using a mingw32 gcc on a Cygwin system:
+# Cygwin has the X headers & libs installed, but the mingw32 gcc can't
+# use them, and we want to disable the package in this case.
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+AC_TRY_CPP([#include <X11/Xlib.h>],,[no_x=yes])
+
+# Build the package if we found X11 stuff
+if test "$no_x" = yes; then
+  X11_BUILD_PACKAGE=no
+  BUILD_PACKAGE_BOOL=False
+else
+  X11_BUILD_PACKAGE=yes
+  BUILD_PACKAGE_BOOL=True
+fi
+fi
+AC_SUBST([X11_BUILD_PACKAGE])
+AC_SUBST([BUILD_PACKAGE_BOOL])
+
+# Define CPP variables used in package.conf.in
+if test "$X11_BUILD_PACKAGE" = yes; then
+
+  AC_DEFINE_UNQUOTED(X_CFLAGS,
+    [`echo '' $X_CFLAGS | sed -e 's/-[[^ ]]*/,"&"/g' -e 's/^ *,//'`],
+    [C flags for X11, as a list of string literals.])
+
+  AC_DEFINE_UNQUOTED(X_LIBS,
+    [`echo '' $X_LIBS | sed -e 's/-[[^ ]]*/,"&"/g' -e 's/^ *,//'`],
+    [Library flags for X11, as a list of string literals.])
+
+fi
+
+AC_CONFIG_FILES([config.mk X11.buildinfo])
+AC_OUTPUT
diff --git a/include/HsX11Config.h.in b/include/HsX11Config.h.in
new file mode 100644
--- /dev/null
+++ b/include/HsX11Config.h.in
@@ -0,0 +1,25 @@
+/* include/HsX11Config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* C flags for X11, as a list of string literals. */
+#undef X_CFLAGS
+
+/* Define to 1 if the X Window System is missing or not being used. */
+#undef X_DISPLAY_MISSING
+
+/* Library flags for X11, as a list of string literals. */
+#undef X_LIBS
diff --git a/include/HsXlib.h b/include/HsXlib.h
new file mode 100644
--- /dev/null
+++ b/include/HsXlib.h
@@ -0,0 +1,38 @@
+/* -----------------------------------------------------------------------------
+ * $Id: HsXlib.h,v 1.3 2004/02/16 18:01:29 ross Exp $
+ *
+ * Definitions for package `X11' which are visible in Haskell land.
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef HSXLIB_H
+#define HSXLIB_H
+
+#include <stdlib.h>
+
+#include <X11/X.h>
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+#define XK_MISCELLANY
+#define XK_LATIN1
+#include <X11/keysymdef.h>
+
+/* This error handler is used from FFI code.
+ * It generates a slightly better error message than the one
+ * that comes with Xlib.
+ */
+extern int defaultErrorHandler(Display *, XErrorEvent *);
+
+/* Used in waitForEvent */
+#include <sys/select.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+extern void fdZero(fd_set *set);
+extern void fdSet(int fd, fd_set *set);
+
+#endif
