如何在xmonad中的密钥发布上设置操作?

Ste*_*lus 6 x11 xmonad

如何在xmonad中的密钥发布上设置操作?

我不喜欢菜单栏和面板.而不是像xmobar这样的面板我希望有一个全屏幕的信息页面(时间,当前选定的窗口和工作区等),当我按住一个键组合然后当我按下键时消失.我可以自己编写信息页面应用程序.我可以设置信息页面在按键上生成.

我无法在密钥发布上设置任何内容.

如何设置在密钥发布上执行的操作?

我正在考虑自己扩展xmonad来做到这一点.我希望我没有,因为它真的很烦人.

Joa*_*ner 6

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 ()
Run Code Online (Sandbox Code Playgroud)

您可以在xmonad.hs文件中使用它:

handleEventHook    = handleEventHook defaultConfig `mappend`
                     keyUpEventHook `mappend`
                     fullscreenEventHook
Run Code Online (Sandbox Code Playgroud)

不幸的是,这还不起作用:它只会对KeyRelease在常规keys配置中具有相应条目的事件做出反应.这是由于grayKeysXMonad.Main,只抓中提到的钥匙keys.您可以通过为要处理的每个组合定义虚拟操作来解决此问题KeyUp:

myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
    ...
    , ((modMask              , xK_v     ), return ())
Run Code Online (Sandbox Code Playgroud)