packages feed

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