module System.Information.EWMHDesktopInfo
( X11Window
, X11WindowHandle
, withDefaultCtx
, isWindowUrgent
, getCurrentWorkspace
, getVisibleWorkspaces
, getWorkspaceNames
, switchToWorkspace
, getWindowTitle
, getWindowClass
, getActiveWindowTitle
, getWindows
, getWindowHandles
, getWorkspace
, focusWindow
) where
import Data.List (elemIndex)
import Data.Maybe (listToMaybe, mapMaybe)
import System.Information.X11DesktopInfo
type X11WindowHandle = ((Int, String, String), X11Window)
noFocus :: String
noFocus = "..."
getCurrentWorkspace :: X11Property Int
getCurrentWorkspace = readAsInt Nothing "_NET_CURRENT_DESKTOP"
getVisibleWorkspaces :: X11Property [Int]
getVisibleWorkspaces = do
vis <- getVisibleTags
allNames <- getWorkspaceNames
cur <- getCurrentWorkspace
return $ cur : mapMaybe (`elemIndex` allNames) vis
getWorkspaceNames :: X11Property [String]
getWorkspaceNames = readAsListOfString Nothing "_NET_DESKTOP_NAMES"
switchToWorkspace :: Int -> X11Property ()
switchToWorkspace idx = do
cmd <- getAtom "_NET_CURRENT_DESKTOP"
sendCommandEvent cmd (fromIntegral idx)
getWindowTitle :: X11Window -> X11Property String
getWindowTitle window = do
let w = Just window
prop <- readAsString w "_NET_WM_NAME"
case prop of
"" -> readAsString w "WM_NAME"
_ -> return prop
getWindowClass :: X11Window -> X11Property String
getWindowClass window = readAsString (Just window) "WM_CLASS"
withActiveWindow :: (X11Window -> X11Property String) -> X11Property String
withActiveWindow getProp = do
awt <- readAsListOfWindow Nothing "_NET_ACTIVE_WINDOW"
let w = listToMaybe $ filter (>0) awt
maybe (return noFocus) getProp w
getActiveWindowTitle :: X11Property String
getActiveWindowTitle = withActiveWindow getWindowTitle
getWindows :: X11Property [X11Window]
getWindows = readAsListOfWindow Nothing "_NET_CLIENT_LIST"
getWindowHandles :: X11Property [X11WindowHandle]
getWindowHandles = do
windows <- getWindows
workspaces <- mapM getWorkspace windows
wtitles <- mapM getWindowTitle windows
wclasses <- mapM getWindowClass windows
return $ zip (zip3 workspaces wtitles wclasses) windows
getWorkspace :: X11Window -> X11Property Int
getWorkspace window = readAsInt (Just window) "_NET_WM_DESKTOP"
focusWindow :: X11Window -> X11Property ()
focusWindow wh = do
cmd <- getAtom "_NET_ACTIVE_WINDOW"
sendWindowEvent cmd (fromIntegral wh)