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 に答える