Skip to content

Instantly share code, notes, and snippets.

@ei-grad
Last active March 17, 2020 19:03
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save ei-grad/4d9d23b1463a99d24a8d to your computer and use it in GitHub Desktop.
Save ei-grad/4d9d23b1463a99d24a8d to your computer and use it in GitHub Desktop.
Rotate screen on tablet PCs
#!/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)
@I0x0I
Copy link

I0x0I commented Apr 29, 2015

It would be better if the first line is like
#!/usr/bin/env python2.7
python3 doesn't work :-)

@grimthorpe
Copy link

Change
devices = check_output(['xinput', '--list', '--name-only']).splitlines()
to
devices = check_output(['xinput', '--list', '--name-only']).decode().splitlines()
to make it work in Python3.

@grimthorpe
Copy link

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.

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