Para quem usa Ubuntu já deve saber que a maioria das suas ferramentas administrativas são escritas em python.
Nessa distribuição quem desejar configurar mais de um monitor deve usar a ferramenta displayconfig-gtk, a qual foi adicionada na última versão da distribuição. Infelizmente quem usar esta ferramenta talvez não obtenha êxito na sua tarefa e não consiga configurar os dois monitores para funcionar da forma desejada. Uma pesquisa no google sobre dual head no linux aponta para uma página com uma solução relativamente simples. O conteúdo é para placa de video intel, mas deve funcionar para a maioria das placas de vídeo, uma vez que o material é bem genérico. O documento, o qual é mantido pela própria intel, pode ser encontrado aqui.
No entanto, a solução para dual head no ubuntu exige alteração no arquivo de configuração do servidor X, ou então manipulação através do software xrandr, via linha de comando. O XRandR (X Resize and Rotate extension) é uma extensão do servidor X que permite ao cliente alterá-lo dinamicamente. A opção adotando o xrandr é muito mais simples, rápida e não deixa bagunças como arquivos de configuração mal editados. Essa solução pode ser facilmente repetida e não exige direitos de administrador. O ideal para usuários novatos seria que a ferramenta displayconfig-gtk funcionasse como o esperado. A ferramenta é escrita em python e uma leve olhada no seu código mostra que na versão instalada no Ubuntu 7.10 não faz uso da biblioteca do xrandr. Pelo contrário, o displayconfig-gtk faz uso das bibliotecas do servidor X diretamente. O uso da biblioteca xrandr com certeza melhoraria o funcionamento do displayconfig-gtk já que ela funciona sem necessitar de arquivo de configuração ou restart do servidor X.
A página do projeto DisplayConfigGTK, no entanto, mostra que eles já estão fazendo a atualização da ferramenta para uso da biblioteca xrandr. Até o momento não existia nenhum bind do python para o xrandr e o pessoal da Canonical decidiu começar tal projeto também. O projeto chamado pyxrandr tem seu código disponível no launchpad, mantido pela Canonical, no seguinte link.
será abordado em breve em outro post, para mostrar como é facil fazer a ligação Python-C sem ter que sair do alto nível da linguagem python.
Vamos então mostrar como podemos manipular o X através do python usando o pyxrandr.
from xrandr import xrandr screen = xrandr.get_current_screen() output = screen.get_output_by_name( 'default' ) modes = output.get_avaliable_modes() newmode = [ (count,mode) for mode in enumerate(modes) if mode.name == "1024x768" ] output.set_to_mode(newmode[0][0]) screen.apply_config()
Depois de importar o xrandr necessitamos pegar o screen atual para podermos manipular o X. O screen possui vários outputs, se você está utilizando um único monitor apenas um estará ativo, esse screen se chamará default. Na linha 1 e 2 do código acima estamos pegando o screen e o ouput default, respectivamente. O que pretendemos fazer nesse código é modificar a resolução do output default.
Cada output suporta vários modos de exibição. A resolução de 1024×768 pode ser exibida, por exemplo, em várias frequências diferentes. Para setar uma nova resolução deve-se usar o método set_to_mode do output em questão, no entanto, esse método recebe o índice do mode na lista de modes disponíveis. Essa parte é com certeza a parte mais complicada do código acima, mas para definir a resolução do output vários parâmetros são necessários como: atualização vertical, horizontal, frequência de atualização, resolução e etc. Acredito que a forma como o set_to_mode funciona adotada pela API do pyxrandr esteja certa. Através do método get_avaliable_modes uma lista de modes suportados pelo output são retornados, o que o programador deve fazer é pegar o índice do mode que ele quer usar. Para encontrarmos o novo objeto mode que desejamos, a linha 5 filtra os modes que possuem resolução de 1024×768 e pega o índice da primeira ocorrência para usar como parâmetro do set_to_mode. Essa linha contém uma list comprehension do python, mas ela também poderia ser feita com os famosos map e filter. As demais linhas setam de fato o novo modo de exibição e aplicam as configurações. É importante lembrar de aplicar as configurações, se não você não observará nenhuma modificação.
O pyxrandr fornece quase toda a API do xrandr, pelo que pude ver está completa, existem métodos para ativar mais de um output caso você tenha dois monitores ligados e também é possível configurar qual monitor esta acima, abaixo, à esquerda ou à direita do outro monitor. Não achei a documentação do projeto mas seu código é pequeno e conciso, a leitura do mesmo é bastante recomendada. Em breve, com certeza teremos o DisplayConfigGTK funcionando extremamente bem, sem precisar reiniciar o X ou fazer qualquer modificação em seus arquivos. Por enquanto, nós podemos brincar com o X e quem sabe até fazer softwares concorrentes ao DisplayConfigGTK. Se alguém topar ajudar no design e na parte gráfica da ferramenta começaremos outra.
Powered by ScribeFire.
[...] posts que já estão por lá: Python + wordpress + feedparser = planet; Manipulando o X com python e xrandr; Lua/Python C [...]