Comment puis-je changer le comportement des raccourcis clavier dans xmonad si le programme est en cours d'exécution?

12

J'utilise quelques mappages de touches dans mon xmonad.hsfichier de configuration:

...
    , modMask = mod4Mask     -- Rebind Mod to the Windows key
...
 [ ((controlMask, xK_Print), spawn "sleep 0.2; scrot -s")
 , ((0, xK_Print), spawn "scrot")
 , ((controlMask, xK_f), spawn "firefox")
 ]

Le troisième mappage s'exécute firefoxlorsque vous appuyez sur ctrl+f. Je voudrais faire quelque chose de plus complexe:

if (firefox is running):
  focus and maximize firefox window:
else:
  run firefox

Et je voudrais changer ctrl+fpour win+f. Comment puis je faire ça?

xralf
la source
Le crossposting comme celui-ci (ici et sur stackoverflow) est-il vraiment une affaire habituelle?
ДМИТРИЙ МАЛИКОВ
Non: c'est activement découragé ...
jasonwryan
C'est hors sujet sur SO, alors je leur ai demandé de se débarrasser de leur copie
Michael Mrozek
@ dmitry.malikov Cela semble être le meilleur endroit pour la question.
xralf
Encore mieux; xralf a supprimé la copie SO. Merci beaucoup
Michael Mrozek

Réponses:

8

En regardant les paquets de contributions de XMonad , vous trouverez XMonad.Actions.WindowGo, qui exporte la fonction suivante :

runOrRaiseMaster :: String -> Query Bool -> X ()

qui prend un argument de chaîne du programme à exécuter , par exemple "firefox"; et une requête booléenne qui est utilisée pour savoir si elle est déjà en cours d'exécution , via les propriétés X11, par exemple (className =? "Firefox")(voir le haut de la XMonad.Actions.WindowGopage pour les variantes).

Donc, tout ce dont vous avez besoin est de lier runOrRaiseMaster "firefox" (className =? "Firefox")la clé que vous voulez, comme expliqué dansXMonad.Doc.Extending , via

((modMask, xK_f ), runOrRaiseMaster "firefox" (className =? "Firefox"))

dans le cadre des raccourcis clavier Data.Mapde votre configuration (les détails diffèrent selon la façon dont vous les définissez, c'est-à-dire l'ensemble de votre xmonad.hs, voir Ajout de raccourcis clavier ).

Notez qu'il n'y a pas vraiment de sens à maximiser une fenêtre dans XMonad. Lorsque vous configurez les choses comme expliqué, vous aurez Mod4+ fagir comme suit:

  • s'il y a une fenêtre avec un nom de classe correspondant à "Firefox", il sera focalisé et défini sur master , c'est-à-dire, selon votre disposition récente , sera la grande fenêtre
  • si aucune fenêtre ne correspond, Firefox sera généré et défini sur master .

La maximisation peut être émulée en choisissant la Fulldisposition après l'appel runOrRaiseMaster, comme décrit ici :

("M-<F1>", sendMessage $ JumpToLayout "Full")

(notez que cet exemple montre également XMonad.Util.EZConfigcomment permettre des définitions de raccourcis clavier plus faciles)

La combinaison de ces deux choses est également possible. Les deux sont de type X (), c'est-à-dire qu'ils sont dans la X Monade . L' utilisation >>, qui est de type (vérifier avec :t (>>)en ghci)

(>>) :: Monad m => m a -> m b -> m b

nous avons (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")aussi une combinaison de deux X ()types de type X (), et il peut donc être lié à une clé.

EDIT Manquant )dans la ligne de code avec>>

Edit2 modm -> modMask.

Edit3 Cela xmonad.hsfonctionne, espérons-le.

( Pourquoi ne pas vous apprendre un Haskell pour le plus grand bien? )

sr_
la source
Merci pour la réponse de travail et autres informations et tutoriel Haskell. J'aime la syntaxe Haskell et le paradigme fonctionnel. La seule chose qui ne fonctionne pas est la partie où >> (sendMessage $ JumptoLayout "Full")il y a une erreur avec le constructeur. C'est peut-être quelque chose de facile, que je vais résoudre après avoir appris Haskell.
xralf
J'oubliais: pourtant modmça ne marche pas, j'utilise toujours controlMask.
2011
@xralf, (1) il manquait un support - ça marche maintenant? (2) J'aurais besoin de votre entier xmonad.hspour résoudre ce problème; il vaut mieux jeter un œil ici, l'archive de configuration et voir comment les autres le font ou utilisent ce qui est mentionné EZConfig.
sr_
Le support n'a pas aidé. Voici le fichier xmonad.hs que j'utilise.
xralf
(1) Les crochets sont toujours erronés, l'action de type X ()à lier à la clé devrait être (runOrRaiseMaster ...) >> (sendMessage ...), ce qui entraîne ,((...,...), (runOrR...) >> (send...) ) (a (avant run...)
sr_