2011-07-07 12 views
5

xmonadのキーリリースで発生するアクションを設定するにはどうすればよいですか?xmonadのキーリリースで発生するアクションを設定するにはどうすればよいですか?

メニューバーやパネルが嫌いです。 xmobarのようなパネルの代わりに、私はキーコンボを押したままにしてから、キーを離したときに消えてしまい、フルスクリーンの情報ページ(時間、現在選択されているウィンドウとワークスペースなど)を表示したい。 自分で情報ページアプリケーションをコーディングすることができました。 キープレスで情報ページを生成するように設定できます。

キーリリースで何か起こるように設定することはできません。

キーリリースで発生するようにアクションを設定するにはどうすればよいですか?

これを行うにはxmonadを自分で拡張することを検討しています。 私は本当に迷惑なので、私は持っていないことを願っています。

答えて

5

XMonadはhandleEventHookに、KeyPressイベントのイベントを含むすべての受信したイベントを、渡すので、このコードは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 

残念ながら、これはまだ動作しません。それが唯一の定期的なkeys構成で対応するエントリを持ってKeyReleaseイベントに反応します。これは、がXMonad.Mainで、keysに記載されているキーのみを取得しているためです。 KeyUpで処理するすべてのコンビネーションに対してダミーアクションを定義することで回避できます。

myKeys [email protected](XConfig {XMonad.modMask = modMask}) = M.fromList $ 
    ... 
    , ((modMask    , xK_v ), return()) 
関連する問題