Ou quase isso!
A um tempo atrás, postei uma reportagem de como deixar o ThinkPad X200 Tablet funcionando com GNU/Linux (no meu caso Debian), com a maioria das funções funcionando. Esse post pode ser lido aqui. Mas não estava completo, porque ainda faltava fazer com que uma das funções mais legais (a transformação em tablet, girando a tela, e a rotação automática da tela conforme se gira o tablet), ainda não estava funcionando.
Passaram-se, então, 3 meses de pesquisa (tá certo, não foi uma pesquisa muito intensa, pois estava concentrado em minha nova empreitada profissional) e tentativasde aplicação de diversas sugestões de blogs, wikis, vídeos, usuários de Ubuntu, CentOS e outras tantas distribuições. Nenhuma efetiva, mas muito aprendizado foi possível.
Descobri que os módulos que esses dispositivos precisavam criavam diversos dispositivos no /sys/devices/platform, e comecei a colocar a cabeça para trabalhar. Percebi que seria necessário criar algo, que não seria trivial, mas que teria grandes chances de funcionar como eu queria. E mais, percebi que só conseguiria que funcionasse como eu queria se eu desenvolvesse algo para isso.
Como todos sabem, não sou programador, sou um mero administrador de sistemas GNU/Linux (com toda a modéstia que Deus me deu, posso dizer que sou pouco mais que bom no que faço). Portanto, de programação o que seu fazer é automatização de tarefas com Shell Scripts.
Nesta última semana espantei a preguiça e decidi fazer o script para automatizar essa tarefa. Já estava cansado de toda vez que transformava o note em tablet ou decidisse girar o tablet tivesse que apertar um botão. Ficou simples e de fácil compreensão, no entanto, consumia muito processamento, pois o encadeamento de condições que foi necessário estava sendo executado em tempo de processador. Um bug, resolvido facilmente com um sleep de meio segundo.
Vejam só que script interessante. Se quiserem desenvolver algo mais, a partir daqui, fiquem á vontade, só peço que se siga a GPL 3.
#!/bin/bash ## Created by: Luiz Guaraldo <guaraldo@universolivre.com.br> ## Created at: Tru Jan 24 22:15:35 BRST 2012 ## Last Update: Tru Feb 8 09:30:15 BRST 2012 ## Default screen mode for Swivel Down and Swivel Up [normal|right|inverted|left] and default VIDEO output XRANDUP="normal" XRANDDN="right" VIDEO="LVDS1" ## Personal configuration can be put on home folder in .tablet.conf file. if [ -f ~/.tablet.conf ]; then . ~/.tablet.conf fi ## Get XSetWacom by XrandR rotation. Important to mantain toutch syncronization case "$XRANDUP" in inverted) XSWUP="half" ;; normal) XSWUP="none" ;; left) XSWUP="ccw" ;; right) XSWUP="cw" ;; *) XRANDUP="normal" XSWUP="none" ;; esac case "$XRANDDN" in inverted) XSWDN="half" ;; normal) XSWDN="none" ;; left) XSWDN="ccw" ;; right) XSWDN="cw" ;; *) XRANDDN="right" XSWDN="cw" ;; esac ## Starting position of Swivel (remember that this script just act when Swivel is DOWN) last=0 # Tablet mode off lastpos="$XRANDDN" #When on tablet mode this will be default screen rotation position="$XRANDDN" ## Starting infinite loop while :; do ## This file is 0 when Swivel UP and 1 when Swivel DOWN (tablet mode) now=`cat /sys/devices/platform/thinkpad_acpi/hotkey_tablet_mode` if [ $last != $now ]; then ## Turn on or off tablet mode if [ $now == 1 ]; then ## Turn on tablet mode /usr/bin/xrandr --output $VIDEO --rotate $XRANDDN xsetwacom set "stylus" Rotate $XSWDN xsetwacom set "cursor" Rotate $XSWDN xsetwacom set "eraser" Rotate $XSWDN else ## Turn off tablet mode /usr/bin/xrandr --output $VIDEO --rotate $XRANDUP xsetwacom set "stylus" Rotate $XSWUP xsetwacom set "cursor" Rotate $XSWUP xsetwacom set "eraser" Rotate $XSWUP fi ## Mark present mode last=$now fi ## Autorotation of screen when on tablet mode ## This file contain HDAPS position (indicates notebook rotation) position1=`cat /sys/devices/platform/hdaps/position | cut -d, -f1 | cut -d'(' -f2` position2=`cat /sys/devices/platform/hdaps/position | cut -d, -f2 | cut -d')' -f1` # This is a coordenate (rotation on X and Y axis) if [ $now == 1 ]; then ## On tablet mode? if [ $position1 -gt 350 ] && [ $position1 -lt 400 ] && [ $position2 -gt -525 ] && [ $position2 -lt -475 ]; then position="right" elif [ $position1 -gt 475 ] && [ $position1 -lt 525 ] && [ $position2 -gt -400 ] && [ $position2 -lt -350 ]; then position="inverted" elif [ $position1 -gt 625 ] && [ $position1 -lt 675 ] && [ $position2 -gt -525 ] && [ $position2 -lt -475 ]; then position="left" elif [ $position1 -gt 475 ] && [ $position1 -lt 525 ] && [ $position2 -gt -675 ] && [ $position2 -lt -625 ]; then position="normal" fi ## Just act when possition changed if [ "$position" != "$lastpos" ]; then ## Get XSetWacom syncronization case "$position" in inverted) wpos="half" ;; normal) wpos="none" ;; left) wpos="ccw" ;; right) wpos="cw" ;; esac xrandr --output $VIDEO --rotate $position xsetwacom set "stylus" Rotate $wpos xsetwacom set "cursor" Rotate $wpos xsetwacom set "eraser" Rotate $wpos ## Mark new position lastpos=$position fi fi ## Processor got hudge ocupation. 70% lass processor ocupation after sleep. sleep 0.5 done
Claro que criar o script foi só o primeiro passo. Agora precisava clocar para rodar automaticamente. Para isso, usei o início automático do GNOME (que é o gerenciador de janelas que eu uso), mas pode ser feito em qualquer gerenciador de janelas.
Para alterar o padrão de entrada e saída do tablet mode, basta criar um arquivo .tablet.conf no diretório home do usuário com duas linhas:
XRANDUP="normal" XRANDDN="inverted"
Assim, ai iniciar uma nova sessão do gerenciador de janelas já estava tudo funcionando como eu queria… A rotação automática da tela só ocorre quando em Tablet Mode, ao entrar nesse modo a tela se vira da forma como eu queria (e não da forma padrão do script – que fiz seguindo o padrão que o software da Lenovo para RWindows tinha), enfim, cmo não existia o que eu queria, tratei de criar…
Espero que seja útil para todos. Postem comentários, por favor. Basta autenticarem com o Twitter.