Touchscreen Input Doesn't Rotate: Lenovo Yoga 13 / Yoga 2 Pro

After receiving a Lenovo Yoga 13 for Christmas, I have been pleased with its performance with Ubuntu. It is easy to change the display orientation under the Display settings menu or by typing, e.g. xrandr -o inverted in the terminal. However, such does not rotate the input of the touchscreen (or—less importantly—the touchpad).

I have looked around for solutions to this issue, and found two promising sources.
(1) http://cc.oulu.fi/~rantalai/synaptics/. Installing the package here and running the advised commands rotated the display and touchpad input (but not that of the touchscreen).
(2) http://www.elfsternberg.com/2013/05/25/thinkpad-yoga-ubuntu-12/. This website recommended updating an input package, which I haven't tried.


I found a straightforward answer to my question by reading the helpful information at Ubuntu Wiki: X - Input Coordinate Transformation.

These commands can be used to align rotations of the input devices and the display:

  1. The first command rotates the display, where can be left, right, normal, or inverted:
    xrandr -o <orientation>

  2. remap the input device:
    xinput set-prop '<device name>' 'Coordinate Transformation Matrix' <matrix-elements-rowwise>

The second command remaps the input device (that is, the touchpad or the the touchscreen) where <matrix-elements-rowwise> is 0 -1 1 1 0 0 0 0 1, 0 1 0 -1 0 1 0 0 1, 1 0 0 0 1 0 0 0 1, or -1 0 1 0 -1 1 0 0 1; corresponding to the orientations above.

The names of the touchpad and touchscreen can be found with xinput list and either can be disabled entirely with xinput disable <device-name>. Subsequently, xinput enable <device-name> will re-enable the input device.

In my case, and probably for others with a Yoga 13 (also on Yoga 2 Pro), the touchscreen is called ELAN Touchscreen and the touchpad SynPS/2 Synaptics TouchPad.

Thus, I put a short script in my home directory called rotate-inverted.sh with the following content:

    #!/bin/bash
    # This script rotates the screen and touchscreen input 180 degrees, disables the touchpad, and enables the virtual keyboard
    xrandr -o inverted
    xinput set-prop 'ELAN Touchscreen' 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1
    xinput disable 'SynPS/2 Synaptics TouchPad'
    onboard &

Then I made the script executable with

chmod u+x rotate-inverted.sh

and assigned the command ~/rotate-inverted.sh to the keyboard shortcut Ctrl+Alt+I in
System Settings -> Keyboard.

After I logged out and logged back in, I was able to rotate the keyboard by pressing that shortcut.

I did the same type of thing for the other rotation positions, using the commands xinput enable 'SynPS/2 TouchPad' and killall onboard instead of xinput disable 'SynPS/2 TouchPad' and onboard & for rotate-normal.sh.

Some others on this thread have discussed assigning such scripts to the extra buttons on the
Yoga — such as the lock button — as well as automatically executing them upon changing the Yoga's position; but I was not sure how to do this.


I added couple more lines, second run of the script will turn screen back to normal and enable the touchpad, tested with Ideapad 2 Pro. By the way I did put launcher for the script on the side panel HowTo: new launcher.

Accelerometer is not yet supported in the kernel, but maybe something is coming on next release.

create the script /usr/local/bin/rotate-screen.sh

#!/bin/bash
# This script rotates the screen and touchscreen input 180 degrees, disables the touchpad, and enables the virtual keyboard
# And rotates screen back if the touchpad was disabled

isEnabled=$(xinput --list-props 'SynPS/2 Synaptics TouchPad' | awk '/Device Enabled/{print $NF}')

if [ $isEnabled == 1 ] 
then
    echo "Screen is turned upside down"
    xrandr -o inverted
    xinput set-prop 'ELAN Touchscreen' 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1
    xinput disable 'SynPS/2 Synaptics TouchPad'
    # Remove hashtag below if you want pop-up the virtual keyboard  
    # onboard &
else
    echo "Screen is turned back to normal"
    xrandr -o normal
    xinput set-prop 'ELAN Touchscreen' 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1
    xinput enable 'SynPS/2 Synaptics TouchPad'
    # killall onboard 
fi

and give it executable rights:

sudo chmod +x /usr/local/bin/rotate-screen.sh