Wie ordne ich eine Maustaste auf einer Maus richtig zu?

6063
Hubro

Zusammenfassung der Frage: Ich möchte, dass eine meiner Maustasten Super_Lvon X11 als linke Windows-Schaltfläche registriert wird.


In meinem Fenstermanager kann ich Fenster verschieben, indem Sie die "linke Windows-Taste" (Left Super) gedrückt halten und ein Fenster mit der linken Maustaste ziehen. Ich möchte das können, ohne die Tastatur zu berühren, also möchte ich die linke Supertaste der Maustaste 11 zuordnen, so dass ich die Maustaste 11 gedrückt halten und die Fenster + klicken kann.

Die naheliegendste Lösung ist die Verwendung von xbindkeys und xte wie folgt ( .xbindkeysrc):

"xte 'keydown Super_L'" b:11  "xte 'keyup Super_L'" b:11 + release 

Das funktioniert so:

  • Wenn ich die Maustaste 11 drücke, Super_Lwird auch gedrückt
  • Wenn ich die Maustaste 11 loslasse, Super_Lwird auch losgelassen

Es gibt jedoch ein Problem: Ich kann Fenster nicht mit Super_L+ verschieben, Mouse1wenn ich auch eine andere Maustaste gedrückt halte, z. B. die Maustaste 11. Bei Verwendung der obigen Lösung wird die Maustaste 11 immer noch als gedrückt und freigegeben registriert die Window-Manager-Operationen funktionieren.

Ich habe dies mit Cinnamon und Awesome WM ausprobiert und absolut keine der Super_LTastenkombinationen funktioniert, solange die Maustaste 10 oder 11 gedrückt wird.

Ein unterlegener Hack

Ich arbeite derzeit an diesem Problem, indem Sie den Mausklick veranlassen, dass die Super_LTaste eine bestimmte Zeit gedrückt wird. Auf diese Weise kann ich mit der Maustaste klicken und anschließend etwas für kurze Zeit ziehen:

"xte 'keydown Super_L' 'usleep 250000' 'keyup Super_L'" b:11 

Noch ein Versuch

Wie von totti vorgeschlagen, habe ich diese xbindkeysKonfiguration ausprobiert :

"xte 'mouseup 10' 'keydown Super_L'" b:10  "xte 'keyup Super_L'" b:10 + Release 

Es funktioniert nicht Es scheint, als würde die Super_LTaste gedrückt gehalten, denn sobald ich die Taste 10 loslasse, bleibt sie für immer gedrückt (bis ich die Super_LTaste erneut auf der Tastatur drücke ), aber die Maustaste wird noch registriert, da ich keine Fenster anklicken und ziehen kann . Ich glaube nicht, dass ich mit Hilfe von xbindkeysund diese Arbeit machen kann xte.

