Skript zum Vertauschen der primären und sekundären Maustasten

Skript zum Vertauschen der primären und sekundären Maustasten

Diese Antwortzeigt die Befehlszeilen zum Vertauschen der primären und sekundären Maustaste an. Ich hätte jedoch gerne ein Skript, das bei jeder Ausführung automatisch die Maustasten vertauscht. Kann mir jemand einen Tipp geben, wie das geht? Ich weiß so gut wie nichts über Bash-Skripte.

Antwort1

xinput listOhne die Ausgabe von on bereitzustellendeinSystem, kann niemand eine Antwort anbieten, die Sie direkt verwenden könnten. Das liegt daran, dass xinputandere Geräte angezeigt werden können als inWie tausche ich die Maustasten am Terminal so aus, dass sie für Linkshänder geeignet sind?.

Hier ist beispielsweise die Ausgabe unter OSX:

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ xquartz virtual pointer                   id=6    [slave  pointer  (2)]
⎜   ↳ pen                                       id=8    [slave  pointer  (2)]
⎜   ↳ cursor                                    id=9    [slave  pointer  (2)]
⎜   ↳ eraser                                    id=10   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ xquartz virtual keyboard                  id=7    [slave  keyboard (3)]

und hier ist die Ausgabe auf meinem Debian/testing:

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ VMware VMware Virtual USB Mouse           id=7    [slave  pointer  (2)]
⎜   ↳ VirtualPS/2 VMware VMMouse                id=9    [slave  pointer  (2)]
⎜   ↳ VirtualPS/2 VMware VMMouse                id=10   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=8    [slave  keyboard (3)]

so dass auf einem System möglicherweise eine ID zur Auswahl steht (virtueller Zeiger von xquartz), während es auf einem anderen System drei Möglichkeiten gibt. Wenn Sie diese durchlesen, werden Sie feststellen, dass die hier angeführten Beispiele nicht konstruiert sind:

Angesichts der Variation (und vagenDokumentation fürxinput), können Sie den Teil zum Abrufen der ID des Mausgeräts wahrscheinlich nicht automatisieren.

Angenommen, Sie wählen einen verwendbaren Bezeichner und nennen diesen der Diskussion halber "12". Ein Skript kann die Ausgabe von

xinput get-button-map 12

in ein Array. Einige Skriptsprachen bieten Arrays an, z. B. bash. Es gibt jedoch mehrere Fallstricke:

  • Auf meinem OSX-System wird eine Liste „1 2 3“ zurückgegeben, während es auf dem Debian-System eine Liste „1 2 3 4 5 6 7 8 9 10 11 12“ zurückgibt.
  • Sie müssen raten, ob die zusätzlichen Schaltflächen etwas bedeuten, und
  • selbst die Zuordnung dreier Tastennummern kann unter Umständen nicht eindeutig links/mitte/rechts sein.

Dann muss das Skript zum Umschalten der Tasten seinen Zustand irgendwo speichern, z. B. in einer Datei in Ihrem Home-Verzeichnis. Ein Skript, das das verwaltet, müsste

  • Initialisieren Sie die Datei mit den aktuellen Schaltflächen
  • aktualisiere es entsprechend deinem Schema der Umschaltflächen (bei 3 gibt es "3!" mögliche Anordnungen)

Angenommen, Sie verfügen über die einfachste Konfiguration (und Interpretation), könnten Sie in einem Skript etwa Folgendes tun:

#!/bin/sh
id=$1
cfg=$HOME/.mousebuttons
[ -f "$cfg" ] || xinput get-button-map $id | awk ' { printf "normal: %s\n", $0; }' >$cfg
mode=$(awk '{print $1;}' <$cfg)
# read and toggle
list=$(awk '{printf "%d %d %d\n", $3, $2, $4; }' <$cfg)
if [ "x$mode" = "xnormal" ]
then
    mode=reverse
else
    mode=normal
