如何在 XMonad 中检测按键/按钮按下事件?

问题描述 投票:0回答:1

我尝试通过以下方式手动检测这一点:

myHook :: Event -> X All
myHook e = do
  liftIO $ logToTmpFile $ show e
  pure $ All True

但是,按下

modm
(
hyper
/
windows
) 的按键时,它只会显示:

PropertyEvent {ev_event_type = 28, ev_serial = 12080, ev_send_event = False, ev_event_display = Display 0x0000000000df2340, ev_window = 27262982, ev_atom = 353, ev_time = 20662387, ev_propstate = 0}

这看起来相当通用,不同的键似乎也发出相同的事件。


检查 XMonad 源代码后,似乎“事件”仅发生在“注册”以供监听的击键上。

x11 xorg xmonad
1个回答
0
投票

xK_Super_R
注册“按键”为例:

import Data.Monoid (All(..)) 

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

还有

myHook :: Event -> X All
myHook e = do
  liftIO $ logToTmpFile $ show e
  pure $ All True

然后将这些添加到配置中的

startupHook
handleEventHook
值中。

我看到以下输出:

KeyEvent {ev_event_type = 3, ev_serial = 2866, ev_send_event = False, ev_event_display = Display 0x0000000001217340, ev_window = 1056, ev_root = 1056, ev_subwindow = 25166105, ev_time = 4248223, ev_x = 1014, ev_y = 1038, ev_x_root = 1014, ev_y_root = 1038, ev_state = 64, ev_keycode = 134, ev_same_screen = True
© www.soinside.com 2019 - 2024. All rights reserved.