2011-07-07 9 views
5

¿Cómo puedo configurar una acción para que ocurra en un lanzamiento de clave en xmonad?¿Cómo puedo configurar una acción para que ocurra en un lanzamiento de clave en xmonad?

No me gustan las barras y paneles de menú. En lugar de un panel como xmobar, quiero tener una página de información completa, (tiempo, ventana y espacio de trabajo actualmente seleccionados, etc.) aparecen cuando mantengo presionada una combinación de teclas y luego desaparezco cuando dejo las teclas. Pude codificar la aplicación de la página de información yo mismo. Puedo configurar la página de información para generar al presionar una tecla.

No puedo configurar nada en un lanzamiento de tecla.

¿Cómo puedo configurar una acción para que ocurra en un lanzamiento de tecla?

Estoy considerando extender xmonad para hacer esto. Espero que no tenga que hacerlo porque sería realmente molesto.

Respuesta

5

xmonad pasa todos los eventos recibidos, incluidos los eventos KeyPress, a la handleEventHook, por lo que este código podría ser capaz de reaccionar en keyRelease eventos:

module KeyUp where 

import Data.Monoid 
import qualified Data.Map as M 

import XMonad 
import Control.Monad 

keyUpEventHook :: Event -> X All 
keyUpEventHook e = handle e >> return (All True) 

keyUpKeys (XConf{ config = XConfig {XMonad.modMask = modMask} }) = M.fromList $ 
    [ ((modMask, xK_v), io (print "Hi")) ] 

handle :: Event -> X() 
handle (KeyEvent {ev_event_type = t, ev_state = m, ev_keycode = code}) 
    | t == keyRelease = withDisplay $ \dpy -> do 
     s <- io $ keycodeToKeysym dpy code 0 
     mClean <- cleanMask m 
     ks <- asks keyUpKeys 
     userCodeDef() $ whenJust (M.lookup (mClean, s) ks) id 
handle _ = return() 

Usted lo utilizaría como que en su archivo xmonad.hs:

handleEventHook = handleEventHook defaultConfig `mappend` 
        keyUpEventHook `mappend` 
        fullscreenEventHook 

Desafortunadamente, esto no funciona todavía: Sólo reaccionará en KeyRelease eventos que tienen una entrada correspondiente en la configuración normal keys. Esto se debe a grayKeys en XMonad.Main, utilizando solo las claves mencionadas en keys. Puede solucionar esto definiendo una acción ficticia para cada combinación que desee controlar en KeyUp:

myKeys [email protected](XConfig {XMonad.modMask = modMask}) = M.fromList $ 
    ... 
    , ((modMask    , xK_v ), return()) 
Cuestiones relacionadas