fi
# update the configuration
echo "$mode $list" | awk '{ printf "%s %d %d %d\n", $1, $2, $3, $4; }' >$cfg
xinput set-button-map $id $list
# show result
xinput get-button-map $id

Das Skript akzeptiert einen Parameter (die Kennung des Mausgeräts). Für das angegebene Beispiel (und indem Sie das Skript „toggle-buttons“ nennen, es ausführbar machen und in Ihr packen $PATH):

toggle-buttons 12

sollte den Job machen.

Antwort2

Ich werde meine eigene Lösung hinzufügen, da die anderen Antworten für die einfache Aufgabe, die primären Tasten (1 und 3) einer Maus zu vertauschen, manchmal zu kompliziert erscheinen.

#!/bin/bash                                                                                           
set -e

# To get the name of a devices, do "xinput list --name-only"                                          
DEVICE_NAME="PixArt Microsoft USB Optical Mouse"

current_button_map=$(xinput get-button-map "$DEVICE_NAME")

if [[ $current_button_map =~ "1 2 3" ]]; then
    echo "Making the mouse a lefty"
    xinput set-button-map "$DEVICE_NAME" 3 2 1
else
    echo "Making the mouse a righty"
    xinput set-button-map "$DEVICE_NAME" 1 2 3
fi

Antwort3

Ich würde so etwas tun wie:

#!/bin/sh

mxid=$(xinput --list --short | awk '/Razer/{gsub(/.*id=/, "");gsub(/[[:blank:]].*/, "");print}')
bmap=$(xinput get-button-map $mxid)
nmap=$(awk '{s=$1;$1=$3;$3=s};1' <<<$bmap)
xinput set-button-map $mxid $nmap

Dies setzt voraus, dass Sie den „Namen“ Ihrer Maus kennen (in meinem Fall ist es Razer) und dass Sie die Standard-Tastenbelegung kennen (d. h. welche Tasten links und rechts sind, damit Sie sie vertauschen können), die Sie mit erhalten xinput list $mxid:

Button labels: "Button Left" "Button Middle" "Button Right"....

Und xinput get-button-map $mxid:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Wie Sie in meinem Fall sehen, liest das obige 1 =>> leftSkript 3 =>> righteinfach die aktuelle Zuordnung, vertauscht den ersten und dritten Wert und legt dann die neue Zuordnung fest.

Antwort4

Wenn Sie einen Zustand umschalten müssen (und das Umkehren/Aufheben der Reihenfolge der Maustasten ist ein solcher Zustand), müssen Sie entweder den aktuellen Zustand des Geräts abfragen können oder den Zustand in einer Datei speichern.

Da ich nicht herausfinden konnte, ob xinputes eine Möglichkeit gibt, die Tastenbelegung einer Maus abzufragen, sollten Sie den Status wahrscheinlich in einer Datei speichern, z. B. ~/.config/mousebuttons. Ihr Skript sollte bei der Ausführung „reverse“ in die Datei schreiben:

xinput set-button-map 12 3 2 1 und schreibe „normal“ in diese Datei, wenn du Folgendes ausführst:

xinput set-button-map 12 2 3 Die tatsächlich auszuführende Aktion hängt vom Lesen der Datei ab: Führen Sie den ersten Schritt aus, wenn der Dateiinhalt beim Starten des Skripts lautet normal(oder die Datei nicht existiert), und führen Sie den zweiten Schritt aus, wenn der Inhalt lautet reverse.

Der Dateiinhalt wechselt bei jedem Aufruf von reversezu normal. Ihr tatsächlicher Status spiegelt möglicherweise nicht den Inhalt der Datei wider, z. B. nach einem Neustart. Drucken Sie daher den neuen Status auch auf dem Bildschirm aus, um eine visuelle Erinnerung zu haben. Wenn die Datei nicht mit dem Status synchronisiert ist, wird sie durch einen einzigen Aufruf Ihres Skripts wieder synchronisiert.

verwandte Informationen