web-dev-qa-db-fra.com

Exécuter une commande Shell APRES la détection d’un périphérique d’entrée Bluetooth?

J'essaie de ralentir la sensibilité de ma souris Magic Mouse à l'aide d'une commande xinput automatiquement lorsque ma souris est connectée à mon ordinateur.

J'ai réussi à créer un fichier sous rules.d, qui appelle un script Shell. Le problème est que cela fonctionne bien pour tous les scripts à l'exception de la commande xinput, car la règle le lance avant que la souris ne soit répertoriée entre les autres périphériques d'entrée et la commande xinput ne parvient pas à le trouver. Ma question est donc de savoir s’il existe un moyen d’exécuter la commande dont j’ai besoin uniquement après la détection de la souris comme périphérique d’entrée ou s’il existe d’autres solutions à mon problème.

Depuis le terminal, avant que la souris ne se connecte par BT:

$ hcitool inq
Inquiring ...
00:1E:52:EE:0C:1B   clock offset: 0x33fb    class: 0x3a0104
84:38:35:31:CC:6B   clock offset: 0x1353    class: 0x002580
$ hcitool scan
Scanning ...
84:38:35:31:CC:6B   Mouse of Elios
00:1E:52:EE:0C:1B   Elios

Après la connexion de la souris par BT, je reçois:

$ hcitool info 84:38:35:31:CC:6B
Requesting information ...
BD Address:  84:38:35:31:CC:6B
Device Name: Mouse of Elios
LMP Version: 2.0 (0x3) LMP Subversion: 0x31c
Manufacturer: Apple, Inc. (76)
Features: 0xbd 0x02 0x04 0x38 0x08 0x00 0x00 0x00
    <3-slot packets> <encryption> <slot offset> <timing accuracy> 
    <role switch> <sniff mode> <RSSI> <power control> 
    <enhanced iscan> <interlaced iscan> <interlaced pscan> 
    <AFH cap. slave>

Voici ma règle udev placée dans /etc/udev/rules.d:

SUBSYSTEMS=="input", ATTRS{name}=="Mouse of Elios", RUN+="/home/elios/Documents/FixMouse.sh"

Ceci est mon script Shell /home/elios/Documents/FixMouse.sh (édité grâce à la réponse de Cbhihe):

#!/bin/sh
while [ ! "$(/usr/bin/hcitool info 84:38:35:31:CC:6B 2>&1 > /dev/null; echo $?)" ]; do
 sleep 0.1
done
xinput --set-prop "Mouse of Elios" "Device Accel Constant Deceleration" 2.5

Autres renseignements:

$ uname -a
Linux dalek 3.19.0-30-generic #34-Ubuntu SMP Fri Oct 2 22:08:41 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ xinput --list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Mouse of Elios                    id=13   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ Apple, Inc Apple Keyboard                 id=10   [slave  keyboard (3)]
    ↳ Apple, Inc Apple Keyboard                 id=11   [slave  keyboard (3)]
    ↳ FaceTime HD Camera (Built-in)             id=12   [slave  keyboard (3)]
$ xinput --list-props "Mouse of Elios"
Device 'Mouse of Elios':
Device Enabled (133):   1
Coordinate Transformation Matrix (135): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Accel Profile (527): 0
Device Accel Constant Deceleration (528):   2.500000
Device Accel Adaptive Deceleration (529):   1.000000
Device Accel Velocity Scaling (530):    10.000000
Device Product ID (253):    1452, 781
Device Node (254):  "/dev/input/event5"
Evdev Axis Inversion (531): 0, 0
Evdev Axes Swap (533):  0
Axis Labels (534):  "Rel X" (143), "Rel Y" (144), "Rel Horiz Wheel" (517), "Rel Vert Wheel" (518)
Button Labels (535):    "Button Left" (136), "Button Middle" (137), "Button Right" (138), "Button Wheel Up" (139), "Button Wheel Down" (140), "Button Horiz Wheel Left" (141), "Button Horiz Wheel Right" (142)
Evdev Scrolling Distance (536): 1, 1, 1
Evdev Middle Button Emulation (537):    0
Evdev Middle Button Timeout (538):  50
Evdev Third Button Emulation (539): 0
Evdev Third Button Emulation Timeout (540): 1000
Evdev Third Button Emulation Button (541):  3
Evdev Third Button Emulation Threshold (542):   20
Evdev Wheel Emulation (543):    0
Evdev Wheel Emulation Axes (544):   0, 0, 4, 5
Evdev Wheel Emulation Inertia (545):    10
Evdev Wheel Emulation Timeout (546):    200
Evdev Wheel Emulation Button (547): 4
Evdev Drag Lock Buttons (548):  0
4
elios