12
Anstatt die Maustaste an die Supertaste zu binden, müssen Sie die Zuordnung neu vornehmen. Verwenden Sie dazu ** xmodmap **. Eine vollständige Einrichtung finden Sie auf der Arch Wiki-XModmap-Seite. totti vor 9 Jahren 1
@totti: Die Seite xwashmap des Arch-Wikis beschreibt das Zuordnen von Tasten zu anderen Tasten, das Austauschen von Zusatztasten und das Umkehren des Bildlaufs, nicht jedoch das Zuweisen von Tastaturtasten zu Maustasten Hubro vor 9 Jahren 0
@totti: Mit xmodmap kann ich Tasten anderen Tasten zuordnen, und mit der XKB-Erweiterung für X (und xkbset) kann ich Maustasten Tastaturtasten zuordnen, aber ich versuche, einer Maustaste eine Tastaturtaste zuzuordnen. Ich habe immer noch keinen Weg gefunden, das zu tun. Hubro vor 9 Jahren 0
Versuch: Bei gedrückter Maustaste 11 simulieren Sie Super Hold + Maustaste 11 loslassen. Der Fenstermanager kann jetzt Super-Maus 1 und nicht Maus 11 erkennen. totti vor 9 Jahren 0
@totti: Versuchte und bearbeitete Frage Hubro vor 9 Jahren 0
Unterstützt `compiz config setting manager 'Ihren Fenstermanager? totti vor 9 Jahren 0
Können Sie ein Skript per Mausklick ausführen? totti vor 9 Jahren 0
@totti: Ja kann ich Hubro vor 9 Jahren 0
Ich bin auf der Suche nach einem ähnlichen Hack, um meine Thinkpad 3-Maustasten wieder zu verbinden, um Tastaturereignisse auszulösen. Ich habe die 'xbindkeys' auch von mir herausgefunden. Bis jetzt noch kein Glück? zmo vor 7 Jahren 0
Eine praktische Alternative ist die Möglichkeit, Fenster zu verschieben, indem Sie die kleinen Rechtecke verschieben, die im Plasma-Desktop-Pager angezeigt werden. In einem anderen Hinweis passt die Lösung in diesem Thread (http://askubuntu.com/questions/627555/how-to-map-modifiers-eg-ctrl-to-mouse-thumb-buttons-using-xbindkeys) dein Fall? harrymc vor 7 Jahren 0
In meinem obigen Kommentar [diese Antwort] (http://askubuntu.com/a/717658) macht genau das, was Sie wollen, und leidet nicht daran, dass xbindkeys die gesamte Maus packt. Sehen Sie, ob es in Ihren Fall passt. harrymc vor 7 Jahren 0
Vielen Dank @harrymc dein Link hat sehr geholfen, und ich weiß, dass es eine funktionierende Lösung gibt! Wenn Sie eine Antwort auf die Hauptelemente geben, gebe ich Ihnen die Belohnung ;-) zmo vor 7 Jahren 0
Erledigt wie gewünscht. harrymc vor 7 Jahren 0

4 Antworten auf die Frage

5
harrymc

Ein askubuntu-Beitrag enthält eine Antwort, die ich unten zusammenfassen werde.

Das Problem ist, dass xbindkeys die gesamte Maus erfasst, wodurch die Zuordnung von Modifizierern + Mausklicks unsicher wird. Die Antwort verwendet uinput über ein Python-uinput- Skript, um /dev/my-mousedas Klicken mit der Daumen-Taste zu überwachen und die CtrlTaste an die virtuelle Tastatur zu senden . Hier sind die detaillierten Schritte:

1. Stellen Sie udev-Regeln ein

Für die Maus datei /etc/udev/rules.d/93-mxmouse.conf.rules:

KERNEL=="event[0-9]*", SUBSYSTEM=="input", SUBSYSTEMS=="input",  ATTRS=="Logitech Performance MX", SYMLINK+="my_mx_mouse",  GROUP="mxgrabber", MODE="640" 

Udev sucht nach Kernelgeräten mit Namen wie event5. Das SYMLINK dient zum Auffinden der Maus und ist für /dev/my_mx_mousedie Gruppe lesbar mxgrabber.

Um Hardware-Informationen zu finden, führen Sie Folgendes aus:

udevadm info -a -n /dev/input/eventX 

Für uinput, datei /etc/udev/rules.d/94-mxkey.rules:

KERNEL=="uinput", GROUP="mxgrabber", MODE="660" 

Trennen und stecken Sie die Maus aus oder zwingen Sie udev, die Regeln mit auszulösen udevadm trigger.

2. Aktivieren Sie das UINPUT-Modul

sudo modprobe uinput 

Und in /etc/modules-load.d/uinput.conf:

uinput 

3. Neue Gruppe erstellen

sudo groupadd mxgrabber sudo usermod -aG mxgrabber your_login 

4. Python-Skript

Installieren Sie python-uinput libraryund python-evdev library.

Das folgende Skript erfordert die Identifizierung des Event-Codes der Schaltfläche:

#!/usr/bin/python3.5 # -*- coding: utf-8 -*-  """ Sort of mini driver. Read a specific InputDevice (my_mx_mouse), monitoring for special thumb button Use uinput (virtual driver) to create a mini keyboard Send ctrl keystroke on that keyboard """  from evdev import InputDevice, categorize, ecodes import uinput  # Initialize keyboard, choosing used keys ctrl_keyboard = uinput.Device([ uinput.KEY_KEYBOARD, uinput.KEY_LEFTCTRL, uinput.KEY_F4, ])  # Sort of initialization click (not sure if mandatory) # ( "I'm-a-keyboard key" ) ctrl_keyboard.emit_click(uinput.KEY_KEYBOARD)  # Useful to list input devices #for i in range(0,15): # dev = InputDevice('/dev/input/event{}'.format(i)) # print(dev)  # Declare device patch. # I made a udev rule to assure it's always the same name dev = InputDevice('/dev/my_mx_mouse') #print(dev) ctrlkey_on = False  # Infinite monitoring loop for event in dev.read_loop(): # My thumb button code (use "print(event)" to find) if event.code == 280 : # Button status, 1 is down, 0 is up if event.value == 1: ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 1) ctrlkey_on = True elif event.value == 0: ctrl_keyboard.emit(uinput.KEY_LEFTCTRL, 0) ctrlkey_on = False 

5. Fertigstellung

Machen Sie die Python-Datei ausführbar und stellen Sie sicher, dass sie beim Start geladen wird.

Ich habe das Skript überarbeitet, um den Maustasten einen unbenutzten Keycode zuzuweisen (ich setze sie auf "F13", "F14" und "F15" und deaktiviere die Mausfunktionen mit "xinput".) Dann kann ich diese Tasten einfach neu zuweisen Was auch immer ich mit einer einfachen `xmodmap` brauche: Die Hauptidee ist in [a gist] (https://gist.github.com/guyzmo/12c07a3686282f5896bb2852d9fc204b) entworfen (es gibt einige hartcodierte Werte und ich stelle nicht die xinput-Maus wieder her Funktion hinterher), ich werde einen Blogbeitrag dazu mit der endgültigen Version des Skripts erstellen (und den Link hier veröffentlichen, wenn es fertig ist. Vielen Dank für Ihre Hilfe! ☺ ♥ zmo vor 7 Jahren 0
Überprüfen Sie auch meine neue Antwort in dem anderen Thread auf eine X11-basierte Lösung http://askubuntu.com/a/903389/269589 Maxim vor 7 Jahren 0
1
totti

Da Sie das Skript per Mausklick ausführen können, können Sie den folgenden Trick verwenden.
1. Drücken Sie die Taste 11, um die Supertaste gedrückt zu halten . ( Taste 11 trigers ein Skript)
2. Fenster Bewegen Sie den anderen Maustasten
3. Drücken Sie Maustaste 11 wieder loslassen Superschlüssel

Skript
Verwendung xdotoolhalten Super - Taste
auf den ersten Knopf klicken, wird eine temporäre Datei erstellen und Taste gedrückt halten. Klicken Sie im nächsten Schritt auf tmp-Datei löschen und geben Sie den Schlüssel frei.

aktualisieren

Laut ubuntu- imwheelHilfeseite (viele Tasten mit der Maus, wie zu tun ) kann eine Taste zugeordnet werden.

Ein paar Probleme damit: # 1 Dies ist immer noch ein weiterer Hack / Workaround, der die Frage nicht beantwortet. # 2 xbindkeys funktioniert nicht, wenn die Supertaste gedrückt wird. Es ist, als ob xbindkeys pausiert ist und nichts registriert, bis der Superschlüssel losgelassen wird. Hubro vor 9 Jahren 0
Ok, nach ungefähr 5 Minuten Forschung ziehe ich Punkt 2 zurück. Ich muss anscheinend "+ Mod4" in meiner xbindkeys-Konfiguration hinzufügen, um zu berücksichtigen, dass der Super-Key gedrückt wird. Die von Ihnen vorgeschlagene Problemumgehung ist besser als meine und ich wechsle dazu :-) Aber die Frage ist immer noch nicht beantwortet. Hubro vor 9 Jahren 0
1
Dmitry Grigoryev

Debugging-Vorschlag: Ich würde versuchen, die /dev/input/eventXDatei zu überwachen, um festzustellen, welche Ereignisse generiert werden, wenn Sie diese Taste drücken und loslassen, insbesondere in Kombination mit BTN_LEFT. Hier ist ein Beispielcode für den Einstieg. Sie müssen es natürlich ändern, um alle Ereignisse zu protokollieren, nicht nur Tastendrücke.

Vielleicht möchten Sie die xevAusgabe auch auschecken, wenn Sie dies nicht bereits getan haben. Bei der Analyse beider Protokolle sollte das genaue Problem angezeigt werden.

Möglicherweise generiert Ihre Maus zusätzliche Tastenfreigabeereignisse, wenn mehrere Tasten gedrückt werden. In diesem Fall können Sie die Problemumgehungen für die Tastenbindung verwenden oder die xf86-input-evdevBibliothek ändern, um unerwünschte Ereignisse zu filtern (oder fehlende Ereignisse zu simulieren). Ich habe vor einiger Zeit etwas Ähnliches für einen Touchscreen gemacht, der beim Klicken und Ziehen "Klick" -Ereignisse erzeugte. Die Idee war, "Freigabe" -Ereignisse, die fast gleichzeitig (innerhalb eines kleinen Zeitfensters) stattfanden, mit "Klick" -Ereignissen zu filtern. Wenn meine Vermutung richtig ist, müssen Sie im Wesentlichen etwas Ähnliches implementieren.

1
DreadPirateLynx

I figured this out earlier today with other modifier keys. The issue is that you must include the modifier in the button combination for the release. Assuming your Super key is mapped to Mod4 (which should be the default, afaik):

"xte 'keydown Super_L'" b:11 "xte 'keyup Super_L'" Mod4 + b:11 + release 

EDIT: Just realized that this doesn't completely answer your question as you still won't be able to use LMB while holding down b:11