Come posso modificare il comportamento dei tasti di scelta rapida in xmonad se il programma è in esecuzione?


12

Sto usando alcune mappature chiave nel mio xmonad.hsfile di configurazione:

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

La terza mappatura viene eseguita firefoxquando si preme ctrl+f. Vorrei fare qualcosa di più complesso:

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

E vorrei passare ctrl+fa win+f. Come posso fare ciò?


Il crossposting come questo (qui e su StackOverflow) è davvero un affare normale?
ДМИТРИЙ МАЛИКОВ

No: è attivamente scoraggiato ...
Jasonwryan,

È fuori tema su SO, quindi ho chiesto loro di sbarazzarsi della loro copia
Michael Mrozek

@ dmitry.malikov Questo sembra essere il posto migliore per la domanda.
xralf,

Anche meglio; xralf ha eliminato la copia SO. Mille grazie
Michael Mrozek

Risposte:


8

Osservando i pacchetti contrib di XMonad , troverai XMonad.Actions.WindowGoche esporta la seguente funzione :

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

che richiede l' esecuzione di un argomento stringa del programma , ad esempio "firefox"; e una query booleana che viene utilizzata per scoprire se è già in esecuzione , tramite le proprietà X11, ad esempio (className =? "Firefox")(vedere le varianti della parte superiore della XMonad.Actions.WindowGopagina ).

Quindi, tutto ciò che serve è legare runOrRaiseMaster "firefox" (className =? "Firefox")alla chiave desiderata, come spiegato inXMonad.Doc.Extending , tramite

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

come parte delle combinazioni Data.Mapdi tasti della tua configurazione (i dettagli differiscono dal modo in cui le impostazioni sono impostate, ovvero da tutto il tuo xmonad.hs, vedi Aggiunta di associazioni di tasti ).

Nota che non ha alcun senso nel massimizzare una finestra in XMonad. Quando imposti le cose come spiegato, avrai Mod4+ fagire come segue:

  • se c'è una finestra con un nome di classe corrispondente a "Firefox", verrà focalizzata e impostata su master , ovvero, a seconda del layout recente , sarà la finestra grande
  • se nessuna finestra corrisponde, Firefox verrà generato e impostato su master .

L'ottimizzazione può essere emulata scegliendo il Fulllayout dopo la chiamata runOrRaiseMaster, come descritto qui :

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

(si noti che questo esempio dimostra anche come XMonad.Util.EZConfigconsentire definizioni di legatura dei tasti più semplici)

È anche possibile combinare queste due cose. Entrambi sono di tipo X (), cioè, sono in X Monade . Utilizzo >>di tipo (verificare con :t (>>)in ghci)

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

abbiamo (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")anche una combinazione di due X ()tipi di tipo X ()e può quindi essere associato a una chiave.

EDIT mancante )nella riga di codice con>>

Modifica2 modm -> modMask.

Edit3 Questo si spera funzioni .xmonad.hs

( Perché non imparare un Haskell per l'ottimo bene? )


Grazie per la risposta di lavoro e altre informazioni e tutorial Haskell. Mi piace la sintassi di Haskell e il paradigma funzionale. L'unica cosa che non funziona è la parte in cui >> (sendMessage $ JumptoLayout "Full")c'è qualche errore con il costruttore. Forse è qualcosa di facile, che risolverò dopo aver appreso Haskell.
xralf,

Ho dimenticato: eppure modmnon funziona, sto ancora usando controlMask.
xralf,

@xralf, (1) mancava una parentesi: ora funziona? (2) Avrei bisogno del tuo intero xmonad.hsper risolvere questo problema; meglio dare un'occhiata qui, all'archivio di configurazione e vedere come lo fanno gli altri o usare il menzionato EZConfig.
sr_

La parentesi non ha aiutato. Ecco il file xmonad.hs che sto usando.
xralf,

(1) Le parentesi sono ancora sbagliate, l'azione del tipo X ()da associare alla chiave dovrebbe essere (runOrRaiseMaster ...) >> (sendMessage ...), risultante in ,((...,...), (runOrR...) >> (send...) ) (a (prima run...)
sr_
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.