4

Я думаю, что это должно быть действительно легко для того, кто хорош в 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

1 ответ1

7

Старый пост, но для тех, кто все еще хочет ответа:

В основном с XMonad.StackSet.index , вы можете получить список окон в текущей рабочей области следующим образом:

do
    windows <- gets (W.index . windowset)
    -- something...

Так что 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

PS: последние три строки могут быть сокращены до maybe actionIfNotFound actionIfFound found

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .