Como posso alterar o comportamento das teclas de atalho no xmonad se o programa estiver sendo executado?

10

Estou usando alguns mapeamentos de teclas no meu arquivo de configuração xmonad.hs :

...
    , 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")
 ]

O terceiro mapeamento executa firefox ao pressionar ctrl + f . Eu gostaria de fazer algo mais complexo:

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

E eu gostaria de mudar ctrl + f para win + f . Como posso fazer isso?

    
por xralf 11.11.2011 / 20:52

1 resposta

6

Analisando os pacotes de contribuição do XMonad , você encontrará XMonad.Actions.WindowGo , que exporta os following function :

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

que leva um argumento de string do programa para executar , por exemplo "Raposa de fogo"; e uma consulta booleana que é usada para descobrir se ela já está em execução , por meio de propriedades X11, por exemplo (className =? "Firefox") (veja o topo da XMonad.Actions.WindowGo page para variantes).

Então, tudo que você precisa é vincular runOrRaiseMaster "firefox" (className =? "Firefox") à chave desejada, como explicado em XMonad.Doc.Extending , via

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

como parte das combinações de teclas Data.Map da sua configuração (os detalhes diferem da sua configuração, ou seja, de todo o seu xmonad.hs , consulte Adicionando atalhos de teclado ).

Note que não há sentido real em maximizar uma janela no XMonad. Quando você configura as coisas como explicado, você terá Mod4 + f agindo da seguinte forma:

  • se houver uma janela com um nome de classe correspondente a "Firefox", ela será focada e definida como mestre , ou seja, dependendo de sua recente layout , será a grande janela
  • se nenhuma janela corresponder, o Firefox será gerado e definido como mestre .

A maximização pode ser emulada escolhendo o Full layout depois de chamar runOrRaiseMaster , conforme descrito aqui :

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

(observe que este exemplo também demonstra XMonad.Util.EZConfig permitindo definições de atalhos de teclado mais fáceis)

Combinar essas duas coisas é possível também. Ambos são do tipo X () , ou seja, são na X Monad . Usando >> , que é do tipo (verifique com :t (>>) em ghci )

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

temos (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full") como uma combinação de dois X () tipos do tipo X () , e pode, assim, ser vinculado a uma chave.

EDIT Falta ) na linha de código com >>

Editar2 modm - > modMask .

Edit3 Espero que este xmonad.hs funcione.

( Por que não aprender um Haskell para o bem? )

    
por 23.11.2011 / 14:13