Executa um comando shell APÓS um dispositivo de entrada bluetooth é detectado?

4

Estou tentando diminuir a sensibilidade do meu Magic Mouse usando o comando xinput automaticamente quando meu mouse está conectado ao meu computador.

Eu consegui criar um arquivo em rules.d , que chama um script de shell. O problema é que ele funciona bem para todos os scripts, exceto o comando xinput , porque a regra inicia o script antes que o mouse seja listado entre outros dispositivos de entrada e, portanto, o comando xinput não consegue encontrá-lo. Então, minha pergunta é se existe uma maneira de executar o comando que eu preciso somente depois que o mouse for detectado como dispositivo de entrada ou se houver outras soluções para o meu problema.

Do terminal, antes do mouse conectar por 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

Depois que o mouse se conecta por BT eu recebo:

$ 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>

Esta é a regra do meu udev colocada em /etc/udev/rules.d:

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

Este é o meu script de shell /home/elios/Documents/FixMouse.sh (editado graças à resposta 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

Outras informações:

$ 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
    
por elios 16.10.2015 / 09:48

1 resposta

2

No script chamado pela regra yr udev, coloque o fragmento while, do, done abaixo, antes do seu xinput parâmetro tweaks.

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

Ele permite que o script do yr espere por intervalos de tempo sucessivos de 0,1 segundo, até que o mouse seja devidamente conectado por Bluetooth e antes que o xinput --set-prop cmds seja acionado.

Note que você tem três maneiras de ajustar a resposta do mouse a um movimento da mão.

  • Desaceleração constante do Accel do dispositivo (528): 2.500000
  • Desaceleração adaptativa do dispositivo Accel (529): 1.000000
  • Escala de velocidade de aceleração do dispositivo (530): 10.000000

Verifique se this e this para descobrir exatamente o que significam esses valores de parâmetro. Para modificar satisfatoriamente o "escalonamento de velocidade", você precisará saber qual é a taxa de atualização do seu mouse (em Hz). Você deve encontrar esse valor na ficha de dados técnicos do seu mouse. O valor de Escala de velocidade é estimado em 1000/refresh_rate_in_Hz . Assim, 3.3 assume uma taxa de atualização de 300Hz, 10 uma taxa de atualização de 100Hz.

O script Yr parece não alterar os valores padrão de:

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

como revelado por yr xinput --list-props cmd ... Tente modificar o valor de 2,5 para prop_id 528 e perceba que definir prop_id 529 como 1 (padrão) significa " nenhuma aceleração ou desaceleração adaptativa ".

A regra do udev que você adaptou da resposta de Gilles em AU / U & L não se aplica estritamente ao caso do ano. O que você precisa é de uma regra que seja implementada após a "adição" do dispositivo yr, ou seja, assim que sua presença inicializar um evento do kernel. Então, a regra do udev deve simplesmente ler:

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

onde você deve substituir

por Cbhihe 16.10.2015 / 23:31