Calculando a área visível de uma janela parcialmente oculta

5

Eu tenho que (scriptly) tirar screenshots de janelas, algumas das quais podem ser parcialmente ou totalmente escondidas por outras janelas. É claro que, nesse caso, a captura de tela é inútil e eu prefiro imprimir um aviso.

Infelizmente, não estou em condições de usar um gerenciador de janelas que imprima até janelas ocultas ou minimizadas - Estou preso a um antigo KDE.

Eu posso usar, e. xwininfo -id <windowid> | grep "Map State" para determinar se a janela IsViewable (que basicamente significa que as ferramentas de captura de tela padrão não vão reclamar), 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 estou realmente tentando contornar isso porque não acredito que exista, é claro que não vou reclamar se alguém me apontar um método fácil para, por exemplo, "redesenhar virtualmente" janelas, para que a captura de tela valha a pena isso ...)

    
por Skippy le Grand Gourou 01.10.2013 / 17:57

1 resposta

2

Até onde eu sei (mas não sou especialista em X), a visibilidade é rastreada apenas através de VisibilityNotify events, não é um estado que você possa consultar como IsViewable . Você precisaria fazer o KDE cuspir, não sei se pode fazer isso.

Você pode resolver seu problema enviando à janela um evento VisibilityNotify(state=VisibilityUnobscured) . Eu não sei se isso é suficiente, você também pode precisar enviar um evento MapNotify . Aqui está um código Python não testado para enviar um evento VisibilityNotify .

#! /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]))
    
por 02.10.2013 / 01:55