Come posso mappare CORRETTAMENTE un tasto della tastiera su un pulsante del mouse?


14

Riepilogo della domanda: desidero che uno dei miei pulsanti del mouse sia registrato come il pulsante Windows sinistro Super_Lda X11.


Nel mio gestore delle finestre, posso spostare le finestre tenendo premuto il "tasto sinistro di Windows" (Sinistra Super) e trascinando una finestra con il tasto sinistro del mouse. Voglio essere in grado di farlo senza toccare la tastiera, quindi desidero mappare il tasto Super sinistro sul pulsante 11 del mouse, in questo modo posso tenere premuto il pulsante 11 del mouse e fare clic + trascina finestre.

La soluzione più ovvia sta usando xbindkeys e xte in questo modo ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

Funziona così:

  • Quando premo il pulsante del mouse 11, Super_Lviene anche premuto
  • Quando rilascio il pulsante del mouse 11, Super_Lviene anche rilasciato

Ma c'è un problema: non riesco a spostare Windows usando Super_L+ Mouse1se sto anche tenendo premuto un altro pulsante del mouse, come il pulsante del mouse 11. Utilizzando la soluzione sopra, il pulsante del mouse 11 viene ancora registrato come premuto e rilasciato, quindi nessuno dei le operazioni del gestore delle finestre funzionano.

Ho provato questo usando sia Cinnamon che Awesome WM, e assolutamente nessuna delle Super_Lcombinazioni di tasti funziona mentre si tiene premuto il pulsante 10 o 11 del mouse.

Un hack scadente

Attualmente sto risolvendo questo problema facendo in modo che il clic del mouse 11 tenga premuto il Super_Lpulsante per un certo periodo di tempo. In questo modo posso fare clic sul pulsante del mouse, quindi trascinare le cose per un breve periodo in seguito:

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

Un altro tentativo

Come suggerito da Totti, ho provato questa xbindkeysconfigurazione:

"xte 'mouseup 10' 'keydown Super_L'"
  b:10

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

Non funziona Sembra che il Super_Ltasto sia tenuto premuto, poiché non appena rilascio il pulsante 10 rimane premuto per sempre (fino a quando non premo Super_Lnuovamente il tasto sulla tastiera) ma il pulsante del mouse viene ancora registrato, perché non riesco a fare clic e trascinare Windows . Non credo che riuscirò a far funzionare questo con xbindkeyse xte.


1
Invece di associare il pulsante del mouse al tasto super, esegui la rimappatura. Per questo usa xmodmap . vedere la pagina xmodmap di arch wiki per una configurazione completa.
Totti,

@totti: la pagina xmodmap di arch wiki descrive come mappare i tasti ad altri tasti, come scambiare i tasti modificatori e come invertire lo scorrimento, ma non menziona il mapping dei tasti da tastiera ai pulsanti del mouse
Hubro

@totti: Con xmodmap posso mappare i tasti su altri tasti e con l'estensione XKB per X (e xkbset) posso mappare i pulsanti del mouse sui tasti della tastiera, ma sto cercando di mappare un tasto della tastiera su un pulsante del mouse. Non ho ancora trovato un modo per farlo.
Hubro

prova: tenendo premuto il pulsante 11 del mouse, simula il rilascio super-pulsante + pulsante 11 del mouse. Il gestore delle finestre ora può rilevare super e mouse 1 non mouse 11.
totti

@totti: domanda
provata

Risposte:


5

Un post di askubuntu contiene una risposta che riassumerò di seguito.

Il problema è che xbindkeys afferra l'intero mouse, rendendo incerti modificatori + mappatura clic del mouse. La risposta utilizza uinput tramite script python-uinput per monitorare /dev/my-mouseil clic del pulsante pollice e inviare il Ctrltasto alla tastiera virtuale. Ecco i passaggi dettagliati:

1. Crea regole udev

Per il mouse, file /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 cercherà i dispositivi del kernel con nomi come event5. SYMLINK serve per trovare il mouse /dev/my_mx_mouse, leggibile dal gruppo mxgrabber.

Per trovare informazioni sull'hardware, eseguire qualcosa come:

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

Per uinput, file /etc/udev/rules.d/94-mxkey.rules:

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

Scollegare e collegare il mouse o forzare udev per attivare le regole udevadm trigger.

