-
-
Save mildmojo/48e9025070a2ba40795c to your computer and use it in GitHub Desktop.
#!/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 | |
No more hacking guys.
Let's do it properly. I asked KDE to add a new feature. We just need to wait about 2 years.
https://bugs.kde.org/show_bug.cgi?id=437326
This is the bug for Linux Mint (from 2017): linuxmint/cinnamon-settings-daemon#188
@marian556: Wouldn't it be better to use the d-bus net.hadess.SensorProxy
instead of running another command (which btw returns a lot of data related to the brightness)?
@javiercviegas: Have a look at the updated script https://gist.github.com/mildmojo/48e9025070a2ba40795c#gistcomment-3709782. It can now be used without an accelerometer. Start by calling it with rotate-script --help
to familiarize yourself with the possibilities.
@javiercviegas: Have a look at the updated script https://gist.github.com/mildmojo/48e9025070a2ba40795c#gistcomment-3709782. It can now be used without an accelerometer. Start by calling it with
rotate-script --help
to familiarize yourself with the possibilities.
Confirmed it does have an accelerometer.
… so everything should work!
But if
dbus call --system --dest net.hadess.SensorProxy --object-path /net/hadess/SensorProxy --method org.freedesktop.DBus.Properties.Get net.hadess.SensorProxy HasAccelerometer
does not return (<true>,)
, there are only five reasons I can think of:
- There is no accelerometer available.
- The
iio-sensor-proxy
is not installed. - The
iio-sensor-proxy
is installed but its service not activated. - The accelerometer is not supported by
iio-sensor-proxy
. - The D-Bus is not working.
You can also test, if everything was installed correctly, by running monitor-sensor
(and move your device). If that does not show === Has accelerometer
, you have to sort it first or use the script in "manual" mode (rotate-screen next|previous
or rotate-screen normal|left|inverted|right
). If the screen rotates automatically, you could also use rotate-screen screen
.
… so everything should work!
But if
dbus call --system --dest net.hadess.SensorProxy --object-path /net/hadess/SensorProxy --method org.freedesktop.DBus.Properties.Get net.hadess.SensorProxy HasAccelerometerdoes not return
(<true>,)
, there are only five reasons I can think of:
- There is no accelerometer available.
- The
iio-sensor-proxy
is not installed.- The
iio-sensor-proxy
is installed but its service not activated.- The accelerometer is not supported by
iio-sensor-proxy
.- The D-Bus is not working.
You can also test, if everything was installed correctly, by running
monitor-sensor
(and move your device). If that does not show=== Has accelerometer
, you have to sort it first or use the script in "manual" mode (rotate-screen next|previous
orrotate-screen normal|left|inverted|right
). If the screen rotates automatically, you could also userotate-screen screen
.
It works. But now i am thinking how can i use the accelerometer to trigger the script and at the same time use the accelerometer to determine if the mode should be left right inverted or normal
while true; do
rotate-screen
sleep 1
done
!
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?
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).
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; doneIf that is what you want, write a tiny script with this contents
#!/bin/sh true; do rotate-screen sleep 1 donemake 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
thanks a lot, everything worked, I just substituted my devices
Check this script. Basically automatically rotates the screen based on the orientation
https://github.com/marcomarinho/auto-rotate-tablets-linux/tree/main
@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?
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.
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.
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'
I got similar problem, I write this simple utility app that reads sensors and rotate screen + digitizer.
Check, that
iio-sensor-proxy
is up and running and try to run the first of those lenghty commands again. If you get an output of(true,)
, your computer does have a accelerometer. You could also try to runmonitor-sensor
from the command line and investigate its output. If you don't have an accelerometer, you will not have any luck with autodetecting its orientation. Then neither my script nor @frgomes's script will work.Without an accelerometer, your best bet is this script: https://gist.github.com/mildmojo/48e9025070a2ba40795c#gistcomment-2694429. You have to start it with one of these command line options:
normal
,inverted
,left
orright
, e.g.rotate-screen left
.