diff --git a/Graphics/X11/Xlib/Extras.hsc b/Graphics/X11/Xlib/Extras.hsc
--- a/Graphics/X11/Xlib/Extras.hsc
+++ b/Graphics/X11/Xlib/Extras.hsc
@@ -170,6 +170,40 @@
         , ev_focus                 :: !Bool
         , ev_state                 :: !Modifier
         }
+    | SelectionRequest
+        { ev_event_type            :: !EventType
+        , ev_serial                :: !CULong
+        , ev_send_event            :: !Bool
+        , ev_event_display         :: Display
+        , ev_owner                 :: !Window
+        , ev_requestor             :: !Window
+        , ev_selection             :: !Atom
+        , ev_target                :: !Atom
+        , ev_property              :: !Atom
+        , ev_time                  :: !Time
+        }
+    | PropertyEvent
+        { ev_event_type            :: !EventType
+        , ev_serial                :: !CULong
+        , ev_send_event            :: !Bool
+        , ev_event_display         :: Display
+        , ev_window                :: !Window
+        , ev_atom                  :: !Atom
+        , ev_time                  :: !Time
+        , ev_propstate             :: !CInt
+        }
+    | ExposeEvent
+        { ev_event_type            :: !EventType
+        , ev_serial                :: !CULong
+        , ev_send_event            :: !Bool
+        , ev_event_display         :: Display
+        , ev_window                :: !Window
+        , ev_x                     :: !CInt
+        , ev_y                     :: !CInt
+        , ev_width                 :: !CInt
+        , ev_height                :: !CInt
+        , ev_count                 :: !CInt
+        }
 
     deriving ( Show, Typeable )
 
@@ -479,6 +513,71 @@
                         , ev_state         = fromIntegral state
                         }
 
+          -------------------------
+          -- SelectionRequestEvent:
+          -------------------------
+          | type_ == selectionRequest -> do
+            owner          <- #{peek XSelectionRequestEvent, owner     } p
+            requestor      <- #{peek XSelectionRequestEvent, requestor } p
+            selection      <- #{peek XSelectionRequestEvent, selection } p
+            target         <- #{peek XSelectionRequestEvent, target    } p
+            property       <- #{peek XSelectionRequestEvent, property  } p
+            time           <- #{peek XSelectionRequestEvent, time      } p
+            return $ SelectionRequest
+                        { ev_event_type    = type_
+                        , ev_serial        = serial
+                        , ev_send_event    = send_event
+                        , ev_event_display = display
+                        , ev_owner         = owner
+                        , ev_requestor     = requestor
+                        , ev_selection     = selection
+                        , ev_target        = target
+                        , ev_property      = property
+                        , ev_time          = time
+                        }
+
+          -------------------------
+          -- PropertyEvent
+          -------------------------
+          | type_ == propertyNotify -> do
+            window <- #{peek XPropertyEvent, window } p
+            atom   <- #{peek XPropertyEvent, atom   } p
+            time   <- #{peek XPropertyEvent, time   } p
+            state  <- #{peek XPropertyEvent, state  } p
+            return $ PropertyEvent
+                        { ev_event_type    = type_
+                        , ev_serial        = serial
+                        , ev_send_event    = send_event
+                        , ev_event_display = display
+                        , ev_window        = window
+                        , ev_atom          = atom
+                        , ev_time          = time
+                        , ev_propstate     = state
+                        }
+
+          -------------------------
+          -- ExposeEvent
+          -------------------------
+          | type_ == expose -> do
+            window <- #{peek XExposeEvent, window } p
+            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 $ ExposeEvent
+                        { ev_event_type    = type_
+                        , ev_serial        = serial
+                        , ev_send_event    = send_event
+                        , ev_event_display = display
+                        , ev_window        = window
+                        , ev_x             = x
+                        , ev_y             = y
+                        , ev_width         = width
+                        , ev_height        = height
+                        , ev_count         = count
+                        }
+
           -- We don't handle this event specifically, so return the generic
           -- AnyEvent.
           | otherwise -> do
@@ -629,9 +728,6 @@
     f
     ungrabServer dpy
 
