Автоповорот экрана в Dell inspiron 5378 с Ubuntu / Kubuntu
Nov 27, 2017 00:10
Технический уголок
Не всё же мне писать о политике и социальных проблемах. Есть ещё и другая сфера, где чем-то можно поделиться. Итак, стал я счастливым обладателем нутбука Dell inspiron 5378 с предустановленной Ubuntu. Ноутбук интересен тем, что он два в одном - трансформируется в планшет путем выворачивания экрана на 180 градусов. Естественно у него сенсорный экран. И утверждается, что работает поворот экрана. То есть в нём установлен акселерометр. Но... вроде бы с Windows это работает из коробки, а вот в убунту - нет. Путем долгих блужданий по сети я нашёл скрипт, который пришлось немного доработать, чтобы всё стало в порядке. Итак, на просторах интернета был найден (и далеко не сразу) вот такое руководство и скрипт https://linuxappfinder.com/blog/auto_screen_rotation_in_ubuntu В целом оно работает. За одним исключением. Так как у нас сенсорный экран, то при повороте картинки надо ему указывать и на то, что координаты экрана измениилсь. В противном случае, была веселая ситуация, когда картинка повернулась, а при нажатии на то место, где нарисована кнопка, отрабатывало нажатие в каком-то другом месте. Ибо для сенсора как бы поворота не произошло. Не знаю, как точно это объяснить, но на бытовом уровне это так - картинка повернулась, а сенсор об этом не знает. Путем опять же долгих поисков был найден вот такой скрипт https://gist.github.com/mildmojo/48e9025070a2ba40795c Он поворачивает сенсорный экран (и тачпад, но нас это не интересует). Но при этом он получает направление поворота не автоматически, а через параметр. Пришлось скрестить ужа с ежом и получить работающий скрипт.
[Развернуть скрипт] #!/bin/sh # Auto rotate screen based on device orientation
# Receives input from monitor-sensor (part of iio-sensor-proxy package) # Screen orientation and launcher location is set based upon accelerometer position # Launcher will be on the left in a landscape orientation and on the bottom in a portrait orientation # This script should be added to startup applications for the user
# Clear sensor.log so it doesn't get too long over time > $LOGSENSOR
# Launch monitor-sensor and store the output in a variable that can be parsed by the rest of the script monitor-sensor >> $LOGSENSOR 2>&1 &
# Parse output or monitor sensor to get the new orientation whenever the log file is updated # Possibles are: normal, bottom-up, right-up, left-up # Light data will be ignored while inotifywait -e modify $LOGSENSOR; do # Read the last line that was added to the file and get the orientation ORIENTATION=$(tail -n 1 $LOGSENSOR | grep 'orientation' | grep -oE '[^ ]+$') # Set the actions to be taken for each possible orientation case "$ORIENTATION" in normal) xrandr --output $MONITORDEV --rotate normal xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 1 0 0 0 1 0 0 0 1 ;; bottom-up) xrandr --output $MONITORDEV --rotate inverted xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" -1 0 1 0 -1 1 0 0 1 ;; right-up) xrandr --output $MONITORDEV --rotate right xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 0 1 0 -1 0 1 0 0 1 ;; left-up) xrandr --output $MONITORDEV --rotate left xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 0 -1 1 1 0 0 0 0 1 ;; esac
done
Принцип его работы следующий. Для начала определим, что за монитор у тачскрин у нас. выполним в терминале команду xinput среди прочего я у себя вижу ELAN Touchscreen - это имя моего тачскрина. Теперь выолним команду xrandr Мой монитор именуется eDP-1. В переменной LOGSENSOR лежит путь, где создавать файл. Я создал в домашней директории для него поддиректорию и указал путь в этой переменной. Далее, он создается или очищается. И monitor-sensor будет в него писать при изменении ориентации экрана новую ориентацию. Команда inotifywait следит за файлом, и когда в нём происходят изменения, она проваливается на следующие строчки Там из этого файла достается новая ориентация и с помощью команды xrandr поворачивается изображение, а с помощью команды xinput перекалибруется сенсорный экран.
Вот и всё. Добавил этот скрипт в автозагрузку, и всё теперь работает. За одним исключением. За работу акселерометра отвечает модуль i2c_i801. Добавление его в /etc/modules не помогло. И пришлось опять потратить время, чтобы докопаться, что в кубунте он был в блэклисте, то есть принудительно не загужался. Убрал его из блэклиста и всё. Теперь всё работает.