mirror of
https://github.com/BlackLight/cutiepi-rotation-scripts.git
synced 2024-11-24 04:35:11 +01:00
Added files
This commit is contained in:
parent
ea31d3810f
commit
d92d98a4b8
6 changed files with 162 additions and 1 deletions
61
README.md
61
README.md
|
@ -1,2 +1,61 @@
|
||||||
# cutiepi-rotation-scripts
|
# cutiepi-rotation-scripts
|
||||||
A set of scripts and services to manage screen rotation on the CutiePi
|
|
||||||
|
A set of scripts and services to manage display rotation on the CutiePi tablet.
|
||||||
|
|
||||||
|
It interacts with the CutiePi gyroscope over `iio-sensor-proxy` to detect the
|
||||||
|
orientation of the device, and it manipulates the display rotation using some
|
||||||
|
simple `xrandr` and `xinput` scripting.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Ensure that the `iio-sensor-proxy` package is installed:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ sudo apt install iio-sensor-proxy
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Clone the repo:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ git clone https://github.com/BlackLight/cutiepi-rotation-scripts
|
||||||
|
$ cd cutiepi-rotation-scripts
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Simply add the `bin` folder to your `PATH`, or copy/symlink its content
|
||||||
|
somewhere in your `PATH`
|
||||||
|
|
||||||
|
4. If you want to run the `autorotate` script as a startup service:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ mkdir -p ~/.config/systemd/user
|
||||||
|
$ cp systemd/autorotate.service ~/.config/systemd/user
|
||||||
|
$ systemctl --user daemon-reload
|
||||||
|
# Start the service
|
||||||
|
$ systemctl --user start autorotate
|
||||||
|
# Enable the service at startup
|
||||||
|
$ systemctl --user enable autorotate
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
As shown in the previous example, the `autorotate` script can be enabled as a
|
||||||
|
startup service and it can automatically handle the rotation of the display by
|
||||||
|
polling gyroscope sensor data.
|
||||||
|
|
||||||
|
There are also two auxiliary scripts (`screen-rotate-left` and
|
||||||
|
`screen-rotate-right`) that can be programmatically called in your scripts or
|
||||||
|
launched from the panel to manually force display orientation.
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
The `autorotate` script disables the HDMI input when started. The reason is
|
||||||
|
that the calculation of the coordinate transformation matrices for the touchpad
|
||||||
|
is much more complex when working with extended displays. If your tablet is
|
||||||
|
physically connected to a screen, however, the chances that you may want to
|
||||||
|
leverage auto-rotation are quite low anyway, so a workaround could be a simple
|
||||||
|
script that turns on the HDMI input and stops the `autorotate` service when an
|
||||||
|
HDMI input is plugged, and restarts it when it's unplugged.
|
||||||
|
|
||||||
|
If a strong use case exists for handling auto-rotation on extended displays,
|
||||||
|
feel free to open an issue.
|
||||||
|
|
||||||
|
|
25
bin/autorotate
Executable file
25
bin/autorotate
Executable file
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||||
|
source "$script_dir/cutiepi-screen-common"
|
||||||
|
|
||||||
|
# Turn off the HDMI interface. This actually shouldn't be required, but taking
|
||||||
|
# the second display into account would make the xinput coordinate transformation
|
||||||
|
# matrices more complex (TODO it can be tackled later if there's enough demand for
|
||||||
|
# screen rotation features while the tablet is attached to another screen)
|
||||||
|
xrandr --output HDMI-2 --off
|
||||||
|
|
||||||
|
# Default rotation: standard horizontal
|
||||||
|
screen_set_horizontal
|
||||||
|
|
||||||
|
monitor-sensor | while read line; do
|
||||||
|
echo "$line" | egrep '^\s*Accelerometer orientation changed: ' >/dev/null || continue
|
||||||
|
orientation=$(echo "$line" | awk '{print $4}')
|
||||||
|
case "$orientation" in
|
||||||
|
left-up) screen_set_horizontal;;
|
||||||
|
normal) screen_set_vertical;;
|
||||||
|
right-up) screen_set_horizontal_inverted;;
|
||||||
|
bottom-up) screen_set_vertical_inverted;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
30
bin/cutiepi-screen-common
Normal file
30
bin/cutiepi-screen-common
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Ensure that the display variable is set
|
||||||
|
export DISPLAY=:0
|
||||||
|
|
||||||
|
screen_rotation() {
|
||||||
|
cur_rotation=$(xrandr --query --verbose | grep DSI-1 | cut -d ' ' -f 5)
|
||||||
|
echo $cur_rotation
|
||||||
|
}
|
||||||
|
|
||||||
|
screen_set_horizontal() {
|
||||||
|
xrandr --output DSI-1 --rotate left
|
||||||
|
xinput set-prop 11 "Coordinate Transformation Matrix" 0 -1 1 1 0 0 0 0 1
|
||||||
|
}
|
||||||
|
|
||||||
|
screen_set_vertical() {
|
||||||
|
xrandr --output DSI-1 --rotate normal
|
||||||
|
xinput set-prop 11 "Coordinate Transformation Matrix" 1 0 0 0 1 0 0 0 1
|
||||||
|
}
|
||||||
|
|
||||||
|
screen_set_horizontal_inverted() {
|
||||||
|
xrandr --output DSI-1 --rotate right
|
||||||
|
xinput set-prop 11 "Coordinate Transformation Matrix" 0 1 0 -1 0 1 0 0 1
|
||||||
|
}
|
||||||
|
|
||||||
|
screen_set_vertical_inverted() {
|
||||||
|
xrandr --output DSI-1 --rotate inverted
|
||||||
|
xinput set-prop 11 "Coordinate Transformation Matrix" -1 0 1 0 -1 1 0 0 1
|
||||||
|
}
|
||||||
|
|
14
bin/screen-rotate-left
Executable file
14
bin/screen-rotate-left
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||||
|
source "$script_dir/cutiepi-screen-common"
|
||||||
|
|
||||||
|
cur_rotation=$(screen_rotation)
|
||||||
|
|
||||||
|
case "$cur_rotation" in
|
||||||
|
left) screen_set_vertical_inverted;;
|
||||||
|
right) screen_set_vertical;;
|
||||||
|
normal) screen_set_horizontal;;
|
||||||
|
inverted) screen_set_horizontal_inverted;;
|
||||||
|
esac
|
||||||
|
|
14
bin/screen-rotate-right
Executable file
14
bin/screen-rotate-right
Executable file
|
@ -0,0 +1,14 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||||
|
source "$script_dir/cutiepi-screen-common"
|
||||||
|
|
||||||
|
cur_rotation=$(screen_rotation)
|
||||||
|
|
||||||
|
case "$cur_rotation" in
|
||||||
|
left) screen_set_vertical;;
|
||||||
|
right) screen_set_vertical_inverted;;
|
||||||
|
normal) screen_set_horizontal_inverted;;
|
||||||
|
inverted) screen_set_horizontal;;
|
||||||
|
esac
|
||||||
|
|
19
systemd/autorotate.service
Normal file
19
systemd/autorotate.service
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Copy or symlink this systemd service to ~/.config/systemd/user
|
||||||
|
# (create the folder if it doesn't exist).
|
||||||
|
# Start with: systemctl --user start autorotate
|
||||||
|
# Stop with: systemctl --user stop autorotate
|
||||||
|
# Enable at startup with: systemctl --user enable autorotate
|
||||||
|
# Disable at startup with: systemctl --user disable autorotate
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Manage screen auto-rotation on a CutiePi tablet
|
||||||
|
After=graphical.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/home/pi/bin/autorotate
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
|
|
Loading…
Reference in a new issue