Rotación y Auto-Rotación de pantalla (iphone-like) con Linux

La rotación de pantalla es una posibilidad nativa del sistema X, basado claro está en xrandr (un comando de X que permite rotar la pantalla, cambiar resolución, etc), ahora bien, la idea de asociar esto a una tecla o mejor aún, aprovechar las capacidades de nuestro hardware para hacerlo de manera automática es mucho más práctico.

El módulo thinkpad_acpi

En mi caso, al tener una portátil Thinkpad, uso el módulo thinkpad_acpi para controlar los “botones especiales” de la portátil, para “asegurar” la carga de este módulo hemos agregado su nombre a:

/etc/modules

Y listo!, podemos usar el botón thinkVantage, subir y bajar volumen, cambiar de escritorio, etc.

Ahora bien, la Thinkpad tablet PC viene con un botón que se usa “precisamente” en Windows para rotar la pantalla, su combinación de pantalla es “0xc7” y puede ser asociado fácilmente a cualquier cosa, en la sección SISTEMA > “Preferencias” > “Combinaciones de Teclas” de Gnome, para ello cargamos el selector de combinación de teclas, y presionamos el botón “Añadir”:

Creamos un acceso llamado “Rotar Pantalla” y lo asociamos a un script en python llamado /usr/bin/rotate-screen.py que ya veremos como funciona.

La cosa queda así:

Ahora, a trabajar en el script!.

El Script de rotar la pantalla

El guión de rotar pantalla es un simple script de python, que usa xrandr para rotar la pantalla y usa xsetwacom para rotar el cursor/stylus/puck de la tablet PC, adicionalmente utiliza el módulo HDAPS (Hard Disk Active Protection System) para determinar con el acelerómetro la posición actual (si es izquierda, derecha, normal o invertida), para los que no tengan acelerómetro en el disco duro, simplemente podrían determinar el actual modo de rotación y cambiar al siguiente (para hacer una rueda infinita de rotación normal > izquierda > inverted > derecha).

Es como ejecutar “a mano” los siguientes comandos:

normal=’xrandr –output LVDS –rotate normal’
left=’xrandr –output LVDS –rotate left’
right=’xrandr –output LVDS –rotate right’
inverted=’xrandr –output LVDS –rotate inverted’

También usa el módulo Thinkpad-ACPI para determinar el modo en el que estamos (PC o Tablet PC), ya que solo rotará si estamos en modo Tablet.

cat /sys/devices/platform/thinkpad_acpi/hotkey_tablet_mode

Donde: 0 = laptop y 1 = tablet

Yo ya había hecho este script en bash, sin embargo, me pareció una buena práctica de scripting en python hacerlo por esta vía.

Por ejemplo, rotar la pantalla a la derecha sería en bash:

#!/bin/bash/usr/bin/xrandr -o right
xsetwacom set "Serial Wacom Tablet" Rotate cw
xsetwacom set "Serial Wacom Tablet eraser" Rotate cw

Nota: las rotaciones de la Tablet son: none, cw, ccw e inverted

Pueden descargar el guión de acá: http://depositfiles.com/files/wk2fdee34

Simplemente copian ambos archivos a /usr/bin:

cp * /usr/bin && chmod +x /usr/bin/rotate-screen.py

Y listo!, ya pueden rotar sus pantallas.

Auto-rotación

Para que la auto-rotación funcione, requieren que el módulo tp_smapi esté instalado, en Debian la forma más fácil es instalar el paquete DKMS (auto-construye el módulo):

aptitude install tp-smapi-dkms

Esto ejecutará lo siguiente:

Configurando tp-smapi-dkms (0.40-8) ...
Creating symlink /var/lib/dkms/tp-smapi/0.40/source ->                 /usr/src/tp-smapi-0.40
DKMS: add Completed.
Kernel preparation unnecessary for this kernel.  Skipping...
Building module:cleaning build area....make KERNELRELEASE=2.6.32-5-amd64 -C /lib/modules/2.6.32-5-amd64/build M=/var/lib/dkms/tp-smapi/0.40/build.....cleaning build area....
DKMS: build Completed.
thinkpad_ec.ko:Running module version sanity check. - Original module   - No original module exists within this kernel - Installation   - Installing to /lib/modules/2.6.32-5-amd64/updates/dkms/
tp_smapi.ko:Running module version sanity check. - Original module   - No original module exists within this kernel - Installation   - Installing to /lib/modules/2.6.32-5-amd64/updates/dkms/
hdaps.ko:Running module version sanity check. - Original module - Installation   - Installing to /lib/modules/2.6.32-5-amd64/updates/dkms/
depmod......
DKMS: install Completed.

