arbtt-0.1: src/Capture.hs
module Capture where
import Data
import Graphics.X11
import Graphics.X11.Xlib.Extras
import Graphics.X11.XScreenSaver (getXIdleTime)
import Control.Monad
import Data.Maybe
import Control.Applicative
import Data.Time.Clock
captureData :: IO CaptureData
captureData = do
dpy <- openDisplay ":0"
xSetErrorHandler
let rwin = defaultRootWindow dpy
(_,_,cwins) <- queryTree dpy rwin
cwins <- filterM (isInterestingWindow dpy) cwins
(fwin,_) <- getInputFocus dpy
winData <- mapM (\w -> (,,) (w == fwin) <$> getWindowTitle dpy w <*> getProgramName dpy w) cwins
it <- fromIntegral `fmap` getXIdleTime dpy
closeDisplay dpy
return $ CaptureData winData it
-- copied from XMonad/Main.hs, where function "ok" from "scan"
isInterestingWindow :: Display -> Window -> IO Bool
isInterestingWindow dpy w = do
wa <- getWindowAttributes dpy w
a <- internAtom dpy "WM_STATE" False
p <- getWindowProperty32 dpy a w
let ic = case p of
Just (3:_) -> True -- 3 for iconified
_ -> False
return $ not (wa_override_redirect wa)
&& (wa_map_state wa == waIsViewable || ic)
getWindowTitle :: Display -> Window -> IO String
getWindowTitle dpy w = fmap (fromMaybe "") $ fetchName dpy w
getProgramName :: Display -> Window -> IO String
getProgramName dpy w = fmap resName $ getClassHint dpy w