{-# OPTIONS -fglasgow-exts #-} module ClientMessage where import Data.Int import Foreign import Foreign.C.String import Foreign.C.Types import Graphics.X11.Xlib.Event import Graphics.X11.Types import Graphics.X11.Xlib.Types #include #include #include #include #include type XClientMessageEvent = (Atom, ClientData) data ClientData = ClientData8 [Int8] | ClientData16 [Int16] | ClientData32 [Int32] deriving Show peekXButtonEvent :: Ptr XClientMessageEvent -> IO XClientMessageEvent peekXButtonEvent p = do message_type <- #{peek XClientMessageEvent,message_type} p format <- #{peek XClientMessageEvent,format} p :: IO CInt let dataPtr = #{ptr XClientMessageEvent,data.l} p :: Ptr () data' <- case format of 8 -> peekArray 20 ((castPtr dataPtr) :: Ptr Int8) >>= return . ClientData8 16 -> peekArray 10 ((castPtr dataPtr) :: Ptr Int16) >>= return . ClientData16 32 -> peekArray 5 ((castPtr dataPtr) :: Ptr Int32) >>= return . ClientData32 return (message_type, data') get_ClientMessageEvent :: XEventPtr -> IO XClientMessageEvent get_ClientMessageEvent p = peekXButtonEvent (castPtr p) foreign import ccall "XGetAtomName" c_xGetAtomName :: Ptr Display -> Atom -> IO CString getAtomName :: Display -> Atom -> IO String getAtomName (Display d) a = c_xGetAtomName d a >>= peekCString