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.