web-dev-qa-db-fra.com

Comment cartographier correctement une clé de clavier sur un bouton de la souris?

Résumé de la question : Je veux que l'un de mes boutons de la souris soit enregistré comme bouton Windows gauche Super_L par x11.


Dans mon gestionnaire de fenêtres, je peux déplacer des fenêtres en maintenant le "bouton Windows gauche" (Super de gauche) et en faisant glisser une fenêtre avec le bouton gauche de la souris. Je veux pouvoir faire cela sans toucher le clavier, je souhaite donc mapper la touche Super gauche sur la souris 11, de cette façon, je peux contenir le bouton de la souris 11 et cliquez sur + Glisser Windows.

La solution la plus évidente utilise Xbindkeys et Xte comme ceci (.xbindkeysrc):

"xte 'keydown Super_L'"
  b:11

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

Cela fonctionne comme ceci:

  • Quand j'appuie sur le bouton de la souris 11, Super_L est également pressé
  • Quand je libère le bouton de la souris 11, Super_L est également libéré

Mais il y a un problème: je ne peux pas déplacer Windows en utilisant Super_LMouse1 Si je tiens également un autre bouton de la souris, comme le bouton de la souris 11. Utilisation de la solution ci-dessus, le bouton de la souris 11 est toujours enregistré comme pressé et publié, et aucune des opérations de gestionnaire de fenêtres ne fonctionne.

J'ai essayé ceci en utilisant à la fois la cannelle et le génial WM, et absolument aucun de la Super_L Les combinaisons de clavier fonctionnent pendant que le bouton de la souris 10 ou 11 est maintenu.

Un piratage inférieur

Je travaille actuellement sur ce numéro en faisant la souris 11 Cliquez pour tenir le Super_L bouton pendant une certaine quantité de temps. De cette façon, je peux Cliquez Le bouton de la souris, puis faites glisser des trucs pendant une brève période après:

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

Une autre tentative

Comme suggéré par Totti, j'ai essayé ceci xbindkeys Configuration:

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

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

Ça ne marche pas. Il semble le Super_L clé est tenu en baisse, car dès que je libère le bouton 10, il reste tenu pour toujours (jusqu'à ce que j'appuie sur la Super_L Touche à nouveau sur le clavier) mais le bouton de la souris est toujours enregistré, car je ne peux pas cliquer sur Windows. Je ne pense pas que je puisse être capable de faire ce travail en utilisant xbindkeys et xte.

14
Hubro

Un post askubuntu contient ne réponse que je vais résumer ci-dessous.

Le problème est que Xbindkeys attrape toute la souris, faisant des modifères + clic de souris, cartographie incertaine. La réponse utilise UINPPUT via Python-uinput Script pour surveiller /dev/my-mouse Pour le bouton Thumb, cliquez et envoyez le Ctrl clé du clavier virtuel. Voici les étapes détaillées:

1. Faire des règles udev

Pour la souris, le fichier /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 recherchera des appareils de noyau avec des noms tels que Event5. Le lien symbolique est de trouver la souris dans /dev/my_mx_mouse, lisible par le groupe mxgrabber.

Pour trouver des informations sur le matériel, exécutez quelque chose comme:

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

Pour Uinput, fichier /etc/udev/rules.d/94-mxkey.rules:

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

Débranchez et branchez votre souris ou forcez Udev pour déclencher les règles avec udevadm trigger.

2. Activer le module Uinput

Sudo modprobe uinput

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

uinput

3. Créer un nouveau groupe

Sudo groupadd mxgrabber
Sudo usermod -aG mxgrabber your_login

4. Python Script

Installer python-uinput library et python-evdev library.

Le script ci-dessous nécessite d'identifier l'événement.Code du bouton:

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

Faites le python exécutable et assurez-vous qu'il est chargé au démarrage.

5
harrymc

Comme vous pouvez exécuter un script sur un clic de souris, vous pouvez utiliser le tour suivant.
1. Appuyez sur la touche 11 à maintenez-la le Super clé . (-bouton 11 Trigers Un script)
[.____] 2. Déplacer les fenêtres à l'aide des autres boutons de la souris
3. Appuyez à nouveau sur bouton de la souris 11 à nouveau à version Super clé

script
[.____] Utilisez xdotool pour tenir Super Key
[.____] sur le premier bouton Cliquez, créez un fichier temporel et maintenez la touche HOLD. Dans le prochain clic, supprimez le fichier TMP et publiez la clé,

mettre à jour

Selon la page d'aide Ubuntu (plusieurs boutons Mouse Comment) imwheel peut remapper à une clé.

1
totti

Suggestion de débogage: j'essaierais de surveiller /dev/input/eventX Fichier Pour voir quels événements sont générés lorsque vous appuyez et relâchez ce bouton, en particulier dans les combinaisons avec BTN_LEFT. ICI est un exemple de code pour vous aider à démarrer. Vous devrez évidemment le modifier pour enregistrer tous les événements, non seulement des appuis clés.

Vous pouvez également vouloir vérifier xev Sortie, si vous ne l'avez pas déjà fait. L'analyse des deux journaux doit révéler le problème exact que vous rencontrez.

Les chances sont que votre souris génère des événements de relâchement des boutons supplémentaires lorsque plusieurs boutons sont enfoncés. Dans ce cas, vos options seraient d'utiliser des contours de liaison clés ou de modifier xf86-input-evdev Bibliothèque de filtrer les événements indésirables (ou simuler les manquants). J'ai fait quelque chose de similaire d'un certain temps pour un écran tactile qui a généré des événements "Cliquez sur" lors de la tentative de glisser-déposer. L'idée était de filtrer des événements "libérés" qui sont venus presque simultanément (dans une petite fenêtre de temps) avec des événements "Cliquez sur". Si ma supposition est correcte, vous devriez essentiellement mettre en œuvre quelque chose de similaire.

1
Dmitry Grigoryev

Je l'ai compris plus tôt aujourd'hui avec d'autres clés de modification. Le problème est que vous devez inclure le modificateur dans la combinaison de boutons pour la libération. En supposant que votre Super clé soit mappée sur MOD4 (qui devrait être la valeur par défaut, AFAIK):

"xte 'keydown Super_L'"
  b:11

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

EDIT: Il suffit de réaliser que cela ne répond pas complètement à votre question car vous ne pourrez toujours pas utiliser LMB tout en maintenant B: 11

1
DreadPirateLynx