Сценарий поворота экрана на устройствах с проблемами ориентации экрана
Скрипт поворота экрана на экране логина и калибровки устройства сенсорного ввода на устройствах с проблемами ориентации экрана и инвертированном сенсорном устройстве ввода. Проблема возникает на устройствах с сенсорным вводом, например DEPO Sky M70.
Скрипт fly-rotate-no-wm.sh
#!/bin/sh name= #nameWacom= connected=$(xrandr -q --verbose | grep " connected primary") output=$(echo "$connected" | head -n 1 | sed -e "s/\([a-zA-Z0-9]\+\) connected.*/\1/") if [ -z "$output" ] ; then connected=$(xrandr -q --verbose | grep " connected") output=$(echo "$connected" | head -n 1 | sed -e "s/\([a-zA-Z0-9]\+\) connected.*/\1/") if [ -z "$output" ] ; then echo "Не найден экран для поворота" exit 1 fi fi #Try to guess about current orientation #Find the line in "xrandr -q --verbose" output that contains current screen orientation and "strip" out current orientation. rotation="$(echo "$connected" | egrep -o '\) (normal|left|inverted|right) \(' | egrep -o '(normal|left|inverted|right)')" #cut the first connected rotation="$(echo $rotation | cut -d' ' -f1)" #Get input devices to rotate too #\t is default delimiter, to set other use -d option, i.e. -d' ' for space #name=`fly-wmfunc FLYWM_GET_INPUT_DEVICES 0x5 | grep -v Wacom | cut -f1 2> /dev/null | tr '\n' ';'` #nameWacom=`fly-wmfunc FLYWM_GET_INPUT_DEVICES 0x5 | grep Wacom | cut -f1 2> /dev/null | tr '\n' ';'` #name=`fly-wmfunc FLYWM_GET_INPUT_DEVICES 0x5 | cut -f1 2> /dev/null | tr '\n' ';'` name="4;11" IFS=';' #stop compton to restart COMPTON_PID=`ps -C compton -o pid=` [ ! -z $COMPTON_PID ] && kill $COMPTON_PID if ! test -z "$1"; then case "$1" in left) if [ "$rotation" = "right" ]; then xrandr --output $output --rotate normal if [ "$?" = 1 ]; then fly-dialog --caption "Вращение экрана" --msgbox "Не удалось выполнить вращение" exit 1 fi sleep 3 fi ;; right) if [ "$rotation" = "left" ]; then xrandr --output $output --rotate normal if [ "$?" = 1 ]; then fly-dialog --caption "Вращение экрана" --msgbox "Не удалось выполнить вращение" exit 1 fi sleep 3 fi ;; esac #Do required rotation xrandr --output $output --rotate "$1" if [ "$?" = 1 ]; then fly-dialog --caption "Вращение экрана" --msgbox "Не удалось выполнить вращение" exit 1 fi case "$1" in left) for name_i in $; do xinput set-prop --type=int --format=8 "$" "Evdev Axes Swap" 1 xinput set-prop --type=int --format=8 "$" "Evdev Axis Inversion" 1 0 xinput set-prop --type=int --format=8 "$" "Wacom Rotation" 2 done ;; right) for name_i in $; do xinput set-prop --type=int --format=8 "$" "Evdev Axes Swap" 1 xinput set-prop --type=int --format=8 "$" "Evdev Axis Inversion" 0 1 xinput set-prop --type=int --format=8 "$" "Wacom Rotation" 1 done ;; normal) for name_i in $; do xinput set-prop --type=int --format=8 "$" "Evdev Axes Swap" 0 xinput set-prop --type=int --format=8 "$" "Evdev Axis Inversion" 0 0 xinput set-prop --type=int --format=8 "$" "Wacom Rotation" 0 done ;; inverted) for name_i in $; do xinput set-prop --type=int --format=8 "$" "Evdev Axes Swap" 0 xinput set-prop --type=int --format=8 "$" "Evdev Axis Inversion" 1 1 xinput set-prop --type=int --format=8 "$" "Wacom Rotation" 3 done ;; esac else rotateTo= case "$rotation" in normal) rotateTo="left" ;; left) rotateTo="normal" ;; esac if ! test -z "$rotateTo"; then xrandr --output $output --rotate $rotateTo if [ "$?" = 1 ]; then fly-dialog --caption "Вращение экрана" --msgbox "Не удалось выполнить вращение" exit 1 fi else fly-dialog --caption "Вращение экрана" --msgbox "Не удалось определить текущую ориентацию экрана" exit 1 fi dentry= #if [ -f $HOME/.fly/toolbar/rotate.desktop ]; then # dentry=$HOME/.fly/toolbar/rotate.desktop #fi # Using current screen orientation proceed to rotate screen and input tools. case "$rotation" in normal) #rotate to the left if ! test -z "$dentry"; then sed -i 's/Icon[ \t]*[\=]*.*$/Icon=object-rotate-left/' "$dentry" fi for name_i in $; do xinput set-prop --type=int --format=8 "$" "Evdev Axes Swap" 1 xinput set-prop --type=int --format=8 "$" "Evdev Axis Inversion" 1 0 xinput set-prop --type=int --format=8 "$" "Wacom Rotation" 2 done ;; left) #rotate to the normal if ! test -z "$dentry"; then cat $dentry | sed 's/Icon[ \t]*[\=]*.*$/Icon=object-rotate-right/' > /tmp/dentry.tmp mv -f /tmp/dentry.tmp $dentry fi for name_i in $; do xinput set-prop --type=int --format=8 "$" "Evdev Axes Swap" 0 xinput set-prop --type=int --format=8 "$" "Evdev Axis Inversion" 0 0 xinput set-prop --type=int --format=8 "$" "Wacom Rotation" 0 done ;; esac fi #alex: need delay? #sleep 1 #TODO: do recalculation of icon positions instead of lineup fly-wmfunc FLYWM_ORDER_ICON [ ! -z $COMPTON_PID ] && compton &
Сценарий перед использованием необходимо модифицировать под вашу конфигурацию.
Необходимо убрать любую калибровку, любое использование xrandr и fly-rotate* в файле /etc/X11/fly-dm/Xsetup.
В сессии запустите команду xinput , в её выводе будет раздел Virtual core pointer ,
⎡ Virtual core pointer [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer [slave pointer (2)] ⎜ ↳ Logitech USB Optical Mouse [slave pointer (2)] .
4 и 11 — идентификаторы устройств типа указатель. Затем в скрипте fly-rotate-no-wm.sh найдите строку
это id устройств типа указатель, нужно вместо них через » ; » занести свои id (их может быть больше 2х)
Если оси инвертированы у тачскрина изначально, а у мыши изначально все ОК с курсором, то в строке:
. xinput set-prop --type=int --format=8 "$" "Evdev Axis Inversion" 1 0 .
надо попробовать все комбинации
Разместите скрипт, например в /usr/bin и вызывайте из /etc/X11/fly-dm/Xsetup (вместо fly-rotate.sh ) как
Отключение блокировки
Для того, чтобы тачскрин не блокировался на время гашения экрана надо
во всех файлах
/usr/share/fly-wm/theme/*themerc* (для новых пользователей)
$HOME/.fly/theme/*themerc* (для уже бывалых пользователей )
Найти и раскомментарить параметры:
;LockerDPMSInCallback="xinput disable %d" ;LockerDPMSOutCallback="xinput enable %d"
LockerDPMSInCallback="" LockerDPMSOutCallback=""
а если не отработает то так:
LockerDPMSInCallback="xinput enable %d" LockerDPMSOutCallback="xinput enable %d"
Калибровка тачскрина
Тачскрин работает, но неправильно, нужно откалибровать. Установил и запустил xinput_calibrator , ткнул 4 точки. Ничего не изменилось (хотя на этом этапе уже должно правильно работать!) Попробовал по указанию программы сохранить настройки в файлик /usr/share/X11/xorg.conf.d/99-calibration.conf :
Section "InputClass" Identifier "calibration" MatchProduct "Silead GSLx680 Touchscreen" Option "MinX" "67097" Option "MaxX" "401" Option "MinY" "-8966" Option "MaxY" "62759" Option "SwapXY" "0" # unless it was already set to 1 Option "InvertX" "0" # unless it was already set Option "InvertY" "0" # unless it was already set EndSection
В этой директории и другие похожие файлы есть, вроде 70-wacom.conf и пр. После ребута так же ничего не изменилось. Попробовал и в /etc/X11/xorg.conf.d/ закинуть (директорию пришлось создать) – так же ничего не поменялось.
Вот еще информация, которая может помочь: xinput -list
⎡ Virtual core pointer [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer [slave pointer (2)] ⎜ ↳ SteelSeries Rival Gaming Mouse [slave pointer (2)] ⎜ ↳ SteelSeries Rival Gaming Mouse [slave pointer (2)] ⎜ ↳ Silead GSLx680 Touchscreen [slave pointer (2)] ⎜ ↳ ImPS/2 Logitech Wheel Mouse [slave pointer (2)] ⎣ Virtual core keyboard [master keyboard (2)] ↳ Virtual core XTEST keyboard [slave keyboard (3)] ↳ Power Button [slave keyboard (3)] ↳ Video Bus [slave keyboard (3)] ↳ Power Button [slave keyboard (3)] ↳ SteelSeries Rival Gaming Mouse [slave keyboard (3)] ↳ PC Cam [slave keyboard (3)] ↳ AT Translated Set 2 keyboard [slave keyboard (3)] ↳ SteelSeries Rival Gaming Mouse [slave keyboard (3)]
(Мой девайс под номером 13)
Device 'Silead GSLx680 Touchscreen': Device Enabled (155): 1 Coordinate Transformation Matrix (157): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 libinput Calibration Matrix (314): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 libinput Calibration Matrix Default (315): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 libinput Send Events Modes Available (279): 1, 0 libinput Send Events Mode Enabled (280): 0, 0 libinput Send Events Mode Enabled Default (281): 0, 0 Device Node (282): "/dev/input/event9" Device Product ID (283): 0, 0
Попробовал поиграться с set-prop – тоже безрезультатно. Свойство вроде применяется (?), но эффекта нет. xinput set-prop 13 —type=atom —format=32 InvertX 1 , xinput list-props 13 :
Device 'Silead GSLx680 Touchscreen': Device Enabled (155): 1 Coordinate Transformation Matrix (157): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 libinput Calibration Matrix (314): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 libinput Calibration Matrix Default (315): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000 libinput Send Events Modes Available (279): 1, 0 libinput Send Events Mode Enabled (280): 0, 0 libinput Send Events Mode Enabled Default (281): 0, 0 Device Node (282): "/dev/input/event9" Device Product ID (283): 0, 0 InvertX (578): "PRIMARY" (1)
Этот тред я читал, но не понял, как тамошний гуру всё разрулил, да и у того человека калибровка уже работала, а у меня ничего.
Калибровка тачскринов в Linux
Есть промышленный моноблок с Linux. Ну т.е. Linux туда я поставил. Так то диск с драйверами только под Windows. У него [моноблока] есть тачскин. Я пытаюсь откалибровать (получить парметры калибровки) его с помощью утилиты xinput_calibrator (кликаешь по 4 точками) и вот всякий раз после второго/или третьего/или четвертого клика я получаю ошибку: Mis-click detected, restarting…
If you keep getting the message 'Mis-click detected, restarting. ', one of the following is happening: 1. you are bad at clicking on crosses, use a stylus or increase the --misclick threshold 2. your device is not properly supported by the kernel, it interprets the clicks wrong 3. your screen has a non-linear deformation, 4-point calibration can not help you
Пункт 1 (increase the –misclick threshold) я пробовал итоговая матрица трансформации получается неточная — получаются большие неточностии в кликах/тапах.
Пункт 2 — ну хз, может и оно конечно, но пока будем думать, что все же нет.
Пункт 3 — вот может быть этот пункт. Тогда вопрос: xinput_calibrator умеет калибровать только по 4 точкам. А как мне (с помощью какой программы / алгоритма расчета) откалибровать не по 4 точкам, а по большему количеству. Например в Windows на этом же моноблоке колибровка происходит с использованием программы, которая идет вместе с драйвером на диске и там можно колибровать по 8/16/24 точкам (может немного напутал количество, но там точно много раз нажимать нужно, и не только по 4 угловым точками, а по промежуточным тоже и после такой колибровки в Windows работает почти идеально точно.