2. Attiva il modulo UINPUT

sudo modprobe uinput

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

uinput

3. Crea un nuovo gruppo

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login

4. Script Python

Installa python-uinput librarye python-evdev library.

Lo script seguente richiede l'identificazione del codice event. del pulsante:

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

Rendi eseguibile il file python e assicurati che sia caricato all'avvio.


Ho aggiornato lo script per assegnare un codice di accesso non utilizzato per i pulsanti del mouse (li ho impostato fino a F13, F14e F15, e disabilitando le funzioni del mouse utilizzando xinput. Allora posso semplicemente riassegnare le chiavi a tutto ciò che ho bisogno utilizzando un semplice xmodmap. L'idea principale è redatto in breve (ci sono alcuni valori hardcoded e non ripristinerò xinputsuccessivamente la funzione del mouse), farò un post sul blog su questo con la versione finale dello script (e condividerò il link qui quando sarà fatto. Grazie per il tuo aiuto! ☺ ♥
zmo

Controlla anche la mia nuova risposta sull'altro thread per una soluzione x11 askubuntu.com/a/903389/269589
Maxim

1

Poiché puoi eseguire lo script con un clic del mouse, puoi utilizzare il seguente trucco.
1. Premere il pulsante 11 per tenere premuto il tasto super . (Il pulsante 11 attiva uno script)
2. Spostare le finestre utilizzando gli altri pulsanti del mouse
3. Premere nuovamente il pulsante 11 del mouse per rilasciare il tasto super

script
Utilizzare xdotoolper tenere premuto il tasto super
Al primo clic del pulsante, creare un file temporaneo e tenere premuto il tasto. Al prossimo clic elimina il file tmp e rilascia la chiave,

aggiornare

Secondo la pagina di aiuto di Ubuntu (molti pulsanti del mouse come) imwheelpossono rimappare una chiave.


Un paio di problemi con questo: # 1 Questo è ancora solo un altro trucco / soluzione alternativa e non risponde alla domanda. # 2 xbindkeys non funziona mentre si tiene premuto il tasto super. È come se xbindkeys fosse in pausa e non registrasse nulla, fino a quando non viene rilasciato il tasto super.
Hubro,

Ok, dopo circa 5 minuti di ricerche, ritiro il punto 2. Apparentemente devo aggiungere la + Mod4mia configurazione di xbindkeys per tenere premuto il tasto super. La soluzione alternativa che suggerisci è migliore della mia e sto passando ad essa :-) Ma continua a non rispondere alla domanda.
Hubro,

1

Suggerimento di debug: proverei a monitorare il /dev/input/eventXfile per vedere quali eventi vengono generati quando si preme e si rilascia quel pulsante, soprattutto in combinazione con BTN_LEFT. Ecco un codice di esempio per iniziare. Dovrai ovviamente modificarlo per registrare tutti gli eventi, non solo la pressione dei tasti.

Potresti anche voler controllare l' xevoutput, se non l'hai già fatto. L'analisi di entrambi i registri dovrebbe rivelare il problema esatto che stai riscontrando.

È probabile che il mouse generi eventi di rilascio dei pulsanti extra quando vengono premuti più pulsanti. In tal caso, le opzioni sarebbero utilizzare soluzioni alternative di associazione dei tasti o modificare la xf86-input-evdevlibreria per filtrare gli eventi indesiderati (o simulare quelli mancanti). Qualche tempo fa ho fatto qualcosa di simile per un touchscreen che ha generato eventi di "clic" durante il tentativo di trascinamento della selezione. L'idea era di filtrare gli eventi di "rilascio" che venivano quasi simultaneamente (in una piccola finestra temporale) con eventi di "clic". Se la mia ipotesi è corretta, avresti essenzialmente bisogno di implementare qualcosa di simile.


1

L'ho capito prima oggi con altri tasti modificatori. Il problema è che è necessario includere il modificatore nella combinazione di pulsanti per il rilascio. Supponendo che il tuo Super key sia mappato su Mod4 (che dovrebbe essere il default, afaik):

"xte 'keydown Super_L'"
  b:11

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

EDIT: Ho appena capito che questo non risponde completamente alla tua domanda poiché non sarai ancora in grado di usare LMB tenendo premuto b: 11

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.