특정 창이나 특정 작업 공간에 초점이 맞춰져 있을 때 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~8에서는 Alt 키이고 작업 공간 9에서는 왼쪽 Winkey입니다. 이것도 좋은데, 이러한 솔루션은 현재 초점이 맞춰진 창을 기반으로 쉽게 수정될 수 있을 것입니다.

답변1

이것은 실패했습니다. XMonad는 예상대로 작동하지만 애플리케이션이 누른 키를 수신하지 않습니다. 내 말은, 다섯 번째 작업 공간에서는 modKey로 winkey를 사용하고 다른 작업 공간에서는 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
}

수정된 키 목록은 수정자와 함께 사용되며(이 예에서는 5번째 작업 공간에 Winkey가 있고 다른 모든 작업 공간에는 Alt가 그대로 유지됨) unmodifiedKeys 목록이 그대로 사용됩니다.

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

관련 정보