XMonad передает все полученные события, включая события KeyPress, на handleEventHook
, поэтому этот код сможет реагировать на keyRelease
события:
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 ()
Вы бы использовали это так в своем файле xmonad.hs:
handleEventHook = handleEventHook defaultConfig `mappend`
keyUpEventHook `mappend`
fullscreenEventHook
К сожалению, это пока не работает: он будет реагировать только на KeyRelease
события, которые имеют соответствующую запись в обычной конфигурации keys
. Это связано с тем, что grayKeys
в XMonad.Main
захватывает только ключи, указанные в keys
. Вы можете обойти это, определив фиктивное действие для каждой комбинации, которую вы хотите обработать в KeyUp
:
myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
...
, ((modMask , xK_v ), return ())