Wie ändere ich die ModMaske in Xmonad, wenn ein bestimmtes Fenster oder ein bestimmter Arbeitsbereich fokussiert ist?

Wie ändere ich die ModMaske in Xmonad, wenn ein bestimmtes Fenster oder ein bestimmter Arbeitsbereich fokussiert ist?

Ich verwende die linke Alt-Taste als meine primäre Modtaste, aber für bestimmte Anwendungen möchte ich Alt+Tasten als meine Bindungen verwenden und für diese spezielle Anwendung möchte ich, dass die linke Win-Taste meine Modtaste ist.

Es scheint, dass logHook der richtige Ort ist, um diese Logik einzubinden, aber ich habe Probleme zu verstehen, wie das geht.

Stark vereinfacht sieht meine Konfiguration so aus:

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
  }

Wo

pp = dzenPP {
    -- more stuff
}

Ich konnte den Namen des aktuellen Fensters in meinem LogHook abrufen.

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

aber ich verstehe nicht, wie ich modMask in meiner Hauptfunktion in defaultConfig spontan ersetzen kann.

Ich wäre auch froh, wenn die Modkey-Taste in einem Arbeitsbereich anders wäre. Sagen wir, in den Arbeitsbereichen 1 bis 8 ist es eine Alt-Taste und im 9. die linke Winkey-Taste. Das würde auch gut funktionieren, und ich wette, eine solche Lösung kann leicht so geändert werden, dass sie auf dem aktuell fokussierten Fenster basiert.

Antwort1

Dies ist fehlgeschlagen. XMonad funktioniert wie erwartet, aber Anwendungen empfangen keine gedrückten Tasten. Ich meine, ich verwende Winkey als ModKey im 5. Arbeitsbereich und Altkey in anderen Arbeitsbereichen. Früher habe ich mit ModKey+Nummer zwischen Arbeitsbereichen gewechselt. Wenn ich im 5. Arbeitsbereich Alt+2 drücke, tut XMonad nichts (was richtig ist) und die Anwendung tut nichts (was falsch ist). Chrome wechselt nicht zur 2. Registerkarte und so weiter.


Okay, ich habe es geschafft, mitXMonad.Actions.PerWorkspaceKeys.

Zugehörige Konfiguration:

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
}

Die Liste „modifiedKeys“ verwendet den Modifikator (in diesem Beispiel Winkey im 5. Arbeitsbereich und linke Alt-Taste in allen anderen), die Liste „unmodifiedKeys“ wird unverändert verwendet.

Vielleicht werde ich mir später noch die fensterspezifischen Tasten ansehen, aber fürs Erste bin ich fertig.

verwandte Informationen