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:
Mais il y a un problème: je ne peux pas déplacer Windows en utilisant Super_L + Mouse1 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.
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
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
.
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.
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é,
Selon la page d'aide Ubuntu (plusieurs boutons Mouse Comment) imwheel
peut remapper à une clé.
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.
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