Como manipular programaticamente as janelas de aplicativos?

3

Alguém conhece uma biblioteca, preferencialmente para ruby ou python, que permitirá acessar uma lista de aplicativos abertos e permitir que você os manipule? Tudo o que eu realmente quero ser capaz de fazer é mudar sua geometria e minimizá-los ou fechá-los. Eu estive brincando com o ruby-gnome2 um pouco, mas não encontrei nada para manipular janelas além daquelas do seu próprio processo.

Estou usando 10.10.

    
por greg 21.01.2011 / 08:58

3 respostas

4

A maneira mais fácil de fazer isso seria usar wmctrl . Você pode ler man wmctrl para ver como usá-lo.

sudo apt-get install wmctrl

Você pode basicamente vincular a linha de comando a uma classe 'Window' e adicionar métodos a ela que usam comandos wmctrl em segundo plano.

class Window
    @@windows = []
    def self.windows
        @@windows
    end
    def self.get_windows
        @@windows.clear
        'wmctrl -l'.split("\n").map do |str|
            @@windows << self.class.new(str.split(' ')*)
        end
    end
    def initialize window_id, desktop_id, client_machine, window_title
        #set up object here
    end
    #add other methods here
end

Esse deve ser um bom ponto de partida. Não foi testado nem nada, mas você deve ser capaz de resolver isso daqui. Agora você pode adicionar métodos de instância, por exemplo. change_geometry , que pode utilizar a opção -r <WIN> -e <MVARG> .

Você deve se familiarizar com os canais e IO em geral antes de fazer isso.

Talvez quando você tiver realizado o que você precisa, você pode distribuir isso como uma biblioteca ruby e empacotá-lo para Debian / Ubuntu.

    
por dv3500ea 21.01.2011 / 11:16
3

Você pode usar a especificação Dicas do Gerenciador de janela estendido para informar ao WM para mudar algumas janelas. Esse é o truque que o wmctrl usa.

Normalmente você precisa usar o XLib para usar o EWMH, mas para o python existe um projeto interessante: PyTile . É um programa python para colocar as janelas. Não é apenas um bom exemplo, ele envolveu a funcionalidade mais importante em uma única classe. Basta baixar a fonte e dar uma olhada no Probe.py, ele faz a maior parte do que você pergunta.

Este exemplo maximiza todas as janelas:

import Probe

prob=Probe.Probe()
winlist=prob.get_window_list()
for win in winlist:
    prob.window_maximize(win)
    
por Javier Rivera 21.01.2011 / 11:49
1

Olá, dê uma olhada no wmctrl. Não é uma biblioteca real, mas um script de linha de comando que permite a manipulação de janelas por meio de opções de linha de comando. Você certamente seria capaz de chamar pelo sistema.

sudo apt-get install wmctrl

Eu o uso em muitos scripts de shell e, às vezes, scripts perl usando system ()

hth

    
por finley 21.01.2011 / 11:18