Калибровка ручки и касания через xinput

Введение

Это результат моего предыдущего вопроса.

Когда я подключаю планшет к проектору, из-за смены разрешения перо уже не откалибровано. Я нашел этот wiki-пост от ArchLinux, и он делает именно то, что мне нужно сделать, за исключением чисел, которые немного не работают. Вот что я сделал:

Из xrandr я получаю:

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

Один с + – максимальное разрешение, поддерживаемое моим монитором, и одно с * – текущее разрешение. Итак, я завершаю

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

Вероятно, это то, что я делаю неправильно, потому что в конце я не получаю именно то, что мне нужно, но почти там.

Затем я смотрю на вывод списка 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)] 

Строки 4,5 и 8 – это те, которые мне нужны, поэтому для ИМЯ УСТРОЙСТВА для меня будет «Wacom ISDv4 E6 Pen stylus», «Wacom ISDv4 E6 Finger» и «Wacom ISDv4 E6 Pen eraser».

xinput list-props "device name" | grep Matrix xinput list-props "device name" | grep Matrix должна отображать текущую матрицу трансформации координат. По умолчанию используется идентификационная матрица, которая указана строками:

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

Матрица преобразования – это матрица

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

В учебнике сказано, чтобы вычислить матрицу следующим образом: (числа справа – это те, которые я рассчитал для своего случая)

 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 

Причина c2 = 1 и c3 = 0 для меня в том, что в моей ситуации высота прекрасна, поэтому мне нужно только масштабировать и сдвигать ширину.

Все, что мне нужно сделать, это представить мою матрицу как массив строк, то есть:

 c0 0 c1 0 c2 c3 0 0 1 

и это для меня становится:

 1.333984375 0 -0.22265625 0 1 0 0 0 1 

Затем мне понадобится следующая команда:

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

Это почти дает мне то место, где я хочу быть, но это все еще немного. Итак, я сделал несколько проб и ошибок, чтобы получить следующие номера: 1.345 0 -0.17 0 1 0 0 0 1

Вот мой вопрос

Как найти точные значения матрицы преобразования? Мне нужно работать с разными разрешениями, и я не могу повторить процесс проб и ошибок для всех из них!

Linux и Unix - лучшая ОС в мире.