Besitzer einer Logitech Anywhere (und ähnlicher Modelle) kennen das Problem: Nach einiger Zeit beginnt die linke Maustaste zu „prellen“ – ein einfacher Klick wird oft als Doppelklick erkannt.
Statt die Maus zu entsorgen oder den Mikroschalter zu tauschen, kann man das Prellen auch softwareseitig filtern.
Das folgende Python‑Skript nutzt evdev und uinput, um Klick‑Ereignisse der linken Maustaste in einem kurzen Zeitfenster zu puffern und nur saubere Klick‑ Muster an das System weiterzugeben.
**Vorteile:** - Keine Hardware‑Modifikation nötig - Funktioniert unter Linux/X11 und Wayland (je nach Input‑Setup) - Doppelklick‑Erkennung optional abschaltbar
**Voraussetzungen:** - Python 3 - Pakete installieren: [code=bash] sudo apt install python3-evdev python3-uinput [/code] - Zugriff auf das richtige /dev/input/eventX-Gerät (per evtest herausfinden) [code=bash] sudo evtest [/code] - Skript ausführbar machen: [code=bash] chmod +x mausfilter.py [/code]
**Start:** [code=bash] sudo ./mausfilter.py [/code]
**Beenden:** Strg+C im Terminal
–-
[code=python] #!/usr/bin/env python3 import evdev, time, uinput, select, signal, sys
DEVICE_PATH = "/dev/input/event11" WINDOW = 0.08 # 80 ms Beobachtungsfenster ENABLE_DOUBLECLICK = True # hier ein/aus schalten
device = evdev.InputDevice(DEVICE_PATH) device.grab() # exklusiver Zugriff, verhindert doppelte Events
ui = uinput.Device([ uinput.BTN_LEFT, uinput.BTN_RIGHT, uinput.BTN_MIDDLE, uinput.REL_X, uinput.REL_Y, uinput.REL_WHEEL ])
print(f"Starte {WINDOW*1000:.0f} ms Fenster-Filter für BTN_LEFT – STRG+C zum Beenden. DblClk={'AN' if ENABLE_DOUBLECLICK else 'AUS'}")
window_start = None buffer = [] holding_sent = False last_state = None # 1=gedrückt, 0=losgelassen
def cleanup_and_exit(sig=None, frame=None): try: device.ungrab() except Exception: pass print("Beendet, Grab freigegeben.") sys.exit(0)
signal.signal(signal.SIGINT, cleanup_and_exit) signal.signal(signal.SIGTERM, cleanup_and_exit)
try: while True: now = time.time() r, _, _ = select.select([device.fd], [], [], 0.01)
if r: for event in device.read(): # Nur BTN_LEFT filtern if event.type == evdev.ecodes.EV_KEY and event.code == evdev.ecodes.BTN_LEFT: last_state = event.value if window_start is None: window_start = now buffer = [(event.value, now)] else: buffer.append[1]
# Alles andere sofort durchreichen elif event.type in (evdev.ecodes.EV_KEY, evdev.ecodes.EV_REL): ui.emit
[2]- 1: event.value, now
- 2: event.type, event.code), event.value)
# Fensterende prüfen
if window_start is not None and (now - window_start) >= WINDOW:
pattern = [v for v, t in buffer]
if not pattern:
# Kein neues BTN_LEFT-Event im Fenster
if holding_sent and last_state == 0:
# Letzter Zustand war losgelassen → jetzt UP senden
ui.emit(uinput.BTN_LEFT, 0)
holding_sent = False
window_start = None
else:
# Taste (vermutlich) noch gedrückt → weiteres Fenster anhängen
window_start = now
buffer = []
continue
# Exakte Muster
if pattern == [1, 0]:
# Einfachklick
ui.emit(uinput.BTN_LEFT, 1)
ui.emit(uinput.BTN_LEFT, 0)
holding_sent = False
window_start = None
buffer = []
elif pattern == [1, 0, 1, 0]:
# Doppelklick (vorsichtig, nur bei exakt diesem Muster)
if ENABLE_DOUBLECLICK:
ui.emit(uinput.BTN_LEFT, 1); ui.emit(uinput.BTN_LEFT, 0)
ui.emit(uinput.BTN_LEFT, 1); ui.emit(uinput.BTN_LEFT, 0)
else:
# Fallback: zwei Einzelklicks (bewusst; OS kann daraus ggf. Doppelklick machen)
ui.emit(uinput.BTN_LEFT, 1); ui.emit(uinput.BTN_LEFT, 0)
ui.emit(uinput.BTN_LEFT, 1); ui.emit(uinput.BTN_LEFT, 0)
holding_sent = False
window_start = None
buffer = []
else:
# Anderes Muster → DOWN halten, bis echtes UP + leeres Folgefenster kommt
if not holding_sent and pattern[0] == 1:
ui.emit(uinput.BTN_LEFT, 1)
holding_sent = True
window_start = now
buffer = []
except KeyboardInterrupt:
cleanup_and_exit()
except Exception:
cleanup_and_exit()
raise
[/code]
–-
**Lizenz:** MIT – frei nutzbar und anpassbar
**Getestet unter:** Ubuntu 24.04, X11, Logitech Anywhere MX
Moderiert von schwarzheit:
Dem Spamfilter entrissen.
Moderiert von schwarzheit:
Thema in einen passenden Forenbereich verschoben. Bitte beachte die als wichtig markierten Themen („Welche Themen gehören hier her und welche nicht?“) in jedem Forenbereich. Danke.