xinput calibração e opções

2

Estou em um thinkpad lenovo x220t executando uma nova instalação do fedora 22. Tudo funciona bem, exceto quando eu conecto o tablet a um projetor, devido a mudança de resolução a caneta não está mais calibrada. Eu tentei xinput_calibrator para ajustá-lo, mas desde que ele detecta misclicks "auto-detect" eu realmente não posso fazê-lo funcionar. Tentei desativá-lo usando a opção --misclick 0 , mas isso também não funcionou. A opção --precalib não me leva a lugar algum.

Acho que a melhor maneira de resolver isso é definir manualmente em xinput , mas não consigo encontrar as opções no xinput manual . Então, aqui está a minha pergunta:

Perguntas: No xinput, quero usar a opção --set-int-prop device property format value . O nome do dispositivo para mim é "Wacom ISDv4 E6 Pen stylus" .

  1. O que devo usar como property para x_min , x_max etc?
  2. Qual deve ser o format ? Eu sei que os formatos disponíveis são 8, 16 e 32, mas qual deles devo escolher e o que eles significam?
  3. Existe algum lugar onde eu possa ler mais sobre essas opções?

-

Alternativamente, existe uma maneira melhor de lidar com essa calibração? O manual xinput_calibrator diz que eu provavelmente tenho um dos seguintes problemas:

  1. você é ruim em clicar em cruzes, usar uma caneta ou aumentar o limite de --misclique
  2. seu dispositivo não é suportado corretamente pelo kernel, ele interpreta os cliques errados
  3. sua tela tem uma deformação não linear, a calibração de 4 pontos não pode ajudá-lo

bem, tenho certeza de que 1 não é o caso. Não pode ser 2, porque funciona bem na resolução original. E provavelmente não é 3, já que posso realmente ver que é uma deformação linear à medida que a caneta chega à borda do monitor (não à tela), o ponteiro está na borda da tela e no centro eles combinam! Acredito que tudo que eu preciso é dizer ao xinput para escalar tudo por um fator constante, que eu não sei como.

Qualquer ajuda seria muito apreciada.

UPDATE: A instrução aqui me diz exatamente como "escalar" e "mudar" a tela, mas parece que eu posso Não acerte os números. Aqui estão algumas das minhas saídas:

para xrandr recebo várias linhas e, entre elas, há:

1366x768      60.02 +
...
1024x768      60.00*
...

A parte superior (aquela com +) é a mais alta suportada pelo meu monitor e, nessa resolução, consigo que a caneta funcione corretamente. A parte de baixo (aquela com *) é a minha resolução atual. Os números que o link sugere para usar são:

 c0 = touch_area_width / total_width
 c2 = touch_area_height / total_height
 c1 = touch_area_x_offset / total_width
 c3 = touch_area_y_offset / total_height

c2 = 1 e c3 = 0 para mim, já que não tenho problema com largura. para c0 e c3 eu estou usando esses números: touch_area_width = 1366 total_width = 1024 touch_area_x_offset = -171

Estou recebendo 171 de (1366 - 1024) / 2.

Esta tradução "quase" funciona. Alguém sabe qual desses parâmetros eu estou usando errado e como posso encontrar seu valor exato?

    
por Keivan 15.09.2015 / 19:11

1 resposta

2

Eu encontrei este post wiki do ArchLinux e ele faz exatamente o que eu preciso fazer, exceto que os números são um pouco off. Este tópico ficou muito confuso, estou respondendo, mas ainda resta um último, mas preciso trabalhar (veja abaixo).

Para acompanhar a discussão sobre este último bit, consulte este post .

Aqui está o que eu fiz:

De xrandr eu recebo:

Screen 0: minimum 8 x 8, current 1024 x 768, maximum 32767 x 32767
LVDS1 connected primary 1024x768+0+0 (normal left inverted right x axis y axis) 277mm x 156mm
   1366x768      60.02 +
   1280x720      60.00  
   1024x768      60.00* 
   1024x576      60.00  
   ...

O que tem + é a resolução máxima que o meu monitor suporta e o que tem * é a resolução atual. Então, eu concluo

total_width = 1024
touch_area_width = 1366
touch_area_x_offset = (1024 - 1366) /2 = -171

Isso é provavelmente o que estou fazendo de errado, porque no final não consigo exatamente o que preciso, mas quase lá.

Então eu olho para a saída da lista xinput

⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                  id=4    [slave  pointer  (2)]
⎜   ↳ Logitech M325                               id=9    [slave  pointer  (2)]
⎜   ↳ Wacom ISDv4 E6 Pen stylus                   id=10    [slave  pointer  (2)]
⎜   ↳ Wacom ISDv4 E6 Finger                       id=11    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                  id=13    [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                       id=14    [slave  pointer  (2)]
⎜   ↳ Wacom ISDv4 E6 Pen eraser                   id=16    [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)]
    ↳ Sleep Button                                id=8    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard                id=12    [slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                      id=15    [slave  keyboard (3)]

As linhas 4,5 e 8 são as que eu preciso, então os nomes dos dispositivos para mim serão "Caneta Wacom ISDv4 E6 Pen", "Wacom ISDv4 E6 Finger" e "Wacom ISDv4 E6 Pen eraser".

xinput list-props "device name" | grep Matrix deve listar a atual Matriz de Transformação de Coordenadas. O padrão é a matriz de identidade listada por linhas:

Coordinate Transformation Matrix (138): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000

A matriz de transformação é A matriz é

[ c0 0  c1 ]
[ 0  c2 c3 ]
[ 0  0  1  ]

O tutorial diz para calcular a matriz da seguinte forma: (os números à direita são os que eu calculei para o meu caso)

c0 = touch_area_width / total_width = 1366/1024 = 1.333984375
c2 = touch_area_height / total_height = 768/768 = 1
c1 = touch_area_x_offset / total_width = -171/768 = -0.22265625
c3 = touch_area_y_offset / total_height = 0/768 = 0

A razão c2 = 1 e c3 = 0 para mim é que na minha situação a altura é boa, então eu só preciso escalar e mudar a largura.

Tudo que preciso fazer agora é representar minha matriz como uma matriz de linhas, ou seja:

c0 0 c1 0 c2 c3 0 0 1

e isso para mim se torna:

1.333984375 0 -0.22265625 0 1 0 0 0 1

Então o seguinte comando deve fazer a tradução para mim:

xinput set-prop "DEVICE NAME" --type=float "Coordinate Transformation Matrix" 1.333984375 0 -0.22265625 0 1 0 0 0 1

Isso quase me leva onde eu quero estar, exceto que ainda está um pouco fora. Então, eu fiz um pouco de tentativa e erro para obter os seguintes números 1.345 0 -0.17 0 1 0 0 0 1

Então, aqui está a minha pergunta

Como encontrar os valores exatos para a matriz de transformação? Eu preciso trabalhar com resoluções diferentes e não posso repetir o processo de tentativa e erro para todos eles!

    
por 15.09.2015 / 22:40

Tags