ThinkPad X200 T com todas as funções em GNU/Linux…

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.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.