Wie ordne ich eine Tastaturtaste einer Maustaste zu?

14

Zusammenfassung der Fragen: Ich möchte, dass eine meiner Maustasten Super_Lvon X11 als linke Windows-Taste registriert wird.


In meinem Fenstermanager kann ich Fenster verschieben, indem ich die "linke Windows-Taste" (Left Super) gedrückt halte und ein Fenster mit der linken Maustaste ziehe. Ich möchte in der Lage sein, das zu tun, ohne die Tastatur zu berühren, also möchte ich die linke Supertaste der Maustaste 11 zuordnen, auf diese Weise kann ich die Maustaste 11 halten und auf Fenster klicken und sie ziehen.

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

Aber es gibt ein Problem: Ich kann Fenster nicht mit Super_L+ verschieben, Mouse1wenn ich auch eine andere Maustaste gedrückt halte, wie z. B. Maustaste 11. Mit der obigen Lösung wird Maustaste 11 weiterhin als gedrückt und losgelassen registriert Die Fenster-Manager-Operationen funktionieren.

Ich habe dies sowohl mit Cinnamon als auch mit Awesome WM versucht und absolut keine der Super_LTastaturkombinationen funktioniert, während die Maustaste 10 oder 11 gedrückt gehalten wird.

Ein unterdurchschnittlicher Hack

Ich arbeite derzeit an diesem Problem, indem ich den Mausklick veranlasse, die Super_LTaste eine bestimmte Zeit lang zu halten. Auf diese Weise kann ich mit der Maus klicken und dann für einen kurzen Zeitraum etwas herumziehen:

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

Ein weiterer 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 sieht so Super_Laus, als ob die Taste gedrückt gehalten wird, denn sobald ich Taste 10 loslasse, bleibt sie für immer gedrückt (bis ich die Super_LTaste auf der Tastatur erneut drücke ), aber die Maustaste wird weiterhin registriert, da ich keine Fenster anklicken und ziehen kann . Ich glaube nicht, dass ich in der Lage sein werde, diese Arbeit mit xbindkeysund zu machen xte.

Hubro
quelle
1
Anstatt die Maustaste an die Supertaste zu binden, führen Sie eine erneute Zuordnung durch. Verwenden Sie hierfür xmodmap . Eine vollständige Einrichtung finden Sie auf der arch wiki xmodmap-Seite.
Totti
@totti: Auf der arch wiki xmodmap-Seite wird beschrieben, wie man Tasten anderen Tasten zuordnet, Modifikatortasten austauscht und das Scrollen rückwärts
ausführt. Die
@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
Versuch: Simulieren Sie bei gedrückter Maustaste 11 Super Hold + Loslassen der Maustaste 11. Der Fenstermanager
erkennt
@totti: Versucht, und bearbeitete Frage
Hubro

Antworten:

5

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 Modifikatoren und Mausklicks unsicher wird. Die Antwort verwendet uinput über ein Python-uinput- Skript, um /dev/my-mouseauf das Klicken mit der Daumentaste zu überwachen und den CtrlSchlüssel an die virtuelle Tastatur zu senden . Hier sind die detaillierten Schritte:

1. Mach udev Regeln

Datei für die Maus /etc/udev/rules.d/93-mxmouse.conf.rules:

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

Udev sucht nach Kernelgeräten mit Namen wie event5. Der SYMLINK dient zum Auffinden der Maus /dev/my_mx_mouse, die von der Gruppe gelesen werden kann mxgrabber.

So finden Sie Hardware-Informationen:

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

Für die Eingabe Datei /etc/udev/rules.d/94-mxkey.rules:

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

Trennen Sie die Maus vom Computer und schließen Sie sie an, oder erzwingen Sie, dass udev die Regeln mit auslöst 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.

Für das folgende Skript muss der event.code der Schaltfläche angegeben werden:

#!/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.

Harrymc
quelle
Ich habe das Skript aktualisiert einen ungenutzten Schlüsselcode mit den Maustasten zuweisen (Ich habe sie bis zu F13, F14und F15, und Deaktivieren von Mausfunktionen xinput. Dann kann ich einfach die Tasten neu zuweisen, was auch immer ich eine einfache verwenden müssen xmodmap. Die Hauptidee formuliert ist In einer Zusammenfassung (es gibt einige fest codierte Werte und ich stelle die Mausfunktionxinput danach nicht wieder her ), werde ich einen Blogeintrag darüber mit der endgültigen Version des Skripts verfassen ( und den Link hier veröffentlichen, wenn es fertig sein wird. Danke
danke
Überprüfen Sie auch meine neue Antwort auf dem anderen Thread für eine x11-basierte Lösung askubuntu.com/a/903389/269589
Maxim
1

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

Skript Zum Halten des Superschlüssels verwenden Klicken
Sie xdotoolauf die erste Schaltfläche, erstellen Sie eine temporäre Datei und halten Sie die Taste gedrückt. Klicken Sie beim nächsten Mal auf tmp-Datei löschen und lassen Sie die Taste los.

aktualisieren

Laut Ubuntu- imwheelHilfeseite (Viele-Tasten-Maus, wie man) kann auf eine Taste neu zuordnen.

Totti
quelle
Ein paar Probleme damit: # 1 Dies ist nur ein weiterer Hack / Workaround und beantwortet die Frage nicht. # 2 xbindkeys funktioniert nicht, während die Super-Taste gedrückt gehalten wird. Es ist, als ob xbindkeys angehalten ist und nichts registriert, bis der Superschlüssel losgelassen wird.
Hubro
Ok, nach ungefähr 5 Minuten Nachforschungen ziehe ich Punkt 2 zurück. Ich muss anscheinend + Mod4in meiner xbindkeys-Konfiguration hinzufügen, um zu berücksichtigen, dass der Superschlüssel gedrückt wird. Die Problemumgehung, die Sie vorschlagen, ist besser als meine, und ich schalte darauf um :-) Aber die Frage wird immer noch nicht beantwortet.
Hubro
1

Fehlerbehebungsvorschlag: 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, um Ihnen den Einstieg zu erleichtern. Sie müssen es natürlich ändern, um alle Ereignisse zu protokollieren, nicht nur das Drücken von Tasten.

Sie können auch die xevAusgabe auschecken, falls Sie dies noch nicht getan haben. Das Analysieren beider Protokolle sollte das genaue Problem aufdecken, das Sie haben.

Es besteht die Möglichkeit, dass Ihre Maus beim Drücken mehrerer Tasten zusätzliche Schaltflächenfreigabeereignisse generiert. In diesem Fall können Sie Problemumgehungen für die Schlüsselbindung 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 Ziehen und Ablegen "Klick" -Ereignisse generiert hat. Die Idee war, "Release" -Ereignisse, die fast gleichzeitig (innerhalb eines kleinen Zeitfensters) auftraten, mit "Click" -Ereignissen zu filtern. Wenn meine Vermutung richtig ist, müssten Sie im Wesentlichen etwas Ähnliches implementieren.

Dmitry Grigoryev
quelle
1

Ich habe das heute früher mit anderen Modifikatortasten herausgefunden. Das Problem ist, dass Sie den Modifikator in die Tastenkombination für die Freigabe aufnehmen müssen. Angenommen, Ihre Super-Taste ist Mod4 zugeordnet (dies sollte die Standardeinstellung sein, afaik):

"xte 'keydown Super_L'"
  b:11

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

EDIT: Ich habe festgestellt, dass dies Ihre Frage nicht vollständig beantwortet, da Sie LMB immer noch nicht verwenden können, während Sie b: 11 gedrückt halten

DreadPirateLynx
quelle