Eu tenho que (com script) fazer capturas de tela das janelas, algumas das quais podem estar parcial ou totalmente ocultas por outras janelas. É claro que, nesse caso, a captura de tela é inútil e prefiro imprimir um aviso.
Infelizmente não estou em uma situação em que possa usarum gerenciador de janelas que imprime até janelas ocultas ou minimizadas— Estou preso a um KDE antigo.
Posso usar, por exemplo, xwininfo -id <windowid> | grep "Map State"
para determinar se a janela IsViewable
(o que basicamente significa que as ferramentas de captura de tela padrão não reclamam), mas não consigo descobrir como determinar se a janela está sobreposta por outras janelas e quanto é (então eu poderia imprimir o aviso se, digamos, menos de 50% da janela estiver visível).
(Como na verdade estou tentando contornar isso porque não acredito que exista, é claro que não vou reclamar se alguém me indicar um método fácil para, por exemplo, "redesenhar virtualmente" janelas para que a captura de tela valha a pena…)
Responder1
Pelo que eu sei (mas não sou especialista em X), a visibilidade só é rastreada por meio de VisibilityNotify
eventos, não é um estado que você possa consultar como IsViewable
. Você precisaria que o KDE cuspisse, não sei se ele pode fazer isso.
Você pode resolver seu problema enviando um VisibilityNotify(state=VisibilityUnobscured)
evento para a janela. Não sei se isso é suficiente, talvez você também precise enviar um MapNotify
evento. Aqui está um código Python não testado para enviar um VisibilityNotify
evento.
#! /usr/bin/env python
import re, sys, time
import Xlib.X, Xlib.XK, Xlib.display, Xlib.protocol
def parse_action(string):
state = {
'0': 0,
'1': 1,
'2': 2,
'unobscured': 0,
'partiallyobscured': 1,
'fullyobscured': 2,
'visibilityunobscured': 0,
'visibilitypartiallyobscured': 1,
'visibilityfullyobscured': 2,
}[string.lower()]
return state
def parse_window(display, arg):
wid = int(arg, 0)
return display.create_resource_object('window', wid)
def send_event(display, window, state):
window.send_event(Xlib.protocol.event.VisibilityNotify(window=window,
state=state))
display.sync()
if __name__ == "__main__":
display = Xlib.display.Display()
send_event(display, parse_window(display, sys.argv[1]), parse_action(sys.argv[2]))