2014-11-20 6 views
7

Ich möchte mit den Tasten 6 und 7 (die Wipptasten auf beiden Seiten des Rades) auf meine Maus zum vorherigen und nächsten Arbeitsbereich wechseln können. Ich vermute, es hat etwas mit additionalMouseBindings zu tun, und wenn das gleiche Muster wie additionalKeys folgte, wäre ich golden. Leider ist es nicht, und ich verstehe nicht vollständig, wie man eine neue Bindung definiert. Das naive:xmonad - Arbeitsbereiche mit den Maustasten 6 und 7 wechseln

`additionalMouseBindings` 
[ -- get the middle button to switch views 
    ((0, button6), spawn "xdotool key super+Down") 
, ((0, button7), spawn "xdotool key super+Up") 
] 

funktioniert nicht, aus Gründen, die für jemanden offensichtlich sind, der Haskell und Xmonad kennt.

TIA für irgendwelche Vorschläge.

+0

IIRC, das Kern X11-Protokoll hat nur fünf Tasten. Andere Buttons können mit X-Extensions erkannt werden (XINPUT, vielleicht? Ich habe vergessen), aber ich habe keine Ahnung, ob xmonad auch solche Extensions ausnutzt. – chi

Antwort

4

Von "funktioniert nicht" Ich nehme an, Sie meinen, es kompiliert nicht.

Nach @chi Kommentar, überprüfte ich die Tasten: button6 and 7 are not defined, so dass ein erstes Problem ist. Aber nach this post funktionieren die zusätzlichen Tasten, wenn Sie nur ihre Nummer angeben.

Es sieht so aus, als ob Sie die additionalMouseBindings-Funktion aus dem XMonad.Util.EZConfig-Modul verwenden. Sein Typ ist:

additionalMouseBindings :: XConfig a -> [((ButtonMask, Button), Window -> X())] -> XConfig a 

Sie umgeben es in Backticks, die es in einen Operator verwandelt. Sie zeigen hier nicht den ersten Operanden vom Typ XConfig a, so dass Sie hier einen ersten Fehler haben könnten. Sie sollten etwas von der Form haben:

yourPreviousConfig `additionalMouseBindings` listOfBindings 

Dieser Ausdruck entspricht Ihrer neuen XConfig.

Sie können sehen, dass die Liste der Bindungen für die Maustasten nicht derselbe Typ wie für die Schlüssel ist. Die Elemente der Liste sind vom Typ ((ButtonMask, Button), Window -> X()): Schaltflächen sind einer Funktion zugeordnet, die eine Window übernimmt und X() zurückgibt (während Schlüssel mit Ausdrücken vom Typ X() verknüpft sind). XMonad ruft die hier angegebene Funktion mit dem angeklickten Fenster als Argument auf. Dir ist das Fenster in deinem Fall egal. spawn "xdotool key super+Down" ist vom Typ X(), können Sie das in eine Funktion verwandeln, indem sie ein lambda function eine Window (oder etwas) hat:

((0, 6), \w -> spawn "xdotool key super+Down") 

Oder Sie können const verwenden, um eine konstante Funktion zu erhalten, die immer spawn "xdotool key super+Down" zurück:

((0, 6), const $ spawn "xdotool key super+Down") 

Schließlich scheint es wirklich übertrieben, xdotool zu rufen, um Arbeitsbereiche zu wechseln. Vielleicht verwenden Sie bereits some of the functions of the module here in Ihrer Tastenbelegung? Sie können sie auch in Ihren Mausbindungen verwenden. nextWS und prevWS sind vom Typ X(), Sie müssen also konstante Funktionen mit ihnen machen, wie oben.

+0

Es war tatsächlich ein Kompilierfehler basierend auf dem Fehlen eines Fensterarguments. Deine Vorschläge haben perfekt funktioniert. Ich entschied mich für: '((0, 6), \ w -> moveTo Prev (WSIs notSP))' mit einem geeigneten Scratchpad-Filter definiert. Danke für Ihre Hilfe. –