¿Cómo cambiar modMask en Xmonad cuando una ventana específica está enfocada o en un espacio de trabajo específico?

¿Cómo cambiar modMask en Xmonad cuando una ventana específica está enfocada o en un espacio de trabajo específico?

Estoy usando Alt izquierda como mi tecla de modificación principal, pero para determinadas aplicaciones me gustaría usar las teclas Alt+ como mis enlaces, y para esa aplicación específica quiero que la tecla Winkey izquierda sea mi tecla de modificación.

Parece que logHook es el lugar correcto para conectar esta lógica, pero tengo problemas para entender cómo hacerlo.

Muy simplificada, mi configuración 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
  }

dónde

pp = dzenPP {
    -- more stuff
}

Podría obtener el nombre de la ventana actual en mi logHook

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

pero no entiendo cómo reemplazar modMask en mi función principal, en defaultConfig, sobre la marcha.

También me alegraría si en un espacio de trabajo la clave de mod fuera diferente. Digamos que en los espacios de trabajo del 1 al 8 es la tecla Alt y en el noveno es la tecla Winkey izquierda. Esto también funcionaría bien, y apuesto a que dicha solución se puede modificar fácilmente para que se base en la ventana enfocada actualmente.

Respuesta1

Esto falló. XMonad funciona como se esperaba, pero las aplicaciones no reciben las teclas presionadas. Quiero decir, uso winkey como modKey en el quinto espacio de trabajo y altkey en otros espacios de trabajo. Solía ​​cambiar de espacio de trabajo con modKey+número. Cuando presiono Alt+2 en el quinto espacio de trabajo, XMonad no hace nada (lo cual es correcto) y la aplicación no hace nada (lo cual es incorrecto). Chrome no cambia a la segunda pestaña, y así sucesivamente.


Bien, logré hacerlo, usandoXMonad.Actions.PerWorkspaceKeys.

Configuración 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
}

La lista de claves modificadas usará un modificador (en este ejemplo, Winkey en el quinto espacio de trabajo y Alt izquierda en todos los demás), la lista de claves no modificadas se usa tal como está.

Es posible que aún busque las claves específicas de la ventana más adelante, pero por ahora ya terminé.

información relacionada