Skip to content

Instantly share code, notes, and snippets.

@mildmojo
Created June 18, 2014 06:47
Show Gist options
  • Save mildmojo/48e9025070a2ba40795c to your computer and use it in GitHub Desktop.
Save mildmojo/48e9025070a2ba40795c to your computer and use it in GitHub Desktop.
Script to rotate the screen and touch devices on modern Linux desktops. Great for convertible laptops.
#!/bin/bash
#
# rotate_desktop.sh
#
# Rotates modern Linux desktop screen and input devices to match. Handy for
# convertible notebooks. Call this script from panel launchers, keyboard
# shortcuts, or touch gesture bindings (xSwipe, touchegg, etc.).
#
# Using transformation matrix bits taken from:
# https://wiki.ubuntu.com/X/InputCoordinateTransformation
#
# Configure these to match your hardware (names taken from `xinput` output).
TOUCHPAD='SynPS/2 Synaptics TouchPad'
TOUCHSCREEN='Atmel Atmel maXTouch Digitizer'
if [ -z "$1" ]; then
echo "Missing orientation."
echo "Usage: $0 [normal|inverted|left|right] [revert_seconds]"
echo
exit 1
fi
function do_rotate
{
xrandr --output $1 --rotate $2
TRANSFORM='Coordinate Transformation Matrix'
case "$2" in
normal)
[ ! -z "$TOUCHPAD" ] && xinput set-prop "$TOUCHPAD" "$TRANSFORM" 1 0 0 0 1 0 0 0 1
[ ! -z "$TOUCHSCREEN" ] && xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 1 0 0 0 1 0 0 0 1
;;
inverted)
[ ! -z "$TOUCHPAD" ] && xinput set-prop "$TOUCHPAD" "$TRANSFORM" -1 0 1 0 -1 1 0 0 1
[ ! -z "$TOUCHSCREEN" ] && xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" -1 0 1 0 -1 1 0 0 1
;;
left)
[ ! -z "$TOUCHPAD" ] && xinput set-prop "$TOUCHPAD" "$TRANSFORM" 0 -1 1 1 0 0 0 0 1
[ ! -z "$TOUCHSCREEN" ] && xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 0 -1 1 1 0 0 0 0 1
;;
right)
[ ! -z "$TOUCHPAD" ] && xinput set-prop "$TOUCHPAD" "$TRANSFORM" 0 1 0 -1 0 1 0 0 1
[ ! -z "$TOUCHSCREEN" ] && xinput set-prop "$TOUCHSCREEN" "$TRANSFORM" 0 1 0 -1 0 1 0 0 1
;;
esac
}
XDISPLAY=`xrandr --current | grep primary | sed -e 's/ .*//g'`
XROT=`xrandr --current --verbose | grep primary | egrep -o ' (normal|left|inverted|right) '`
do_rotate $XDISPLAY $1
if [ ! -z "$2" ]; then
sleep $2
do_rotate $XDISPLAY $XROT
exit 0
fi
@javiercviegas
Copy link

while true; do
    rotate-screen
    sleep 1
done

!

Bare with me i am just starting to study scripts. Where exactly should i add this snippet on the original code?

@sphh
Copy link

sphh commented May 25, 2021

You could start with a terminal and enter these commands. You can also use the following one-liner:

while true; do rotate-screen; sleep 1; done

If that is what you want, write a tiny script with this contents

#!/bin/sh
while true; do
    rotate-screen
    sleep 1
done

make it executable (chmod +x rotate-automatically) and call this script.

See also: https://www.shellscript.sh/ (or any other tutorial on shell scripts).

@javiercviegas
Copy link

You could start with a terminal and enter these commands. You can also use the following one-liner:

while true; do rotate-screen; sleep 1; done

If that is what you want, write a tiny script with this contents

#!/bin/sh
true; do
    rotate-screen
    sleep 1
done

make it executable (chmod +x rotate-automatically) and call this script.

See also: https://www.shellscript.sh/ (or any other tutorial on shell scripts).

Great awesome! Thanks

@dionnismo
Copy link

thanks a lot, everything worked, I just substituted my devices

@marcomarinho
Copy link

Check this script. Basically automatically rotates the screen based on the orientation
https://github.com/marcomarinho/auto-rotate-tablets-linux/tree/main

@sphh
Copy link

sphh commented Nov 30, 2021

@marcomarinho: It looks, like your script uses

monitor-sensor >> sensor.log 2>&1 &

while inotifywait -e modify sensor.log; do
    [...]
done

If I understand that correctly, monitor-sensor writes the output to a file on the (hard-)disk and acts, whenever this file changes. When I start monitor-sensor, it writes a line roughly ever 0.5s. If you do not restart your script, the sensor.log file gets longer and longer using up more and more hard-disk space. That would trouble me, if you only send the laptop to sleep and do not restart it.

I can see another problem: SSDs do not like these regular writing and could wear out quickly.

Wouldn't it be better to write a script, which monitors the DBus (as I believe monitor-sensor does) and act on changes of the orientation? Actually I shortly thought about adding this approach to my script, but did not do it in the end, because I personally do not like automatic screen orientation (it always flips the screen when you do not want it to do). What do you think?

@mildmojo
Copy link
Author

As an aside, the other day my 8-year-old Yoga 11s started auto-rotating the screen when I physically change the laptop's orientation. Maybe I updated a system package somewhere and it suddenly gained support for my hardware? Wild.

Now that it's finally supported, I'd kind of like to turn it off. 😝 I now prefer setting the rotation manually with global hotkeys set to call the script in this gist. I can see how it would be useful in tablet mode, though.

@mw-cyrano
Copy link

mw-cyrano commented Jan 28, 2022

Thank you so much! This works flawlessly on my XPS 13 2-in-1, even if external monitor connected, which remains unaffected. Touch events on the screen, external mouse and digitizer work on spot. Finally video conferences with a digital and streamable paper at hand.

@clavisound
Copy link

Thank you for the script.

On yoga 11s with my custom kernel-5.15.31 on Slackware-15 I changed only one line

TOUCHSCREEN='Atmel Atmel maXTouch Digitizer'
vs
TOUCHSCREEN='Atmel Atmel maXTouch Digitizer Touchscreen'

@undg
Copy link

undg commented Oct 24, 2023

I got similar problem, I write this simple utility app that reads sensors and rotate screen + digitizer.

https://github.com/undg/autorotate

@V-VR
Copy link

V-VR commented Nov 26, 2024

How do i use this when i rotate my screen? Please help I'm new to Linux mint

@mildmojo
Copy link
Author

@V-VR You can assign custom keyboard shortcuts in Mint's Keyboard settings. I have four of them set up, using Ctrl + Alt + Super + to manually set the screen and touchpad orientation by calling this script.

For instance, one of my custom shortcuts is called "Rotate desktop left", assigned to Ctrl + Alt + Super + Right (because the bottom of the screen will be to the right after "rotating" to the left), and it calls /home/mildmojo/bin/rotate_desktop.sh left.

@sphh
Copy link

sphh commented Nov 26, 2024

@V-VR: You can also head to the rotate script at linux-surface for a semi-automatic rotation script: If you follow the Installation there you get an icon in your panel. Whenever you rotated the Surface, you click on that icon and the screen adjusts automatically to the new rotation.

@clavisound
Copy link

@V-VR I have created some .desktop files here to manually select your rotation. I had to change one variable in my system.

TOUCHSCREEN='Atmel Atmel maXTouch Digitizer'
vs
TOUCHSCREEN='Atmel Atmel maXTouch Digitizer Touchscreen'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment