6

如何设置在 xmonad 中的密钥释放时发生的操作?

我不喜欢菜单栏和面板。而不是像 xmobar 这样的面板,我想要一个全屏的信息页面,(时间、当前选择的窗口和工作区等)在我按住组合键时出现,然后在我放开键时消失。我可以自己编写信息页面应用程序。我可以将信息页面设置为在按键时生成。

我无法设置任何在密钥释放时发生的事情。

如何设置在密钥释放时发生的操作?

我正在考虑自己扩展 xmonad 来做到这一点。我希望我不必这样做,因为它真的很烦人。

4

2 回答 2

7

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 ())
于 2012-07-03T09:28:21.420 回答
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
  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

于 2019-01-24T15:49:13.460 回答