当聚焦特定窗口或特定工作区时,如何在 Xmonad 中更改 modMask?

Ale*_*sev 5 x11 xmonad

我使用 left Alt 作为我的主要 modkey,但对于某些应用程序,我想使用 Alt+keys 作为我的绑定,对于那个特定的应用程序,我希望 left winkey 作为我的 modkey。

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

在哪里

pp = dzenPP {
    -- more stuff
}
Run Code Online (Sandbox Code Playgroud)

我可以在我的 logHook 中获取当前窗口的名称

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

但我不明白如何在我的主要功能中替换 modMask,在 defaultConfig 中,即时。

如果在一个工作区 modkey 会有所不同,我也会很高兴。比如说,在工作区 1 到 8 上,它是一个 Alt 键,而在第 9 处,它是左边的 Winkey。这也可以,我敢打赌,这种解决方案可以很容易地修改为基于当前聚焦的窗口。

Ale*_*sev 2

这失败了。XMonad 按预期工作,但应用程序不接收按下的按键。我的意思是,我在第五个工作区上使用 winkey 作为 modKey,在其他工作区上使用 altkey。我曾经使用 modKey+number 来切换工作区。当我在第五个工作区上按 Alt+2 时,XMonad 不执行任何操作(这是正确的),应用程序也不执行任何操作(这是错误的)。Chrome 不会切换到第二个选项卡,依此类推。

\n\n
\n\n

好的,我设法使用XMonad.Actions.PerWorkspaceKeys做到了。

\n\n

相关配置:

\n\n
import XMonad.Actions.PerWorkspaceKeys\n\nworkspaceModkeys = [ (mod1Mask, map show ([1..4] ++ [6..9])) -- use Alt as modkey on all workspaces\n                   , (mod4Mask, ["5"])                       -- save 5th (use Win there)\n                   ]\n\nmodifiedKeysList conf =\n  [ ((0,         xK_Return), spawn $ XMonad.terminal conf)  -- launch a terminal\n  , ((shiftMask, xK_c     ), kill)  -- close focused window\n  ]\n\nunmodifiedKeys conf =\n  [ ((0, xF86XK_AudioPlay ), spawn "mpc toggle")\n  , ((0, xF86XK_AudioStop ), spawn "mpc stop")\n  ]\n\nkeysList conf = concat (map modifyKey (modifiedKeysList conf)) ++ (unmodifiedKeys conf)\n\nmodifyKey :: ((KeyMask, KeySym), X()) -> [((KeyMask, KeySym), X())]\nmodifyKey k = map (f k) workspaceModkeys\n  where\n    f ((mask, key), action) (mod, workspaces) = ((mask .|. mod, key), bindOn (map (\\w -> (w, action)) workspaces))\n\nmyKeys conf = M.fromList $ keysList conf\n\nmain = xmonad $ defaultConfig {\n  keys = myKeys\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

列表modifiedKeys将使用修饰符(在此示例中,\xe2\x80\x94 Winkey位于第5个工作区,并在所有其他工作区上保留Alt),列表unmodifiedKeys按原样使用。

\n\n

稍后仍然可能会研究特定于窗口的键,但我现在已经完成了。

\n