特定のウィンドウまたは特定のワークスペースに焦点を当てているときにXmonadでmodMaskをどのように変更しますか?

特定のウィンドウまたは特定のワークスペースに焦点を当てているときにXmonadでmodMaskをどのように変更しますか?

左 Alt を主モードキーとして使用しますが、一部のアプリケーションでは Alt+ キーをバインディングとして使用し、特定のアプリケーションでは左ウィングキーをモードキーとして使用したいと考えています。

logHookがこのロジックを挿入するのに適した場所であるようですが、これを行う方法を理解するのが困難です。

大幅に簡略化された構成は次のとおりです。

import qualified XMonad.StackSet as W
import XMonad
import XMonad.Hooks.DynamicLog

main = do
  -- some stuff
  xmonad $ defaultConfig {
      modMask = mod1Mask  -- left winkey = mod4Mask, left alt = mod1Mask
    , logHook = do
          dynamicLogWithPP pp
  }

どこ

pp = dzenPP {
    -- more stuff
}

logHookから現在のウィンドウの名前を取得できます。

winset <- gets windowset
let wname = fmap getName (W.peek winset) -- here I have some window identificator in Maybe

しかし、私の基本機能のdefaultConfigでmodMaskを動的に置き換える方法を理解していません。

1つのワークスペースでモードキーが異なる場合でも、うれしいです。たとえば、ワークスペース1〜8ではAltキー、ワークスペース9では左側のWinkeyです。これも良いですが、これらのソリューションは現在焦点が合っているウィンドウに基づいて簡単に修正できます。

答え1

これは失敗しました。 XMonadは期待どおりに動作しますが、アプリケーションが押したキーを受け取りません。私は、5番目のワークスペースではmodKeyとしてwinkeyを使用し、他のワークスペースではaltkeyを使用していることを意味します。私はワークスペースを切り替えるためにmodKey +番号を使用しました。 5番目のワークスペースでAlt + 2を押すと、XMonadは何もしません(正しい)、アプリケーションも何もしません(正しくない)。 Chromeは2番目のタブなどに切り替えません。


さて、だから私はそれを使ってそれをすることができましたXMonad.Actions.PerWorkspaceKeys

関連構成:

import XMonad.Actions.PerWorkspaceKeys

workspaceModkeys = [ (mod1Mask, map show ([1..4] ++ [6..9])) -- use Alt as modkey on all workspaces
                   , (mod4Mask, ["5"])                       -- save 5th (use Win there)
                   ]

modifiedKeysList conf =
  [ ((0,         xK_Return), spawn $ XMonad.terminal conf)  -- launch a terminal
  , ((shiftMask, xK_c     ), kill)  -- close focused window
  ]

unmodifiedKeys conf =
  [ ((0, xF86XK_AudioPlay ), spawn "mpc toggle")
  , ((0, xF86XK_AudioStop ), spawn "mpc stop")
  ]

keysList conf = concat (map modifyKey (modifiedKeysList conf)) ++ (unmodifiedKeys conf)

modifyKey :: ((KeyMask, KeySym), X()) -> [((KeyMask, KeySym), X())]
modifyKey k = map (f k) workspaceModkeys
  where
    f ((mask, key), action) (mod, workspaces) = ((mask .|. mod, key), bindOn (map (\w -> (w, action)) workspaces))

myKeys conf = M.fromList $ keysList conf

main = xmonad $ defaultConfig {
  keys = myKeys
}

変更されたキーのリストは修飾子と共に使用されます(この例では、5番目のワークスペースにWinkeyがあり、他のすべてのワークスペースにはAltが残ります)、unmodifiedKeysのリストがそのまま使用されます。

後で識別キーを見ることもできますが、今はそれで終わりました。

関連情報