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:
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.











