Как я могу обнаружить событие нажатия клавиши/кнопки в 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 кажется, что «события» происходят только для нажатий клавиш, которые «зарегистрированы» для прослушивания.


person Chris Stryczynski    schedule 19.01.2019    source источник
comment
stackoverflow.com/questions/6605399/   -  person jnr    schedule 20.01.2019


Ответы (1)


Чтобы зарегистрировать «нажатие клавиши»:

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
person Chris Stryczynski    schedule 20.01.2019