Last active
March 17, 2020 19:03
-
-
Save ei-grad/4d9d23b1463a99d24a8d to your computer and use it in GitHub Desktop.
Rotate screen on tablet PCs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
from time import sleep | |
from os import path as op | |
import sys | |
from subprocess import check_call, check_output | |
from glob import glob | |
def bdopen(fname): | |
return open(op.join(basedir, fname)) | |
def read(fname): | |
return bdopen(fname).read() | |
for basedir in glob('/sys/bus/iio/devices/iio:device*'): | |
if 'accel' in read('name'): | |
break | |
else: | |
sys.stderr.write("Can't find an accellerator device!\n") | |
sys.exit(1) | |
devices = check_output(['xinput', '--list', '--name-only']).splitlines() | |
touchscreen_names = ['touchscreen', 'wacom'] | |
touchscreens = [i for i in devices if any(j in i.lower() for j in touchscreen_names)] | |
disable_touchpads = False | |
touchpad_names = ['touchpad', 'trackpoint'] | |
touchpads = [i for i in devices if any(j in i.lower() for j in touchpad_names)] | |
scale = float(read('in_accel_scale')) | |
g = 7.0 # (m^2 / s) sensibility, gravity trigger | |
STATES = [ | |
{'rot': 'normal', 'coord': '1 0 0 0 1 0 0 0 1', 'touchpad': 'enable', | |
'check': lambda x, y: y <= -g}, | |
{'rot': 'inverted', 'coord': '-1 0 1 0 -1 1 0 0 1', 'touchpad': 'disable', | |
'check': lambda x, y: y >= g}, | |
{'rot': 'left', 'coord': '0 -1 1 1 0 0 0 0 1', 'touchpad': 'disable', | |
'check': lambda x, y: x >= g}, | |
{'rot': 'right', 'coord': '0 1 0 -1 0 1 0 0 1', 'touchpad': 'disable', | |
'check': lambda x, y: x <= -g}, | |
] | |
def rotate(state): | |
s = STATES[state] | |
check_call(['xrandr', '-o', s['rot']]) | |
for dev in touchscreens if disable_touchpads else (touchscreens + touchpads): | |
check_call([ | |
'xinput', 'set-prop', dev, | |
'Coordinate Transformation Matrix', | |
] + s['coord'].split()) | |
if disable_touchpads: | |
for dev in touchpads: | |
check_call(['xinput', s['touchpad'], dev]) | |
def read_accel(fp): | |
fp.seek(0) | |
return float(fp.read()) * scale | |
if __name__ == '__main__': | |
accel_x = bdopen('in_accel_x_raw') | |
accel_y = bdopen('in_accel_y_raw') | |
current_state = None | |
while True: | |
x = read_accel(accel_x) | |
y = read_accel(accel_y) | |
for i in range(4): | |
if i == current_state: | |
continue | |
if STATES[i]['check'](x, y): | |
current_state = i | |
rotate(i) | |
break | |
sleep(1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Also I'd replace all uses of check_call to just call otherwise devices with removable touchpads cause the script to raise an exception rather than ignore the error.