Como alterar o modMask no Xmonad quando uma janela específica está focada ou em um espaço de trabalho específico?

Como alterar o modMask no Xmonad quando uma janela específica está focada ou em um espaço de trabalho específico?

Estou usando o Alt esquerdo como meu modkey principal, mas para determinados aplicativos eu gostaria de usar as teclas Alt + como minhas ligações e, para esse aplicativo específico, quero que o winkey esquerdo seja meu modkey.

Parece que logHook é o lugar certo para conectar essa lógica, mas tenho dificuldade em entender como fazê-lo.

Muito simplificado, minha configuração se parece com

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
  }

onde

pp = dzenPP {
    -- more stuff
}

Eu poderia obter o nome da janela atual no meu logHook

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

mas não entendo como substituir o modMask na minha função principal, no defaultConfig, na hora.

Eu também ficaria feliz se em um espaço de trabalho o modkey fosse diferente. Digamos que nos espaços de trabalho 1 a 8 é uma tecla Alt e no 9º é o Winkey esquerdo. Isso também funcionaria, e aposto que essa solução pode ser facilmente modificada para se basear na janela atualmente em foco.

Responder1

Isso falhou. O XMonad funciona conforme o esperado, mas os aplicativos não recebem teclas pressionadas. Quer dizer, eu uso winkey como modKey no 5º espaço de trabalho e altkey em outros espaços de trabalho. Eu costumava trocar de espaço de trabalho com modKey+number. Quando pressiono Alt+2 no 5º espaço de trabalho, o XMonad não faz nada (o que é correto) e o aplicativo não faz nada (o que é errado). O Chrome não muda para a segunda guia e assim por diante.


Ok, então consegui fazer isso, usandoXMonad.Actions.PerWorkspaceKeys.

Configuração relacionada:

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
}

Lista modificadaKeys usará modificador (neste exemplo - Winkey no 5º espaço de trabalho e Alt esquerdo em todos os outros), lista não modificadaKeys é usada como está.

Ainda posso examinar as chaves específicas da janela mais tarde, mas por enquanto terminei.

informação relacionada