Автоповорот экрана в 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

# set constants
TOUCHSCREEN='ELAN Touchscreen'
MONITORDEV='eDP-1'
TRANSFORM='Coordinate Transformation Matrix'
# log file
LOGSENSOR='/home...'

# 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 не помогло. И пришлось опять потратить время, чтобы докопаться, что в кубунте он был в блэклисте, то есть принудительно не загужался.
Убрал его из блэклиста и всё. Теперь всё работает.

dell inspiron 5378

Previous post Next post
Up