Dans le script appelé par la règle yd udev, placez le fragment while, do, done ci-dessous, avant vos réglages de paramètres xinput.

#!/bin/sh 
while [ ! "$(/usr/bin/hcitool info 84:38:35:31:CC:6B >& /dev/null; echo $?)" ]; do
     sleep 0.1
done
xinput --set-prop "Mouse of Elios" "Device Accel Constant Deceleration" 5.0
xinput --set-prop "Mouse of Elios" "Device Accel Adaptive Deceleration" 1.0
xinput --set-prop "Mouse of Elios" "Device Accel Velocity Scaling" 3.3

Il permet à votre script d’attendre des intervalles de temps successifs de 0,1 seconde, jusqu’à ce que la souris soit correctement connectée par Bluetooth et avant le début du xinput --set-prop cmds.

Notez que vous avez trois façons de modifier la réponse de la souris à un mouvement de la main.

  • Décélération constante de l'accélération de l'appareil (528): 2.500000
  • Décélération adaptative Device Accel (529): 1.000000
  • Mise à l'échelle de la vitesse d'accélération de l'appareil (530): 10.000000

Vérifiez this et this pour déterminer exactement ce que ces valeurs de paramètre représentent. Afin de modifier de manière satisfaisante la "mise à l'échelle de la vitesse", vous devez connaître le taux de rafraîchissement de votre souris (en Hz). Vous devriez trouver cette valeur sur la fiche technique de votre souris. La valeur de Velocity Scaling est estimée à 1000/refresh_rate_in_Hz. Ainsi, 3.3 supposons un taux de rafraîchissement de 300Hz, 10 un taux de rafraîchissement de 100Hz.

Le script Yr ne semble apporter aucun changement aux valeurs par défaut de:

  • Device Accel Constant Deceleration (528): 2.500000
  • Device Accel Adaptive Decelaration (529): 1.000000

comme indiqué par yr xinput --list-props cmd ... Essayez de modifier la valeur de 2.5 pour prop_id 528 et réalisez que définir prop_id 529 sur 1 (valeur par défaut) signifie " pas d'accélération ou de décélération adaptative ".

La règle udev que vous avez adaptée depuis Gilles ' answer on AU/U & L ne s'applique pas strictement à votre cas. Ce dont vous avez besoin, c’est d’une règle qui intervient lors de "l’ajout" d’un périphérique, c’est-à-dire dès que sa présence déclenche un événement du noyau. Donc, votre règle devrait simplement se lire:

ACTION=="add", SUBSYSTEMS=="input", ATTRS{idVendor}=="____", ATTRS{idProduct}=="____", RUN+="/usr/local/sbin/fixmouse"

où vous devez remplacer ____ par les variables idVendor et idProduct de votre périphérique réel. Pour trouver cette information:

$ udevadm monitor

connectez votre souris BT. Lisez sur la ligne où "KERNEL" apparaît, quelque chose semblable à:

  KERNEL[22576.118379] add   /devices/pci0000:00/0000:00:1d.7/hci2/2-3/2-3.4/2-3.4:1.0/0003:192F:0916.0004/input/input23/mouse1 (input)

Pour mettre fin à la surveillance, tapez simplement CTRL + C, puis:

$ udevadm info -a -p '/devices/pci0000:00/0000:00:1d.7/hci2/2-3/2-3.4/2-3.4' | grep -e "idVendor" -e "idProduct" 

Vous devez obtenir 2 ou 3 paires de valeurs (idVendor, idProduct), en fonction de la manière dont votre matériel est assemblé. Mes rendements d'utilisation:

ATTRS{idVendor}=="192f"
ATTRS{idProduct}=="0916"
ATTRS{idVendor}=="1a40"
ATTRS{idProduct}=="0101"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0002"

Essayez-les dans votre règle udev dans leur ordre d'apparition. Normalement, le plus haut devrait être le bon.

Pour finir, faites:

$ Sudo mv /home/elios/Documents/FixMouse.sh /usr/local/sbin/fixmouse
$ Sudo chown root:root /usr/local/sbin/fixmouse
$ Sudo chmod 755 /usr/local/sbin/fixmouse

J'espère que j'ai bien compris. De toute façon, laissez-nous savoir.

2
Cbhihe