4 votes

Trouver une fenêtre dans l'espace de travail actuel et lui appliquer une action

Je pense que cela devrait être vraiment facile pour quelqu'un qui est bon en Haskell mais je n'ai tout simplement pas pu le comprendre car je suis mauvais. Essentiellement, je veux rechercher dans la liste des fenêtres de l'espace de travail actuel, trouver une correspondance avec une certaine condition et appliquer une action à cette fenêtre; si aucune n'est trouvée, alors créer cette fenêtre. J'avais un code squelette comme ceci

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

9voto

Nadrieril Points 136

Ancien post, mais pour toute personne voulant encore une réponse :

Essentiellement, avec XMonad.StackSet.index, vous pouvez obtenir la liste des fenêtres dans l'espace de travail actuel comme ceci :

do
    windows <- gets (W.index . windowset)
    -- quelque chose...

Ainsi, findWindow peut être implémenté comme ceci :

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 a le type Maybe Window
    case found of
        Nothing -> actionIfNotFound
        Just w -> actionIfFound w

PS : Les trois dernières lignes pourraient être raccourcies en maybe actionIfNotFound actionIfFound found

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X