在当前工作区中找到一个窗口并对其应用一些操作

L__*_*L__ 4 xmonad

我认为这对于擅长 Haskell 的人来说应该很容易,但我无法弄清楚,因为我不擅长它。基本上我想搜索当前工作区中的窗口列表,找到一个匹配某个条件的窗口并对其应用一些操作;如果未找到,则创建此窗口。我有一个这样的骨架代码

import qualified XMonad.StackSet as W
import XMonad.Actions.WindowGo

findWindow condition actionIfFound actionIfNotFound = 
    ifWindow (condition <&&> member W.current) windowFound actionIfNotFound
        where windowFound = ask >>= w -> do actionIfFound w
Run Code Online (Sandbox Code Playgroud)

小智 9

旧帖子,但对于仍然想要答案的人:

基本上,使用XMonad.StackSet.index,您可以获得当前工作区中的窗口列表,如下所示:

do
    windows <- gets (W.index . windowset)
    -- something...
Run Code Online (Sandbox Code Playgroud)

所以findWindow可以这样实现:

import qualified XMonad.StackSet as W
import Data.List (find)

findWindow :: (Window -> Bool) -> (Window -> X()) -> X() -> X()
findWindow condition actionIfFound actionIfNotFound = do
    windows <- gets (W.index . windowset)
    let found = find condition windows  -- found has type Maybe Window
    case found of
        Nothing -> actionIfNotFound
        Just w -> actionIfFound w
Run Code Online (Sandbox Code Playgroud)

PS:最后三行可以缩短为 maybe actionIfNotFound actionIfFound found