Как я могу узнать количество окон в текущей рабочей области?

В контексте X (), как я могу получить количество текущих окон в рабочей области?

Я знаю, как получить счет от WindowSet, и есть функция windows :: (WindowSet -> WindowSet) -> X (). Однако я бы хотел вернуть значение, которое должно быть примерно таким, как (WindowSet -> WindowSet) -> X Int.


person Chris Stryczynski    schedule 01.11.2017    source источник


Ответы (3)


Более короткая версия ответа Криса без дополнительных функций. Если ws' представляет длину списка окон, как в его ответе, то:
ws' <- length . W.integrate' . W.stack . W.workspace . W.current . windowset <$> get

person Vito Canadi    schedule 25.01.2018

Мне удалось понять это, посмотрев на реализацию windows.

import XMonad (windows, X, WindowSet, XState(XState, windowset))
import qualified XMonad.StackSet as W
import Control.Monad.State


getWindowState :: X (WindowSet)
getWindowState = do
    XState { windowset = old } <- get
    return $ old

А затем в контексте X ():

ws <- getWindowState >>= (return . W.stack . W.workspace . W.current)
let ws' = maybe 0 (length . W.integrate) ws
person Chris Stryczynski    schedule 01.11.2017

Еще более короткие варианты благодаря W.index:

winCount = length . W.index . windowset <$> get
winCount = gets (windowset) >>= return . length . W.index
winCount = gets (W.index . windowset) >>= return . length
person Darek    schedule 28.05.2020