¿Cómo asigno CORRECTAMENTE una tecla del teclado a un botón del mouse?

14

Resumen de la pregunta: Quiero que Super_LX11 registre uno de los botones de mi mouse como el botón izquierdo de Windows .


En mi administrador de ventanas, puedo mover ventanas manteniendo presionado el "botón izquierdo de Windows" (Súper izquierdo) y arrastrando una ventana con el botón izquierdo del mouse. Quiero poder hacer eso sin tocar el teclado, así que quiero asignar la súper tecla izquierda al botón del mouse 11, de esa manera puedo mantener presionado el botón del mouse 11 y hacer clic + arrastrar ventanas.

La solución más obvia es usar xbindkeys y xte como este ( .xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

Esto funciona así:

  • Cuando Super_Lpresiono el botón 11 del mouse, también se presiona
  • Cuando suelto el botón 11 del mouse, Super_Ltambién se libera

Pero hay un problema: no puedo mover Windows usando Super_L+ Mouse1si también estoy presionando otro botón del mouse, como el botón 11. Usando la solución anterior, el botón 11 del mouse todavía se está registrando como presionado y liberado, por lo que ninguno de las operaciones del administrador de ventanas funcionan.

He intentado esto usando Cinnamon y Awesome WM, y ninguna de las Super_Lcombinaciones de teclado funciona mientras se mantiene presionado el botón 10 u 11 del mouse.

Un truco mediocre

Actualmente estoy solucionando este problema haciendo que el clic del mouse 11 mantenga presionado el Super_Lbotón durante un cierto tiempo. De esa manera puedo hacer clic en el botón del mouse, luego arrastrar las cosas por un breve período de tiempo después:

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

Otro intento

Como sugirió totti, probé esta xbindkeysconfiguración:

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

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

No funciona Parece que la Super_Ltecla se mantiene presionada, porque tan pronto como suelto el botón 10 permanece presionada para siempre (hasta que presiono la Super_Ltecla nuevamente en el teclado) pero el botón del mouse todavía se está registrando, porque no puedo hacer clic y arrastrar ventanas . No creo que pueda hacer que esto funcione usando xbindkeysy xte.

Hubro
fuente
1
En lugar de vincular el botón del mouse a la superclave, realice la reasignación. Para esto usa xmodmap . ver la página de wiki wiki xmodmap para una configuración completa.
totti
@totti: la página xmodmap de arch wiki describe cómo asignar teclas a otras teclas, cómo intercambiar teclas modificadoras y cómo invertir el desplazamiento, pero no menciona la asignación de teclas del teclado a los botones del mouse
Hubro
@totti: con xmodmap puedo asignar teclas a otras teclas, y con la extensión XKB para X (y xkbset) puedo asignar botones de mouse a teclas de teclado, pero estoy tratando de asignar una tecla de teclado a un botón de mouse. Todavía no he encontrado una manera de hacer eso.
Hubro
intente: al mantener presionado el botón 11 del mouse, simule la liberación del botón 11 del súper espera + mouse. El administrador de ventanas ahora puede detectar super & mouse 1 no mouse 11.
totti
@totti: Pregunta tratada y editada
Hubro

Respuestas:

5

Una publicación de askubuntu contiene una respuesta que resumiré a continuación.

El problema es que xbindkeys toma todo el mouse, lo que hace que los modificadores + el mapeo del mouse sean inciertos. La respuesta usa uinput a través del script python-uinput para monitorear /dev/my-mouseel clic del botón del pulgar y enviar la Ctrltecla al teclado virtual. Aquí están los pasos detallados:

1. Hacer reglas de udev

Para el mouse, archivo /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 buscará dispositivos kernel con nombres como event5. El SYMLINK es para encontrar el mouse /dev/my_mx_mouse, legible por el grupo mxgrabber.

Para buscar información de hardware, ejecute algo como:

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

Para uinput, archivo /etc/udev/rules.d/94-mxkey.rules:

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

Desenchufe y conecte su mouse, u obligue a udev a activar las reglas con udevadm trigger.

2. Active el módulo UINPUT

sudo modprobe uinput

Y en /etc/modules-load.d/uinput.conf:

uinput

3. Crear nuevo grupo

sudo groupadd mxgrabber
sudo usermod -aG mxgrabber your_login

4. Script de Python

Instalar python-uinput libraryy python-evdev library.

El siguiente script requiere identificar el código de evento del botón:

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

Haga que el archivo Python sea ejecutable y asegúrese de que se cargue al inicio.

harrymc
fuente
He actualizado la secuencia de comandos para asignar un código clave no utilizados a los botones del ratón (yo los puse hasta F13, F14e F15, e inhabilitación de las funciones del ratón usando xinput. Entonces simplemente puede reasignar las teclas a lo que tenga uso de un simple xmodmap. La idea principal se redactó En pocas palabras (hay algunos valores codificados y no restauro la xinputfunción del mouse después), haré una publicación de blog sobre esto con la versión final del script (y compartiré el enlace aquí cuando esté listo. Gracias
gracias
También revise mi nueva respuesta en el otro hilo para una solución basada en x11 askubuntu.com/a/903389/269589
Maxim
1

Como puede ejecutar el script con un clic del mouse, puede usar el siguiente truco.
1. Presione el Botón 11 para mantener presionada la tecla súper . (El botón 11 activa una secuencia de comandos)
2. Mueva las ventanas usando los otros botones del mouse
3. Presione el botón del mouse 11 nuevamente para liberar la tecla súper

script
Usar xdotoolpara mantener la superclave
Al hacer clic en el primer botón, crear un archivo temporal y mantener presionada la tecla. En el siguiente clic, elimine el archivo tmp y suelte la tecla,

actualizar

De acuerdo con la página de ayuda de ubuntu (muchos botones del mouse) imwheelpueden reasignarse a una tecla.

totti
fuente
Un par de problemas con eso: # 1 Esto es solo otro truco / solución alternativa, y no responde la pregunta. # 2 xbindkeys no funciona mientras se mantiene presionada la súper tecla. Es como si xbindkeys estuviera en pausa, y no registrara nada, hasta que se suelta la súper clave.
Hubro
Ok, después de unos 5 minutos de investigación, retracto el punto # 2. Aparentemente tengo que agregar + Mod4mi configuración de xbindkeys para tener en cuenta la superclave que se mantiene presionada. La solución que sugieres es mejor que la mía, y estoy cambiando a ella :-) Pero aún así no responde la pregunta.
Hubro
1

Sugerencia de depuración: intentaría monitorear el /dev/input/eventXarchivo para ver qué eventos se generan cuando presiona y suelta ese botón, especialmente en combinaciones con BTN_LEFT. Aquí hay un código de muestra para comenzar. Obviamente, tendrá que modificarlo para registrar todos los eventos, no solo las pulsaciones de teclas.

También es posible que desee verificar la xevsalida, si aún no lo ha hecho. Analizar ambos registros debería revelar el problema exacto que está teniendo.

Lo más probable es que su mouse genere eventos de liberación de botones adicionales cuando se presionan varios botones. En ese caso, sus opciones serían usar soluciones alternativas de enlace de teclas o modificar la xf86-input-evdevbiblioteca para filtrar eventos no deseados (o simular los que faltan). Hice algo similar hace un tiempo para una pantalla táctil que generaba eventos de "clic" al intentar arrastrar y soltar. La idea era filtrar los eventos de "lanzamiento" que se producían casi simultáneamente (dentro de un breve intervalo de tiempo) con los eventos de "clic". Si mi suposición es correcta, esencialmente necesitarías implementar algo similar.

Dmitry Grigoryev
fuente
1

Me di cuenta de esto hoy con otras teclas modificadoras. El problema es que debe incluir el modificador en la combinación de botones para el lanzamiento. Suponiendo que su Super clave esté asignada a Mod4 (que debería ser el predeterminado, afaik):

"xte 'keydown Super_L'"
  b:11

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

EDITAR: Acabo de darme cuenta de que esto no responde completamente a su pregunta, ya que aún no podrá usar LMB mientras mantiene presionado b: 11

DreadPirateLynx
fuente