Как я могу настроить действие, которое будет происходить с выпуском ключа в xmonad? - PullRequest
5 голосов
/ 07 июля 2011

Как настроить действие, выполняемое при отпускании ключа в xmonad?

Мне не нравятся строки меню и панели.Вместо панели, такой как xmobar, я хочу иметь полноэкранную страницу информации (время, текущее выбранное окно, рабочее пространство и т. Д.), Когда я удерживаю комбинацию клавиш, а затем исчезаю, когда я отпускаю клавиши.Я мог бы сам написать приложение для информационной страницы.Я могу настроить отображение информационной страницы при нажатии клавиши.

Я не могу установить, чтобы что-либо происходило при отпускании клавиши.

Как я могу настроить действие, которое будет происходить при отпускании клавиши?

Я подумываю над расширением xmonad для этого.Я надеюсь, что мне не нужно, потому что это было бы очень раздражающим.

Ответы [ 2 ]

6 голосов
/ 03 июля 2012

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 ())
0 голосов
/ 24 января 2019
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).

...