當特定視窗對焦或特定工作區時,如何更改 Xmonad 中的 modMask?

當特定視窗對焦或特定工作區時,如何更改 Xmonad 中的 modMask?

我使用左 Alt 作為我的主要模式鍵,但對於某些應用程序,我想使用 Alt+鍵作為我的綁定,並且對於該特定應用程序,我希望左 winkey 作為我的模式鍵。

看來 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 到 8 上它是 Alt 鍵,在工作區 9 上它是左 Winkey。這也很好,我打賭這樣的解決方案可以輕鬆修改為基於當前聚焦的視窗。

答案1

這失敗了。 XMonad 按預期運作,但應用程式不會接收按下的按鍵。我的意思是,我在第五個工作區上使用 winkey 作為 modKey,在其他工作區上使用 altkey。我曾經使用 modKey+number 來切換工作區。當我在第五個工作區上按 Alt+2 時,XMonad 不執行任何操作(這是正確的),應用程式也不執行任何操作(這是錯誤的)。 Chrome 不會切換到第二個選項卡,依此類推。


好的,所以我設法做到了,使用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
}

清單 modifiedKeys 將使用修飾符(在此範例中 - 第 5 個工作區上的 Winkey,並在所有其他工作區上保留 Alt),清單 unmodifiedKeys 會按原樣使用。

稍後仍然可能會研究特定於視窗的鍵,但我現在已經完成了。

相關內容