Suchen Sie ein Fenster im aktuellen Arbeitsbereich und wenden Sie eine Aktion an

624
yulan6248

Ich denke, das sollte für jemanden, der gut in Haskell ist, wirklich einfach sein, aber ich konnte es einfach nicht herausfinden, da ich schlecht bin. Grundsätzlich möchte ich die Liste der Fenster im aktuellen Arbeitsbereich durchsuchen, eines mit einer bestimmten Bedingung finden und eine Aktion darauf anwenden. Wenn nicht gefunden, erstellen Sie dieses Fenster. Ich hatte einen Skelettcode wie diesen

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 Antwort auf die Frage

7
Nadrieril

Alte Post, aber für alle, die noch eine Antwort haben wollen:

Grundsätzlich erhalten XMonad.StackSet.indexSie mit die Liste der Fenster im aktuellen Arbeitsbereich folgendermaßen:

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

So findWindowlässt sich so implementieren:

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: Die letzten drei Zeilen könnten verkürzt werden maybe actionIfNotFound actionIfFound found