如何在xmonad中的密钥发布上设置操作?
我不喜欢菜单栏和面板。 而不是像xmobar这样的面板我希望有一个全屏幕的信息页面(时间,当前选定的窗口和工作区等),当我按住一个键组合然后当我按下键时消失。 我可以自己编写信息页面应用程序。 我可以设置信息页面在按键上产生。
我无法在密钥发布上设置任何内容。
如何设置要在密钥发布时执行的操作?
我正在考虑自己扩展xmonad来做到这一点。 我希望我不必这样做,因为它真的很烦人。
答案 0 :(得分:6)
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 ())
答案 1 :(得分:0)
myStartupHook :: X ()
myStartupHook = do
XConf { display = dpy, theRoot = rootw } <- ask
myKeyCode <- io $ (keysymToKeycode dpy xK_Super_R)
io $ grabKey dpy (myKeyCode) anyModifier rootw True grabModeAsync grabModeAsync
spawn "~/ScriptsVcs/hideTint2.sh"
myHook :: Event -> X All
myHook e = do
case e of
ke@(KeyEvent _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) -> do
if ev_keycode ke == 134
then if ev_state ke == 0
then do
-- key has been pressed
spawn "~/ScriptsVcs/showTint2.sh"
else do
spawn "~/ScriptsVcs/hideTint2.sh"
else pure ()
_ -> pure ()
pure $ All True
以上是一个示例。请注意,使用修饰键(ev_state
)可能会发生“键释放”。