我如何检测 XMonad 中的按键/按钮按下事件?
How can I detect a key press / button down event in XMonad?
我尝试通过以下方式手动检测:
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 源代码后,似乎 'events' 只发生在 'registered' 的击键时才会被监听。
注册'keystroke':
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
我尝试通过以下方式手动检测:
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 源代码后,似乎 'events' 只发生在 'registered' 的击键时才会被监听。
注册'keystroke':
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