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

4

Estou usando o Alt esquerdo como meu modkey primário, mas para determinada aplicação eu gostaria de usar as teclas Alt + como minhas ligações, e para esse aplicativo específico eu quero que o winkey esquerdo seja meu modkey.

Parece que o logHook é o lugar certo para ligar essa lógica, mas eu tenho problemas para entender como fazê-lo.

Muito simplificada, minha configuração parece

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 getName 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 eu não entendo como substituir o modMask na minha função principal, no defaultConfig, em tempo real.

Eu também ficaria feliz se em uma tecla de trabalho do espaço de trabalho for diferente. Digamos que, nas áreas de trabalho 1 a 8, seja uma tecla Alt e, no dia 9, fique Winkey. Isso também seria bom, e eu aposto que tal solução pode ser facilmente modificada para se basear em uma janela focada no momento.

    
por Alexander Kusev 06.05.2014 / 14:04

1 resposta

1

Isso falhou. O XMonad funciona como esperado, mas os aplicativos não recebem chaves pressionadas. Quero dizer, eu uso winkey como modKey no quinto espaço de trabalho e altkey em outros espaços de trabalho. Eu costumava mudar espaços de trabalho com o número de modKey +. Quando eu pressiono Alt + 2 no quinto espaço de trabalho, o XMonad não faz nada (o que é correto), e o aplicativo não faz nada (o que está errado). O Chrome não muda para a segunda guia e assim por diante.

Ok, então consegui fazer isso usando XMonad.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 de teclas modificadas usará modificador (neste exemplo - Winkey no quinto espaço de trabalho, e deixou Alt em todos os outros), lista de teclas não modificadas é usada como está.

Ainda pode pesquisar chaves específicas da janela mais tarde, mas estou pronto por enquanto.

    
por 07.05.2014 / 15:35

Tags