¿Cómo puedo cambiar el comportamiento de las teclas de acceso rápido en xmonad si el programa se está ejecutando?

12

Estoy usando algunas asignaciones de teclas en mi xmonad.hsarchivo de configuración:

...
    , 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 tercera asignación se ejecuta firefoxal presionar ctrl+f. Me gustaría hacer algo más complejo:

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

Y me gustaría cambiar ctrl+fa win+f. ¿Cómo puedo hacer eso?

xralf
fuente
¿Es el crossposting como este (aquí y en stackoverflow) realmente un negocio habitual?
ДМИТРИЙ МАЛИКОВ
No: se desaconseja activamente ...
jasonwryan
Está fuera de tema en SO, así que les pedí que se deshicieran de su copia
Michael Mrozek
@ dmitry.malikov Este parece ser el mejor lugar para la pregunta.
xralf
Aun mejor; xralf eliminó la copia SO. Muchas gracias
Michael Mrozek

Respuestas:

8

Mirando los paquetes contrib de XMonad , encontrará XMonad.Actions.WindowGo, que exporta la siguiente función :

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

que toma un argumento de cadena del programa para ejecutarse , por ejemplo, "firefox"; y una consulta booleana que se utiliza para averiguar si ya se está ejecutando , a través de las propiedades X11, por ejemplo (className =? "Firefox")(consulte la parte superior de la XMonad.Actions.WindowGopágina para conocer las variantes).

Por lo tanto, todo lo que necesita es vincularse runOrRaiseMaster "firefox" (className =? "Firefox")a la clave que desea, como se explica enXMonad.Doc.Extending , a través de

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

como parte de las combinaciones Data.Mapde teclas de su configuración (los detalles difieren con su forma de configuración, es decir, la totalidad de su xmonad.hs, consulte Agregar combinaciones de teclas ).

Tenga en cuenta que no tiene sentido maximizar la ventana en XMonad. Cuando configure las cosas como se explica, tendrá Mod4+ factuar de la siguiente manera:

  • si hay una ventana con un nombre de clase que coincida con "Firefox", se enfocará y configurará como maestro , es decir, dependiendo de su diseño reciente , será la ventana grande
  • Si no hay coincidencias ventana, Firefox se generó y ajustado a maestro .

La maximización se puede emular eligiendo el Fulldiseño después de llamar runOrRaiseMaster, como se describe aquí :

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

(tenga en cuenta que este ejemplo también demuestra que XMonad.Util.EZConfigpermite definiciones de combinación de teclas más fáciles)

Combinar estas dos cosas también es posible. Ambos son de tipo X (), es decir, están en la X Mónada . Usando >>, que es de tipo (consulte con :t (>>)en ghci)

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

también tenemos (runOrRaiseMaster "firefox" (className =? "Firefox")) >> (sendMessage $ JumpToLayout "Full")una combinación de dos X ()tipos de tipos X ()y, por lo tanto, puede vincularse a una clave.

EDITAR Falta )en la línea de código con>>

Editar2 modm -> modMask.

Edit3 Esto con xmonad.hssuerte funciona.

( ¿Por qué no aprender un Haskell por un gran bien? )

sr_
fuente
Gracias por la respuesta de trabajo y otra información y el tutorial de Haskell. Me gusta la sintaxis y el paradigma funcional de Haskell. Lo único que no funciona es que >> (sendMessage $ JumptoLayout "Full")hay un error con el constructor. Tal vez sea algo fácil, que resolveré después de aprender Haskell.
xralf
Olvidé: Sin embargo, el modmno funciona, todavía estoy usando controlMask.
xralf
@xralf, (1) faltaba un soporte, ¿funciona ahora? (2) Necesitaría tu todo xmonad.hspara arreglar esto; mejor solo mire por aquí, el archivo de configuración y vea cómo otros lo hacen o usan lo mencionado EZConfig.
Sr_
El soporte no ayudó. Aquí está el archivo xmonad.hs que estoy usando.
xralf
(1) Los corchetes siguen siendo incorrectos, la acción de tipo X ()para vincular a la clave debería ser (runOrRaiseMaster ...) >> (sendMessage ...), lo que resulta en ,((...,...), (runOrR...) >> (send...) ) (un (antes run...)
sr_