-foreign import ccall unsafe "XlibExtras.h XFetchName"
-    xFetchName :: Display -> Window -> Ptr CString -> IO Status
-
 data TextProperty = TextProperty {
         tp_value    :: CString,
         tp_encoding :: Atom,
@@ -681,6 +777,72 @@
 foreign import ccall unsafe "XlibExtras.h XwcFreeStringList"
     wcFreeStringList :: Ptr CWString -> IO ()
 
+newtype FontSet = FontSet (Ptr FontSet)
+    deriving (Eq, Ord, Show)
+
+foreign import ccall unsafe "XlibExtras.h XCreateFontSet"
+    xCreateFontSet :: Display -> CString -> Ptr (Ptr CString) -> Ptr CInt -> Ptr CString -> IO (Ptr FontSet)
+
+createFontSet :: Display -> String -> IO ([String], String, FontSet)
+createFontSet d fn =
+    withCString fn $ \fontp  ->
+    alloca         $ \listp  ->
+    alloca         $ \countp ->
+    alloca         $ \defp   -> do
+        fs      <- throwIfNull "createFontSet" $
+                       xCreateFontSet d fontp listp countp defp
+        count   <- peek countp
+        list    <- peek listp
+        missing <- flip mapM [0..fromIntegral count - 1] $ \i ->
+                       peekElemOff list i >>= peekCString
+        def     <- peek defp >>= peekCString
+        freeStringList list
+        return (missing, def, FontSet fs)
+
+foreign import ccall unsafe "XlibExtras.h XFreeStringList"
+    freeStringList :: Ptr CString -> IO ()
+
+foreign import ccall unsafe "XlibExtras.h XFreeFontSet"
+    freeFontSet :: Display -> FontSet -> IO ()
+
+foreign import ccall unsafe "XlibExtras.h XwcTextExtents"
+    xwcTextExtents :: FontSet -> CWString -> CInt -> Ptr Rectangle -> Ptr Rectangle -> IO CInt
+
+wcTextExtents :: FontSet -> String -> (Rectangle, Rectangle)
+wcTextExtents fs text = unsafePerformIO $
+    withCWStringLen text $ \(textp, len) ->
+    alloca               $ \inkp          ->
+    alloca               $ \logicalp      -> do
+        xwcTextExtents fs textp (fromIntegral len) inkp logicalp
+        (,) `fmap` peek inkp `ap` peek logicalp
+
+foreign import ccall unsafe "XlibExtras.h XwcDrawString"
+    xwcDrawString :: Display -> Drawable -> FontSet -> GC -> Position -> Position -> CWString -> CInt -> IO ()
+
+wcDrawString :: Display -> Drawable -> FontSet -> GC -> Position -> Position -> String -> IO ()
+wcDrawString d w fs gc x y =
+    flip withCWStringLen $ \(s, len) ->
+        xwcDrawString d w fs gc x y s (fromIntegral len)
+
+foreign import ccall unsafe "XlibExtras.h XwcDrawImageString"
+    xwcDrawImageString :: Display -> Drawable -> FontSet -> GC -> Position -> Position -> CWString -> CInt -> IO ()
+
+wcDrawImageString :: Display -> Drawable -> FontSet -> GC -> Position -> Position -> String -> IO ()
+wcDrawImageString d w fs gc x y =
+    flip withCWStringLen $ \(s, len) ->
+        xwcDrawImageString d w fs gc x y s (fromIntegral len)
+
+foreign import ccall unsafe "XlibExtras.h XwcTextEscapement"
+    xwcTextEscapement :: FontSet -> CWString -> CInt -> IO Int32
+
+wcTextEscapement :: FontSet -> String -> Int32
+wcTextEscapement font_set string = unsafePerformIO $
+    withCWStringLen string $ \ (c_string, len) ->
+    xwcTextEscapement font_set c_string (fromIntegral len)
+
+foreign import ccall unsafe "XlibExtras.h XFetchName"
+    xFetchName :: Display -> Window -> Ptr CString -> IO Status
+
 fetchName :: Display -> Window -> IO (Maybe String)
 fetchName d w = alloca $ \p -> do
     xFetchName d w p
@@ -749,6 +911,29 @@
 
 setEventType :: XEventPtr -> EventType -> IO ()
 setEventType = #{poke XEvent,type}
+
+{-
+typedef struct {
+	int type;		/* SelectionNotify */
+	unsigned long 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 requestor;
+	Atom selection;
+	Atom target;
+	Atom property;		/* atom or None */
+	Time time;
+} XSelectionEvent;
+-}
+
+setSelectionNotify :: XEventPtr -> Window -> Atom -> Atom -> Atom -> Time -> IO ()
+setSelectionNotify p requestor selection target property time = do
+    setEventType p selectionNotify
+    #{poke XSelectionEvent, requestor}    p requestor
+    #{poke XSelectionEvent, selection}    p selection
+    #{poke XSelectionEvent, target}       p target
+    #{poke XSelectionEvent, property}     p property
+    #{poke XSelectionEvent, time}         p time
 
 -- hacky way to set up an XClientMessageEvent
 -- Should have a Storable instance for XEvent/Event?
diff --git a/X11-extras.cabal b/X11-extras.cabal
--- a/X11-extras.cabal
+++ b/X11-extras.cabal
@@ -1,5 +1,5 @@
 name:           X11-extras
-version:        0.3
+version:        0.4
 license:        BSD3
 license-file:   LICENSE
 author:         Spencer Janssen
