我有一台旧的 Windows 平板电脑,我成功地在上面安装了 Ubuntu(WinBook TW700),它运行得很好。我最初安装了 16.04,能够通过使用 xinput-calibrator 和编辑 99-configuration.conf 文件来解决倒置轴问题,并且屏幕运行良好。然后我犯了一个错误,升级到了 19.04。
在 19.04 中,我根本无法再配置屏幕。触摸被识别(现在可以旋转,尽管这也是反转的),但如果我触摸右下角,指针会出现在左上角,反之亦然。99-configuration.conf 似乎没有效果。我如何以及在哪里进行调整才能使此配置正确?如果我可以同时获得反转的 x 和 y 设置以及屏幕旋转,那就太好了。感谢您的任何帮助或建议。
答案1
从内核 4.20 开始,这个功能就一直对我有用,这是我第一次使用触摸屏。我必须运行脚本来旋转,直到内核 5.0,我才运行以下脚本来校准触摸笔和屏幕。关键行是:
xinput map-to-output $i eDP
您从 xinput 获得的内容在哪里$1
,它是一个数字(我发现它在启动之间可能会发生变化,因此我从带有行的名称中获取它deviceid=
,我的是 ELAN0732:00)。请注意,我必须触摸屏幕来激活笔才能使其显示在 xinput 中。数字一直在变化。
上周我遇到了一个问题,笔光标在笔接触的地方偏离了,但这个问题已经神奇地解决了,实际上刚刚检查了一下就恢复了,所以我需要解决这个问题。我想我的脚本又把它修好了。
此链接帮助进行了旋转。我仍然没有在显示设置中显示这些内容,尽管我认为它曾经显示过。这与 Ubuntu AMD 今年的体验一致。 https://wiki.ubuntu.com/X/InputCoordinateTransformation
我编写了一个脚本,保存为 RotateMapToOutputs.sh
# dont forget to touch the screen first with the pen.
touchscreen=""
pen=""
OIFS=$IFS
search=""ELAN0732:00""
# note that the pen didnt show up until I mapped the standard one or clicked the screen.
# so need to do that first
echo $search
list=$(xinput | grep $search | grep pointer)
echo "list $list"
# just a text file to work with the list.
if [ -f tempxinput.txt ]
then
echo " removing tempxinput"
rm tempxinput.txt
fi
device_id=$(echo "$list" | sed -n 's/.*ELAN0732:00.*id=\([0-9]*\).*/\1/p')
for i in $device_id
do
echo "id is $i"
xinput map-to-output $i eDP
done
然后我设置键盘快捷键来执行
bash "~/MyScripts/ RotateMapToOutputs.sh"
因为看起来您可能在旋转方面遇到了麻烦,这是我的旋转反转脚本,我创建了一个如上所示的快捷键。(请注意,那里的 maptoputput 可能有误,因为 14 不再是那个,所以如果它没有校准,那么我可以在任何旋转之后运行上述 maptooutputs。
xrandr --output eDP --rotate inverted && xinput set-prop 'ELAN0732:00 04F3:2536 Pen (0)' --type=float "Coordinate Transformation Matrix" -1 0 1 0 -1 1 0 0 1 && xinput map-to-output 'ELAN0732:00 04F3:2536 Pen (0)' eDP && xinput map-to-output 14 eDP
正常情况是:
xrandr --output eDP --rotate normal && xinput set-prop 'ELAN0732:00 04F3:2536 Pen (0)' --type=float "Coordinate Transformation Matrix" 0 0 0 0 0 0 0 0 0 && xinput map-to-output 'ELAN0732:00 04F3:2536 Pen (0)' eDP && xinput map-to-output 14 eDP
左边:
xrandr --output eDP --rotate left && xinput set-prop 'ELAN0732:00 04F3:2536 Pen (0)' --type=float "Coordinate Transformation Matrix" 0 -1 1 1 0 0 0 0 1 && xinput map-to-output 'ELAN0732:00 04F3:2536 Pen (0)' eDP && xinput map-to-output 14 eDP
正确的:
xrandr --output eDP --rotate right && xinput set-prop 'ELAN0732:00 04F3:2536 Pen (0)' --type=float "Coordinate Transformation Matrix" 0 1 0 -1 0 1 0 0 1 && xinput map-to-output 'ELAN0732:00 04F3:2536 Pen (0)' eDP && xinput map-to-output 14 eDP
答案2
为了防止其他人偶然发现这个线程并寻找使用特定旋转配置指向显示器的指针的方法,我会在这里链接我的脚本:https://github.com/SimonLammer/dotfiles/blob/0b98315b06b9393df6235457007b84831f1646f5/data/scripts/xinput-configure-pointer
它通过允许平板电脑限制在显示器上,改进了 pierrely 的答案。
#!/bin/sh
# Limits a pointer to a display with an orientation.
# This can be used to limit a rotated graphics tablet to one display.
set -e
ZENITY='zenity --width 500 --height 500'
# Select pointer
pointers=`xinput | grep pointer | tail -n +2 | sed -E 's/[^a-zA-Z0-9]*((\S+ ?)+[a-zA-Z0-9\(\)]+)\s*id=([0-9]+)\s*(.*)/"\3" "\1" "\4"/'`
#echo $pointers
pointer=`echo $pointers | xargs $ZENITY --list --text "Choose a pointer" --column Id --column Name --column Info`
#echo $pointer
# Select display
displays=`xrandr | grep \ con | sed -E 's/(\S+)[^0-9]*(.*)/"\1" "\2"/'`
#echo $displays
display=`echo $displays | xargs $ZENITY --list --text "Choose a display" --column Id --column Info`
#echo $display
# Map pointer to display to get initial coordinate transformation matrix
xinput map-to-output "$pointer" "$display"
mat0=`xinput list-props $pointer | grep "Coordinate Transformation Matrix" | cut -d ':' -f 2`
# Select orientation
o1="0°C"
o2="90°C"
o3="180°C"
o4="270°C"
orientation=`$ZENITY --list --text "Choose an orientation" --column Orientation --column Name "$o1" "Normal" "$o2" "Rotate left" "$o3" "Invert" "$o4" "Rotate right"`
# https://wiki.ubuntu.com/X/InputCoordinateTransformation
if [ "$orientation" = "$o1" ]; then
mat1="1 0 0 0 1 0 0 0 1"
elif [ "$orientation" = "$o2" ]; then
mat1="0 -1 1 1 0 0 0 0 1"
elif [ "$orientation" = "$o3" ]; then
mat1="-1 0 1 0 -1 1 0 0 1"
else
mat1="0 1 0 -1 0 1 0 0 1"
fi
# Multiply matrices (mat2 = mat0 * mat1)
# https://www.mymathtables.com/calculator/matrix/3-cross-3-matrix-multiplication.html
perl_expr="@a=split(/,? /,'$mat0');@b=split(/ /,'$mat1');print \"\"\
.(\$a[0]*\$b[0]+\$a[1]*\$b[3]+\$a[2]*\$b[6]).\" \".(\$a[0]*\$b[1]+\$a[1]*\$b[4]+\$a[2]*\$b[7]).\" \".(\$a[0]*\$b[2]+\$a[1]*\$b[5]+\$a[2]*\$b[8]).\" \"\
.(\$a[3]*\$b[0]+\$a[4]*\$b[3]+\$a[5]*\$b[6]).\" \".(\$a[3]*\$b[1]+\$a[4]*\$b[4]+\$a[5]*\$b[7]).\" \".(\$a[3]*\$b[2]+\$a[4]*\$b[5]+\$a[5]*\$b[8]).\" \"\
.(\$a[6]*\$b[0]+\$a[7]*\$b[3]+\$a[8]*\$b[6]).\" \".(\$a[6]*\$b[1]+\$a[7]*\$b[4]+\$a[8]*\$b[7]).\" \".(\$a[6]*\$b[2]+\$a[7]*\$b[5]+\$a[8]*\$b[8]).\" \"\
.\"\\n\""
#echo $perl_expr
mat2=`perl -E "$perl_expr"`
xinput set-prop "$pointer" --type=float "Coordinate Transformation Matrix" $mat2