我认为这对于擅长 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
| 归档时间: |
|
| 查看次数: |
526 次 |
| 最近记录: |