如何获取当前工作区中 windows 的计数?

How can I get the count of windows in the current workspace?

X () 的上下文中,如何获取工作区中当前 windows 的计数?

我知道如何从WindowSet获取计数并且有windows :: (WindowSet -> WindowSet) -> X ()的功能。但是我实际上想要 return 一个值,所以它必须是 (WindowSet -> WindowSet) -> X Int.

我通过查看 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

Chris answer 的简短版本,没有附加功能。 如果 ws' 代表 windows 列表的长度,就像他的回答一样,那么:
ws' <- length . W.integrate' . W.stack . W.workspace . W.current . windowset <$> get

由于 W.index:

,变体更短
winCount = length . W.index . windowset <$> get
winCount = gets (windowset) >>= return . length . W.index
winCount = gets (W.index . windowset) >>= return . length