import Control.Applicative import Control.Monad import Control.Concurrent (threadDelay) import Data.Bits import System.Environment import Graphics.X11 import Graphics.X11.XInput withDisplay :: String -> (Display -> IO a) -> IO () withDisplay str action = do dpy <- openDisplay str action dpy closeDisplay dpy main = do args <- getArgs let dpyStr = case args of [] -> "" [s] -> s _ -> error "Synopsis: xitest DISPLAY" withDisplay dpyStr $ \dpy -> do InitOK xi_opcode <- xinputInit dpy devices <- buildDevicesMap <$> queryDevice dpy XIAllDevices putStrLn (showDevicesMap devices) let dflt = defaultScreen dpy border = blackPixel dpy dflt background = whitePixel dpy dflt rootw <- rootWindow dpy dflt win <- createSimpleWindow dpy rootw 0 0 100 100 1 border background selectInput dpy win (exposureMask .|. buttonPressMask .|. buttonReleaseMask) setEventMask dpy win [XI_Enter, XI_Leave, XI_ButtonPress, XI_ButtonRelease, XI_KeyPress, XI_KeyRelease] setTextProperty dpy win "Hello World" wM_NAME mapWindow dpy win sync dpy False allocaXEvent $ \eptr -> forever $ do nextEvent dpy eptr handleXCookie dpy xi_opcode eptr evHandler cookieHandler sync dpy False evHandler e = putStrLn $ "X11 event: " ++ show e cookieHandler e = print e