Skip to content

Instantly share code, notes, and snippets.

@rubo77
Last active October 9, 2023 11:30
Show Gist options
  • Star 65 You must be signed in to star a gist
  • Fork 16 You must be signed in to fork a gist
  • Save rubo77/daa262e0229f6e398766 to your computer and use it in GitHub Desktop.
Save rubo77/daa262e0229f6e398766 to your computer and use it in GitHub Desktop.
This script rotates the screen and touchscreen input, disables or enbles the touchpad, and dis- or enables the virtual keyboard on a Lenovo Yoga 13 or Yoga 2 Pro (source: http://askubuntu.com/q/405628/34298)
#!/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='ELAN Touchscreen'
TouchpadDevice='SynPS/2 Synaptics TouchPad'
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 disable "$TouchpadDevice"
# Remove hashtag below if you want pop-up the virtual keyboard
#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 disable "$TouchpadDevice"
#killall onboard
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 disable "$TouchpadDevice"
#killall onboard
else
echo "Back to normal"
xrandr -o normal
xinput set-prop "$TouchscreenDevice" 'Coordinate Transformation Matrix' $normal
xinput enable "$TouchpadDevice"
#killall onboard
fi
@Mingling94
Copy link

Thank you so much, this takes a lot of skill to set up!

@Mingling94
Copy link

It seems after executing this script, my hi-dpi scaling setting goes away. Not sure how to deal with this :/

@dcrystalj
Copy link

it doesnt disable my keyboard

@uladkasach
Copy link

xinput --list | grep -m3 'Touchscreen' | tail -n1 | grep -o 'id=[0-9]\+' | grep -o '[0-9]\+' will return the id of the touchscreen, without the user having to explicitly specify it.

@elmtreecomputers
Copy link

awesome! works very well on HP Spectre X2 Fedora 23
Just need to change the Touchpad to:
SYNAPTICS Synaptics HIDUSB TouchPad V07 Touchpad
I wonder how you can auto detect screen orientation via the gyrometer / accelerometer.

@neatville
Copy link

I have a lenovo yoga 2 11 and it says the Elan touchscreen isn't found or something. Does anyone know what I could use instead of that.

@mvaled
Copy link

mvaled commented Nov 10, 2016

xinput --list on my Yoga 900 13ISK2 does not print any Touchpads. There are 3 pointers, though:

$ xinput --list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ SYNA2B29:00 06CB:77C6                   	id=10	[slave  pointer  (2)]
⎜   ↳ ELAN21EF:00 04F3:227C                   	id=11	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Power Button                            	id=8	[slave  keyboard (3)]
    ↳ Lenovo EasyCamera                       	id=9	[slave  keyboard (3)]
    ↳ Ideapad extra buttons                   	id=12	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=13	[slave  keyboard (3)]

How can I go on?

@daN4cat
Copy link

daN4cat commented Dec 25, 2016

For Lenovo Yoga 300 (and I assume 900 too @mvaled) use Virtual core XTEST pointer in the script instead of ELAN Touchscreen.

@HusseinElMotayam
Copy link

Works perfectly fine. Thank you.

For Lenovo Yoga 3 pro:

TouchscreenDevice='Virtual core XTEST pointer'
TouchpadDevice='SYNA2B22:00 06CB:2714'

@mrquincle
Copy link

https://github.com/mrquincle/yoga-900-auto-rotate/ is directly tied to the accelerometer.

Copy link

ghost commented Jun 3, 2018

Many thanks, works very well with a thinkpad x230T.

@rubo77
Copy link
Author

rubo77 commented Mar 15, 2020

This doesn't work on a Yoga 730-15iwl. I tried

TouchscreenDevice='Virtual core XTEST pointer'
TouchpadDevice='MSFT0001:02 06CB:7F8F Touchpad'

but this seems not to work, only the Touchpad gets dis/enabled, but the screen stays normal.

Use these commands instead:

xrandr --output $(xrandr |grep eDP|cut -d" " -f1) --rotate left
xrandr --output $(xrandr |grep eDP|cut -d" " -f1) --rotate normal

I created a new script rotatescreen.sh here: https://gist.github.com/rubo77/d43cc5b3ff65d6df28b8b8c3c089f23b

@vigneshkannan522
Copy link

Hello there, Thanks for this tool.
I've been using this on my laptop for sometime now and it works good. But I just bought a new monitor and When I use the commands, it just rotates the laptop screen and not the monitor screen. Even when I'm using just the monitor, It it changes the laptop display orientation.
How do I change the monitor orientation? What do I need to change in the code to change to monitor instead of the Laptop builtin display?

@rubo77
Copy link
Author

rubo77 commented Jun 2, 2021

What do I need to change in the code to change to monitor instead of the Laptop builtin display?

look at line 8: you have to change line 9 to match the screen, you want to rotate

@Amondale
Copy link

why does xinput show no touchscreen devices? I can see it is working although 90 degrees off after xrandr -o left ... ASUS T100HA mini-transformer Manjaro Linux Release: 21.1.6

@aptologist
Copy link

Hi, Thank's alot for writing this script! It works on my Dell XPS-18 .I use 'USBest Technology SiS HID Touch Controller touch'

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