So ordnen Sie Modifikatoren (z. B. STRG) mit xbindkeys den Maustasten zu

13

Diese Frage wurde bereits gestellt, aber nie richtig beantwortet. Nach Freigabe mit @Seth frage ich es jetzt nochmal. Dadurch kann ich die Frage viel einfacher beantworten und möglicherweise ändern. Die ursprüngliche Frage finden Sie hier:

Ordnen Sie Strg und Alt den Daumenschaltflächen der Maus zu


Problem:

Das Zuordnen von Tastenanschlägen zu einer Maustaste xbindkeysin Verbindung mit ist sehr einfach, xdotooloder xtees scheint sehr viel problematischer, eine Änderungstaste (z. B. ALT , STRG , UMSCHALTTASTE usw.) zuzuordnen .

Die endgültige soloution sollte ua ein erlauben STRG + Klick (zB für mehrere Einträge aus einer Liste auswählen) nur mit der Maus.

Einige mögliche Lösungsansätze finden Sie hier bei Stack Exchange sowie in anderen Linux-Foren. Aber keine davon funktioniert wie erwartet, da sie zu anderen Problemen und Nebenwirkungen führt.

Anmerkungen:

Einige der folgenden Beispiele beziehen Guile mit der Schemasyntax ein und stützen sich auf die .xbindkeysrc.scmDatei, während andere auf die .xbindkeysrcDatei mit der entsprechenden Syntax angewiesen sind . Mir ist bewusst, dass sie nicht zusammenarbeiten werden.

Des Weiteren die folgenden Schnipsel stützen sich auf xdotoolnur , aber ich bin offen für Ansätze , die die anderen Anwendungen wie zB xteauch - obwohl sie beide führen zu den gleichen Ergebnissen scheint und deshalb verwende ich nur xdotoolAktionen hier.

Ansatz A:

Aktualisieren der .xbindkeysrcDatei mit:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + b:8

Das habe ich anfangs versucht, aber es hat den Nebeneffekt, dass der Modifikator gehalten wird und nicht freigegeben werden kann.

Ansatz B:

Aktualisieren der .xbindkeysrc.scmDatei mit:

(xbindkey '("b:8") "xdotool keydown ctrl")
(xbindkey '(release "b:8") "xdotool keyup ctrl")

(xbindkey '("m:0x14" "b:8") "xdotool keydown ctrl")
(xbindkey '(release "m:0x14" "b:8") "xdotool keyup ctrl")

Gefunden bei http://www.linuxforums.org/forum/hardware-peripherals/169773-solved-map-mouse-button-modifier-key.html und versucht, das Problem zu beheben, bei dem der Modifier festgehalten wird (wie bei approach beschrieben) ein).

Es wird jedoch behoben, dass es nur teilweise funktioniert, da keine weiteren Mausklicks ausgeführt werden können, während die Daumentaste gedrückt wird.

Ansatz C:

Aktualisieren der .xbindkeysrcDatei mit:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

Versucht von OP der verknüpften Frage hier bei Askubuntu. Viel einfacher und solider, da es keine Modifikatorzustände enthält. Trotzdem bleibt das Problem bestehen, dh ein STRG + Klick ist nicht möglich.

Es scheint, dass dies xbindkeysdas Problem ist, da es den Klick erkennt, ihn aber nicht ausführt. Dies kann mit xev | grep buttonund getestet werden xbindkeys -v:

Ein normaler Mausklick xevsollte wie folgt aussehen:

state 0x10, button 1, same_screen YES
state 0x110, button 1, same_screen YES

Sowie für die Daumentaste:

state 0x10, button 8, same_screen YES
state 0x10, button 8, same_screen YES

Wenn die obige xbindkeysKonfiguration aktiviert ist, wird jedoch nichts aufgezeichnet. Obwohl die Daumentaste sinnvoll ist, da sie STRG zugeordnet ist und daher keine Maustaste mehr ist, ist es merkwürdig, dass die Taste 1 nicht mit aufgezeichnet wird. Dies liegt wahrscheinlich daran, dass xbindkeyses nicht ausgeführt wird, sondern von selbst erkannt wird:

Button press !
e.xbutton.button=8
e.xbutton.state=16
"xdotool keydown ctrl"
    m:0x0 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call
Button press !
e.xbutton.button=1
e.xbutton.state=20
Button release !
e.xbutton.button=1
e.xbutton.state=276
Button release !
e.xbutton.button=8
e.xbutton.state=20
"xdotool keyup ctrl"
    Release + m:0x4 + b:8   (mouse)
got screen 0 for window 16d
Start program with fork+exec call

Ansatz D:

Aktualisieren der .xbindkeysrcDatei mit:

"xdotool keydown ctrl"
  b:8

"xdotool keyup ctrl"
  release + control + b:8

"xdotool click 1"
  b:1

Einfach zu einfach ... führt aber zu einer Endlosschleife von Klicks.


AKTUALISIEREN:

In der Zwischenzeit habe ich ein Logitech G502 gekauft und festgestellt, dass nach der Konfiguration über den Treiber unter Windows nicht nur das Profil selbst im Gerätespeicher gespeichert wird, sondern der eigentliche Tastendruck mit der Maus erfolgt. Das hat mein Problem unter Linux gelöst!

Die einzige andere Maus, an die ich mich erinnere, die das konnte, war damals die Razer Copperhead. Aber ich denke, es gibt heute noch andere Mäuse, die dasselbe können.

conceptdeluxe
quelle
1
Hier ist eine Lösung mit Easystroke: askubuntu.com/a/1010647/27202
atti

Antworten:

8

Ich habe viel Zeit damit verbracht, diese verbindliche Arbeit zu machen. Ich habe schließlich eine Lösung gefunden, die kompliziert ist, aber gut funktioniert und keine Software von Drittanbietern impliziert. Ich teile es hier in der Hoffnung, dass es den Menschen hilft. Außerdem weiß ich, dass dies in Bezug auf die Sicherheit nicht perfekt ist, so dass konstruktives Feedback mehr als willkommen ist.

Es gibt Lösungen, die wirklich nett sind, wie die hier vorgeschlagene , aber sie leiden immer unter der Einschränkung von xbindkeys, die die gesamte Maus greifen und die Zuordnung von Modifikatoren und Mausklicks unsicher machen. Plus die Guile-basierte Lösung aus dem obigen Link verwenden Strg + Plus / Strg + Minus, die zum Beispiel von Gimp nicht erkannt wird.

Ich habe herausgefunden, dass wir eine Maustaste haben wollen, die als Tastatur fungiert, also habe ich uinput verwendet, auf die über Python zugegriffen werden kann. Ich habe ein Skript geschrieben, das / dev / my-mouse für den Daumenknopf-Klick überwacht und die Strg-Taste sendet auf die virtuelle Tastatur. Hier sind die detaillierten Schritte:

1. Mach udev Regeln

Wir möchten, dass die Geräte zugänglich sind (Rechte und Standort).

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 einem vom Kernel erkannten Gerät mit Namen wie event5 und ich wähle meine Maus mit dem Namen aus. Die SYMLINK-Anweisung stellt sicher, dass ich meine Maus in / dev / my_mx_mouse finde. Das Gerät kann von einem Mitglied der Gruppe "mxgrabber" gelesen werden.

Um Informationen zu Ihrer Hardware zu finden, sollten Sie so etwas wie ausführen

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

Für die Eingabe:

/etc/udev/rules.d/94-mxkey.rules
----------------------------------------------------
KERNEL=="uinput", GROUP="mxgrabber", MODE="660"

Symlink ist nicht erforderlich. Die Eingabe erfolgt immer in $/dev/uinputoder $/dev/input/uinputabhängig von dem System, auf dem Sie sich befinden. Geben Sie ihm einfach die Gruppe und die Rechte zum Lesen UND Schreiben.

Sie müssen den Stecker aus der Steckdose ziehen und der neue Link sollte in / dev erscheinen. Sie können udev zwingen, Ihre Regeln mit auszulösen$udevadm trigger

2. Aktivieren Sie das UINPUT-Modul

sudo modprobe uinput

Und um es dauerhaft zu booten:

/etc/modules-load.d/uinput.conf
-----------------------------------------------
uinput

3. Neue Gruppe erstellen

sudo groupadd mxgrabber

Oder wie auch immer Sie Ihre Zugangsgruppe genannt haben. Dann sollten Sie sich selbst hinzufügen:

sudo usermod -aG mxgrabber your_login

4. Python-Skript

Sie müssen die Bibliothek python-uinput (offensichtlich) und die Bibliothek python-evdev installieren . Verwenden Sie pip oder Ihr Distributionspaket.

Das Skript ist ganz einfach, Sie müssen nur den event.code Ihrer Schaltfläche identifizieren.

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

Jetzt müssen Sie nur noch Ihre Python-Datei ausführbar machen und Ihren Desktop-Manager bitten, die Datei beim Start zu laden. Vielleicht auch ein Glas Wein, um die gute Arbeit zu feiern!

6. Extra kostenlos

Ich benutze xbindkeys für zusätzliches Verhalten. Beispielsweise kann die folgende Konfiguration hilfreich sein, wenn Sie eine Maus mit seitlichen Mausklicks haben:

~/.xbindkeysrc
---------------------------------------------
# Navigate between tabs with side wheel buttons
"xdotool key ctrl+Tab"
  b:7
"xdotool key ctrl+shift+Tab"
  b:6

# Close tab with ctrl + right click
# --clearmodifiers ensure that ctrl state will be 
# restored if button is still pressed
"xdotool key --clearmodifiers ctrl+F4"
  control+b:3

Damit diese letzte Kombination funktioniert, müssen Sie die für das Python-Skript konfigurierte Schaltfläche deaktivieren. Andernfalls wird sie weiterhin von xbindkeys abgerufen. Es muss nur die Strg-Taste bleiben:

~/.Xmodmap
-------------------------------------------
! Disable button 13
! Is mapped to ctrl with uinput and python script
pointer = 1 2 3 4 5 6 7 8 9 10 11 12 0 14 15

Nachladen mit $ xmodmap ~/.Xmodmap

7. Schlussfolgerung

Wie ich am Anfang sagte, bin ich nicht ganz glücklich darüber, dass ich mir die Wrights geben muss, um an / dev / uinput zu schreiben, auch wenn es sich um die "mxgrabber" -Gruppe handelt. Ich bin sicher, dass es einen sichereren Weg gibt, aber ich weiß nicht wie.

Positiv zu vermerken ist, dass es sehr, sehr gut funktioniert. Jede Kombination von Tastatur- oder Maustasten, wie sie mit der Strg-Taste der Tastatur funktioniert, funktioniert jetzt mit der der Maus !!

Aurélien Cibrario
quelle
Vielen Dank für die Mühe und das Teilen mit uns! +1 ... obwohl ich es noch nicht getestet habe. Übrigens habe ich das fast aufgegeben - wäre toll, wenn das wie erwartet funktioniert :)
conceptdeluxe
Bitte ! Bei mir funktioniert es einwandfrei. Wenn Sie Probleme haben, lassen Sie es mich wissen. Ich versuche, meine Antwort vollständig zu machen, aber da ich fast zwei Tage damit verbracht habe, sie zum Laufen zu bringen, habe ich möglicherweise etwas vergessen. Würde mich freuen, meinen Beitrag zu bearbeiten.
Aurélien Cibrario
Ich habe gerade festgestellt, dass Strg + Klick1 eine sehr schlechte Wahl ist, um einen Tab zu schließen, da dadurch ein Link in einem neuen Tab geöffnet wird. Ich habe meine Antwort bearbeitet, indem ich den letzten Teil des Python-Skripts entfernt und mit xbindkeys, einer saubereren Lösung,
optimiert habe
nur wollen Sie wissen lassen, dass ich keine Zeit hatte , es noch zu testen - aber ich werde sicher macht es die akzeptierte Antwort , wenn es funktioniert wie erwartet - sorry für die Wartezeit - ich ein bisschen damit beschäftigt atm bin
conceptdeluxe
Ich frage mich, ob wir das obige Skript verwenden können, um einen fehlerhaften Mausschalter zu entprellen. Ich habe eine abgenutzte Maus. Ich verwende ein Autohotkey-Skript, um es unter Windows zu reparieren, aber es gibt kein Tool, um es unter Linux zu reparieren. Hier ist Autohhotkey Skript für linke Taste fix autohotkey.com/board/topic/63555-debounce-mouse-keys ich jemanden Port hoffen , dass es zu Linux mit python3 - evdev
kenn
4

Ich habe mit PyUserInput eine Lösung gefunden . Dies ist recht einfach und erfordert keine Administrationsrechte. Mit Python 2 und PyUserInput habe ich das folgende Skript verwendet:

#!/usr/bin/python
from pymouse import PyMouseEvent
from pykeyboard import PyKeyboard

k = PyKeyboard()
class MouseToButton(PyMouseEvent):
    def click(self, x, y, button, press):
        if button == 8:
            if press:    # press
                k.press_key(k.control_l_key)
            else:        # release
                k.release_key(k.control_l_key)

C = MouseToButton()
C.run()

Nachdem ich dem Skript Ausführungsrechte gegeben habe, rufe ich es ~/.xsessionrczum Beispiel mit einem Line-In auf

~ / path / to / script.py &

Hinweis . Dies verhindert nicht, dass das Maustastenereignis ausgelöst wird. In meinem Fall habe ich xinput set-button-mapdie Zuordnung der xinput-Schaltflächen geändert und die Nummer der Schaltfläche, an der ich interessiert war, einer nicht verwendeten zugewiesen.

Wenn Sie beispielsweise die Taste 8 Ihrer Maus verwenden möchten, Taste 8 jedoch bereits eine Funktion hat (z. B. page-next), können Sie Folgendes verwenden.xsessionrc

logitech_mouse_id=$(xinput | grep "Logitech M705" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
xinput set-button-map $logitech_mouse_id 1 2 3 4 5 6 7 12 9 10 11 12 13 14 15 16 17 18 19 20
./.xbuttonmodifier.py &

vorausgesetzt, die Schaltfläche hat 12keine Bedeutung für das Betriebssystem und weist der Schaltfläche 12in .xbuttonmodifier.pydem oben beschriebenen Skript eine benutzerdefinierte Funktion zu .

Maxime
quelle
Dies verhindert jedoch nicht, dass das ursprüngliche Ereignis ausgelöst wird. Wenn ich also Taste 8 in Firefox zum Verschieben anordne und halte, wird auch versucht, zur vorherigen Seite zurückzukehren, was unerwünscht ist.
User23013
1
Wahr. Um dieses Problem zu lösen, habe ich die ID des Buttons, an dem ich interessiert war, in einen gebrauchten Button geändert xinput. Siehe bearbeitete Frage.
Maxim
2

Ich habe eine Teillösung. Ich habe noch nicht herausgefunden, wie die Zuordnung der vorhandenen Schaltfläche aufgehoben werden kann. Sie erhalten also einen Klick auf die Schaltfläche und den gewünschten Modifikator. Wenn diese Maustaste einen vorhandenen Zweck hat, wird sie dennoch ausgelöst. Wenn Sie beispielsweise die rechte Maustaste einer Steuertaste neu zuordnen, wird ein Steuerelement + Klick gesendet.

Wie auch immer, ich habe einen Forumsbeitrag gefunden, der Ihrer Frage ähnelt und auf den die Antwort lautete, btnx zu installieren und Ihre Modifikatoren dadurch zu konfigurieren. Es scheint, dass BTNX nicht mehr über das Repo erhältlich ist. Es gibt ein ppa, aber es funktioniert nicht für das neueste Ubuntu.

Forumsbeitrag: Beitrag: http://ubuntuforums.org/showthread.php?t=1245930

Aber die Quelle ist verfügbar:

Sie könnten es aus dem Quellcode kompilieren, aber dadurch werden Dateien auf Ihrem System abgelegt, die der Paketmanager nicht verwalten kann.

Nämlich die folgenden Dateien:

/usr/local/sbin/btnx
/etc/init.d/btnx
/usr/share/pixmaps/btnx.png
/usr/share/btnx-config (directory, multiple files)
/usr/share/applications/btnx-config.desktop
/usr/share/omf/btnx-config/btnx-manual-C.omf
/usr/share/locale/de/LC_MESSAGES/btnx-config.mo
/usr/share/locale/fr/LC_MESSAGES/btnx-config.mo
/usr/share/locale/nl/LC_MESSAGES/btnx-config.mo
/usr/share/locale/ru/LC_MESSAGES/btnx-config.mo

Die folgenden Symlinks:

/etc/rc0.d/K49btnx -> ../init.d/btnx
/etc/rc1.d/K49btnx -> ../init.d/btnx
/etc/rc6.d/K49btnx -> ../init.d/btnx
/etc/rc2.d/S49btnx -> ../init.d/btnx
/etc/rc3.d/S49btnx -> ../init.d/btnx
/etc/rc4.d/S49btnx -> ../init.d/btnx
/etc/rc5.d/S49btnx -> ../init.d/btnx

Also ... wenn es Ihnen nichts ausmacht, aus der Quelle zu bauen ...

Holen Sie sich die Abhängigkeiten für btnx:

sudo apt-get install libdaemon-dev git

Wenn Sie noch nie etwas aus dem Quellcode erstellt haben, benötigen Sie möglicherweise auch Build-Essentials:

sudo apt-get install build-essential

Dann holen und kompilieren Sie btnx:

git clone https://github.com/cdobrich/btnx
cd btnx
./configure
make
sudo make install
cd -

Es verfügt über ein separates GUI-Konfigurationstool. Holen Sie sich die Abhängigkeiten dafür:

sudo apt-get install libgtk2.0-dev libglade2-dev

Holen Sie sich jetzt das GUI-Konfigurations-Tool und kompilieren Sie es:

git clone https://github.com/cdobrich/btnx-config
./configure
make
sudo make install

Führen Sie nun das Tool aus:

sudo btnx-config

Klicken Sie auf "Maus-Tasten erkennen". Wenn Sie die Anweisungen lesen möchten, während Sie das Tool verwenden, ändern Sie die Größe des angezeigten Fensters. Der Dialogtext wird später abgeschnitten, wenn Sie dies nicht tun. Wenn Sie versuchen, die Größe während der Erkennung zu ändern, wird er abgebrochen die Erkennung. Mach das Fenster einfach ein bisschen größer.

Klicken Sie auf Drücken, um die Mauserkennung zu starten, und versuchen Sie dann, die Maus nicht zu bewegen, bis sich der Text ändert ... Dauert etwa 5-10 Sekunden. Der Text wird geändert. Ignorieren Sie in diesem Fall den Text und klicken Sie auf Weiterleiten.

Klicken Sie auf die Schaltfläche "Drücken, um die Tastenerkennung zu starten"

Hier klicken Sie mehrmals auf eine Maustaste (bis sich die Statusleiste füllt). Stellen Sie dann den Namen der Schaltfläche auf etwas ein, das Sie später erkennen werden (Beispiel: LeftButton). Klicken Sie auf die Schaltfläche Hinzufügen.

Wiederholen Sie diesen Vorgang für jede Maustaste (Scroll-Räder, Scroll-Klicks usw. nicht vergessen). Sie können wahrscheinlich alle Schaltflächen überspringen, die Sie nicht neu zuordnen möchten.

Wenn Sie alle Schaltflächen hinzugefügt haben, klicken Sie auf OK.

Klicken Sie in der Haupt-GUI auf Schaltflächen, und wählen Sie im linken Bereich die Schaltfläche aus, die Sie neu zuordnen möchten. Es werden die Namen verwendet, die Sie in den vorherigen Schritten eingegeben haben. Für Ihre Zwecke möchten Sie rechts unter Tastenkombination nur einen Tastenmodifikator auswählen.

Klicken Sie in diesem Bildschirm nicht auf Löschen, da sonst die Schaltfläche entfernt wird. Sie müssen zurückgehen und den Knopf erneut erkennen, wenn Sie dies tun.

Kehren Sie zum Bildschirm "Conrigurations" zurück und klicken Sie auf "Restart BTNX".

Probieren Sie den neuen Knopf aus.

Wenn Sie die Anwendungen deinstallieren möchten, stoppen Sie das btnx-Programm und gehen Sie dann in die entsprechenden git-ausgecheckten Verzeichnisse und führen Sie die Deinstallation durch:

sudo /etc/init.d/btnx stop
cd btnx
sudo make uninstall
cd -
cd btnx-config
sudo make uninstall
cd -
Stephen
quelle
2
Vielen Dank für die ausführliche Antwort, die Sie bei Pastebin gepostet haben. Ich befürchte jedoch, dass ich kein nicht vertrauenswürdiges ppa verwenden oder keine Anwendung aus einer unbekannten Quelle erstellen darf, ohne dies auf meinem Gerät im Detail zu überprüfen. Trotzdem gebe ich dir eine Stimme für die Mühe, die du in sie gesteckt hast. Abgesehen davon empfehle ich, dass Sie Ihre Antwort hier aktualisieren und kopieren, was Sie dort geschrieben haben, da diese Informationen für andere hilfreich sein können, aber möglicherweise übersehen werden. Zum Schluss habe ich gelesen, dass das Paket unter Ubuntu oder Debian möglicherweise nicht kompiliert werden kann - haben Sie das tatsächlich versucht?
conceptdeluxe
Übrigens: Sie können weitere 100 Ruf leicht gewinnen, indem Sie Ihr askubuntu-Konto mit anderen Stack Exchange-Konten wie z. B. Linux und Unix verknüpfen.
conceptdeluxe
Ja, ich habe es unter Ubuntu 14.04 getestet. Ich ließ die rechte Maustaste einen Steuerschlüssel senden und bestätigte, dass es vor dem Posten funktionierte. Und dann fast den Posten wegen der Reputationspflicht aufgegeben.
Stephen