특정 창에 초점이 맞춰져 있거나 특정 작업 공간에 있을 때 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는 예상대로 작동하지만 응용 프로그램은 누른 키를 수신하지 않습니다. 즉, 5번째 작업공간에서는 winkey를 modKey로 사용하고, 다른 작업공간에서는 Altkey를 사용합니다. 저는 modKey+숫자로 작업 공간을 전환하곤 했습니다. 5번째 작업 공간에서 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
}

수정된 키 목록은 수정자를 사용합니다(이 예에서는 5번째 작업 공간에 Winkey가 있고 다른 모든 작업 공간에는 Alt가 남아 있음). unmodifiedKeys 목록은 그대로 사용됩니다.

나중에 창별 키를 살펴볼 수도 있지만 지금은 끝났습니다.

관련 정보