linux-surface/contrib/rotate-screen/rotate-screen
2021-04-20 17:25:23 +02:00

143 lines
3.8 KiB
Bash
Executable file

#!/bin/sh
#
# One-shot automatic screen rotation
#
# If the attached keyboard is switched off, whenever the tablet is
# rotated, it is best to put this command into the panel, because
# hotkeys do not work.
#
# On Cinnamon, the 'Command Launcher' add-on can be used with the
# following settings:
# Panel Icon: rotation-allowed-symbolic
# Tooltip: Set screen rotation
# Keyboard shortcut: unassigned | unassigned
# Show notification on completion: NO
# Command: rotate-screen
# Run as root: NO
# Run in alternate directory: NO
#
# Anchestors:
# mildmojo
# https://gist.github.com/mildmojo/48e9025070a2ba40795c
# mbinnun:
# https://gist.github.com/mildmojo/48e9025070a2ba40795c#gistcomment-2694429
#
# Check for commands needed
GDBUS=`which gdbus`
if test -z $GDBUS; then
echo "Command 'gdbus' not found."
exit 1
fi
XINPUT=`which xinput`
if test -z $XINPUT; then
echo "Command 'xinput' not found."
exit 2
fi
XRANDR=`which xrandr`
if test -z $GDBUS; then
echo "Command 'xrandr' not found."
fi
get_orientation () {
# Get the orientation from the DBus
#
# No options.
# DBus to query to get the current orientation
DBUS="--system --dest net.hadess.SensorProxy --object-path /net/hadess/SensorProxy"
# Check, if DBus is available
ORIENTATION=`$GDBUS call $DBUS \
--method org.freedesktop.DBus.Properties.Get \
net.hadess.SensorProxy HasAccelerometer`
if test "$ORIENTATION" != "(<true>,)"; then
echo "No sensor available!"
exit 10
fi
# Get the orientation from the DBus
ORIENTATION=`$GDBUS call $DBUS \
--method org.freedesktop.DBus.Properties.Get \
net.hadess.SensorProxy AccelerometerOrientation`
# Release the DBus
$GDBUS call --system $DBUS --method net.hadess.SensorProxy.ReleaseAccelerometer > /dev/null
# Normalize the orientation
case $ORIENTATION in
"(<'normal'>,)")
ORIENTATION=normal
;;
"(<'bottom-up'>,)")
ORIENTATION=inverted
;;
"(<'left-up'>,)")
ORIENTATION=left
;;
"(<'right-up'>,)")
ORIENTATION=right
;;
*)
echo "Orientation $ORIENTATION unknown!"
exit 11
esac
# Return the orientation found
echo $ORIENTATION
}
do_rotate () {
# Rotate screen and pointers
#
# $1: The new orientation
# $2: The screen to rotate
# $3-: The pointers to rotate
TRANSFORM='Coordinate Transformation Matrix'
ORIENTATION=$1
shift
# Rotate the screen
$XRANDR --output $1 --rotate $ORIENTATION
shift
# Rotate all pointers
while test $# -gt 0; do
case $ORIENTATION in
normal)
$XINPUT set-prop $1 "$TRANSFORM" 1 0 0 0 1 0 0 0 1
;;
inverted)
$XINPUT set-prop $1 "$TRANSFORM" -1 0 1 0 -1 1 0 0 1
;;
left)
$XINPUT set-prop $1 "$TRANSFORM" 0 -1 1 1 0 0 0 0 1
;;
right)
$XINPUT set-prop $1 "$TRANSFORM" 0 1 0 -1 0 1 0 0 1
;;
esac
shift
done
}
# Get the tablet's orientation
ORIENTATION=`get_orientation`
# Get all pointers
POINTERS=`$XINPUT | grep slave | grep pointer | sed -e 's/^.*id=\([[:digit:]]\+\).*$/\1/'`
# Get the display and its orientation
XDISPLAY=`$XRANDR --current --verbose | grep primary | cut --delimiter=" " -f1`
# Rotate the screen and pointers
echo "Rotate display $XDISPLAY to $ORIENTATION orientation (Pointers: `echo $POINTERS | sed 's/\n/ /g'`)"
do_rotate $ORIENTATION $XDISPLAY $POINTERS