Encontrando uma determinada janela X com o Xlib do Python

7

Eu estou tentando encontrar uma janela não mapeada no meu servidor X para mapeá-la e enviá-la para < EWMH dica. Como a janela não é mapeada, não consigo usar o EWMH para perguntar diretamente ao gerenciador de janelas. Então, estou tentando fazer isso através do Xlib, mas estou tendo problemas com isso. A API inteira é muito confusa para mim.

Estou usando o wrapper Xlib do Python. Agora vamos dar uma olhada no seguinte script Python:

import subprocess
from time import sleep
from ewmh import EWMH

subprocess.Popen(['urxvt']) # Run some program, here it is URXVT terminal.
sleep(1) # Wait until the term is ready, 1 second is really enought time.

ewmh = EWMH() # Python has a lib for EWMH, I use it for simplicity here.

# Get all windows?
windows = ewmh.display.screen().root.query_tree().children

# Print WM_CLASS properties of all windows.
for w in windows: print(w.get_wm_class())

O que é a saída do script? Um terminal URXVT aberto e algo assim:

None
None
None
None
('xscreensaver', 'XScreenSaver')
('firefox', 'Firefox')
('Toplevel', 'Firefox')
None
('Popup', 'Firefox')
None
('Popup', 'Firefox')
('VIM', 'Vim_xterm')

Mas quando executo este comando e clico no terminal aberto:

$ xprop | grep WM_CLASS
WM_CLASS(STRING) = "urxvt", "URxvt"

O mesmo acontece com a propriedade WM_NAME .

Então, finalmente, uma pergunta: Por que não há uma string "URxvt" na saída do script?

    
por Martin Jiřička 18.01.2015 / 20:53

1 resposta

1

A razão pela qual não existe uma string "urxvt", "URxvt" é que o XWindows está em hierarquias. E por algum motivo, na minha área de trabalho, as janelas do urxvt não estão no primeiro nível.

Portanto, é preciso atravessar toda a árvore assim:

from Xlib.display import Display

def printWindowHierrarchy(window, indent):
    children = window.query_tree().children
    for w in children:
        print(indent, window.get_wm_class())
        printWindowHierrarchy(w, indent+'-')

display = Display()
root = display.screen().root
printWindowHierrarchy(root, '-')

Uma linha da saída do script (provavelmente bastante longa) é:

--- ('urxvt', 'URxvt')
    
por 07.02.2015 / 20:09

Tags