Найдите окно в текущем рабочем пространстве и примените к нему некоторые действия

506
yulan6248

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

1 ответ на вопрос

7
Nadrieril

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

По сути, с помощью 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

Похожие вопросы