Nota: Requieren tener instalados los linux-headers de su kernel actual

Si acaso desean instalarlo desde fuentes, entonces usan tp.smapi-sources:

aptitude install tp-smapi-source

Y usar module-assistant para instalarlo:

cd /usr/src/tp-smapi/

Actualizamos:

m-a update

Y auto-instalámos el módulo:

m-a a-i tp-smapi

luego ejecutamos el montaje de los módulos:

modprobe hdaps
modprobe thinkpad_ec
modprobe tp_smapi

Si acaso bajamos los fuentes de la página oficial (y no usamos los de Debian):

Descomprimen y compilan:

#tp_smapi

make
make install HDAPS=1
make load HDAPS=1 FORCE_IO=1

En cualquiera de los 3 casos, ejecutar modinfo tp-smapi devolverá información del módulo cargado:

modinfo tp-smapi
filename:       /lib/modules/2.6.32-5-amd64/updates/dkms/tp_smapi.ko
license:        GPL
version:        0.40
description:    ThinkPad SMAPI Support
author:         Shem Multinymous
srcversion:     F73BBCBD87C5944FFE67105
depends:        thinkpad_ec
vermagic:       2.6.32-5-amd64 SMP mod_unload modversions
parm:           debug:Debug level (0=off, 1=on) (int)

Cuando cargan, veremos esto en el dmesg:

[16848.875565] tp_smapi 0.40 loading...
[16848.876270] tp_smapi successfully loaded (smapi_port=0xb2).
[16855.810653] hdaps: LENOVO ThinkPad X61 detected, setting orientation 6
[16855.811656] hdaps: initial mode latch is 0x05
[16855.811824] hdaps: setting ec_rate=250, filter_order=2
[16855.812048] hdaps: device successfully initialized.
[16855.812811] input: ThinkPad HDAPS joystick emulation as /devices/virtual/input/input12
[16855.814213] input: ThinkPad HDAPS accelerometer data as /devices/virtual/input/input13
[16855.814571] hdaps: driver successfully loaded.

Ya con esto, la auto-rotación es posible!.

Auto-rotación, registrando un servicio

La auto-rotación es un script que queda “cargado en memoria” usando la capacidad de un script python de quedar registrado como un DBusGMainLoop, todo es gracias a esta función main:

def main():
  dbus_loop = DBusGMainLoop(set_as_default = True)
  session = dbus.SessionBus(mainloop = dbus_loop)
  loop = gobject.MainLoop()
  gobject.threads_init()
  gobject.timeout_add(1000,setRotation)
  loop.run()

main()

Que permite ejecutar la función “setRotation” cada 1000 milisegundos, dicha función se encuentra en el script “autorotate-screen.py” y determina la posición de la pantalla por las coordenadas de posición que devuelve el acelerómetro:

* Cuando hdaps está en modo “PC” en mi mesa:

cat /sys/devices/platform/hdaps/position

resultado : (0,-3)

* Cuando hdaps está en modo “tablet” con la posición invertida

cat /sys/devices/platform/hdaps/position

resultado : (-510,637)

Y como registro ese script?

Para que este script se inicie siempre que arranque la computadora (pero SOLO cuando YA haya arrancado las X) el script no debe ir en /etc/rc.local sino en:

/etc/gdm3/Init/Default

Al final de ese archivo agregaremos la línea:

/usr/bin/autorotate-screen.py

Y listo!, la próxima vez que el GDM inicie, podrán rotar la pantalla automáticamente (cuando esté en modo Tablet PC) con solamente girar la pantalla.

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 24 agosto 2010 en Blogeando!, Cultura Libre, La nota del día, Linux, PlanetaLinux, Programacion, Python, Software Libre. Añade a favoritos el enlace permanente. 2 comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: