Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Bind to a key to rotate the screen of a convertible laptop
#!/bin/bash
# This script rotates the screen and touchscreen input 90 degrees each time it is called,
# also disables the touchpad, and enables the virtual keyboard accordingly
# by Ruben Barkow: https://gist.github.com/rubo77/daa262e0229f6e398766
#### configuration
# find your Touchscreen and Touchpad device with `xinput`
TouchscreenDevice='Wacom ISDv4 E6 Finger touch'
TouchpadDevice='SynPS/2 Synaptics TouchPad'
Stylus='Wacom ISDv4 E6 Pen stylus'
if [ "$1" = "--help" ] || [ "$1" = "-h" ] ; then
echo 'Usage: rotate-screen.sh [OPTION]'
echo
echo 'This script rotates the screen and touchscreen input 90 degrees each time it is called,'
echo 'also disables the touchpad, and enables the virtual keyboard accordingly'
echo
echo Usage:
echo ' -h --help display this help'
echo ' -j (just horizontal) rotates the screen and touchscreen input only 180 degrees'
echo ' -n always rotates the screen back to normal'
exit 0
fi
touchpadEnabled=$(xinput --list-props "$TouchpadDevice" | awk '/Device Enabled/{print $NF}')
screenMatrix=$(xinput --list-props "$TouchscreenDevice" | awk '/Coordinate Transformation Matrix/{print $5$6$7$8$9$10$11$12$NF}')
# Matrix for rotation
# ⎡ 1 0 0 ⎤
# ⎜ 0 1 0 ⎥
# ⎣ 0 0 1 ⎦
normal='1 0 0 0 1 0 0 0 1'
normal_float='1.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,1.000000'
#⎡ -1 0 1 ⎤
#⎜ 0 -1 1 ⎥
#⎣ 0 0 1 ⎦
inverted='-1 0 1 0 -1 1 0 0 1'
inverted_float='-1.000000,0.000000,1.000000,0.000000,-1.000000,1.000000,0.000000,0.000000,1.000000'
# 90° to the left
# ⎡ 0 -1 1 ⎤
# ⎜ 1 0 0 ⎥
# ⎣ 0 0 1 ⎦
left='0 -1 1 1 0 0 0 0 1'
left_float='0.000000,-1.000000,1.000000,1.000000,0.000000,0.000000,0.000000,0.000000,1.000000'
# 90° to the right
#⎡ 0 1 0 ⎤
#⎜ -1 0 1 ⎥
#⎣ 0 0 1 ⎦
right='0 1 0 -1 0 1 0 0 1'
if [ $screenMatrix == $normal_float ] && [ "$1" != "-n" ]
then
echo "Upside down"
xrandr -o inverted
xinput set-prop "$TouchscreenDevice" 'Coordinate Transformation Matrix' $inverted
xinput set-prop "$Stylus" 'Coordinate Transformation Matrix' $inverted
xinput disable "$TouchpadDevice"
# Remove hashtag below if you want pop-up the virtual keyboard
gsettings set org.onboard.keyboard input-event-source XInput
gsettings set org.onboard.keyboard touch-input none
xsetwacom --set "Wacom ISDv4 E6 Finger touch" Gesture on
killall onboard; ./onboard
onboard &
elif [ $screenMatrix == $inverted_float ] && [ "$1" != "-j" ] && [ "$1" != "-n" ]
then
echo "90° to the left"
xrandr -o left
xinput set-prop "$TouchscreenDevice" 'Coordinate Transformation Matrix' $left
xinput set-prop "$Stylus" 'Coordinate Transformation Matrix' $left
xinput disable "$TouchpadDevice"
elif [ $screenMatrix == $left_float ] && [ "$1" != "-j" ] && [ "$1" != "-n" ]
then
echo "90° to the right"
xrandr -o right
xinput set-prop "$TouchscreenDevice" 'Coordinate Transformation Matrix' $right
xinput set-prop "$Stylus" 'Coordinate Transformation Matrix' $right
xinput disable "$TouchpadDevice"
else
echo "Back to normal"
xrandr -o normal
xinput set-prop "$TouchscreenDevice" 'Coordinate Transformation Matrix' $normal
xinput set-prop "$Stylus" 'Coordinate Transformation Matrix' $normal
xinput enable "$TouchpadDevice"
fi
@rubo77

This comment has been minimized.

Copy link

rubo77 commented Sep 23, 2014

What did you change here according to the original?

What do these lines do?

gsettings set org.onboard.keyboard input-event-source XInput
gsettings set org.onboard.keyboard touch-input none
xsetwacom --set "Wacom ISDv4 E6 Finger touch" Gesture on 
@kalinchernev

This comment has been minimized.

Copy link
Owner Author

kalinchernev commented Oct 6, 2014

Changes are applied on the list of devices and the corresponding cases which include my devices.
By devices I mean the finger touch for example
TouchscreenDevice='Wacom ISDv4 E6 Finger touch'
It could be different in your case. This script in my case is x220t.

The onboard settings you're asking about are related to this thread https://bugs.launchpad.net/ubuntu/+source/onboard/+bug/1297692

Basically, there are issues on making finger touch working on when by default the stylus is the one listened two, that's why I play turn on/off finger and onboard

@sjo00

This comment has been minimized.

Copy link

sjo00 commented Oct 20, 2014

Possible you want to add:

TouchscreenPenEraserDevice='Wacom ISDv4 E6 Pen eraser'

With:

xinput set-prop "$TouchscreenPenEraserDevice" 'Coordinate Transformation Matrix' $inverted
...$left ...$right ...$normal

in the if, elif and else blocks.

@kalinchernev

This comment has been minimized.

Copy link
Owner Author

kalinchernev commented Oct 21, 2014

Feel free to fork ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.