Calcular el área visible de una ventana parcialmente oculta

Calcular el área visible de una ventana parcialmente oculta

Tengo que tomar (según un guión) capturas de pantalla de las ventanas, algunas de las cuales pueden estar parcial o totalmente ocultas por otras ventanas. Por supuesto, en tal caso la captura de pantalla es inútil y prefiero imprimir una advertencia.

Desafortunadamente no estoy en una situación en la que pueda usarun Administrador de ventanas que imprime incluso ventanas ocultas o minimizadas— Estoy atrapado con un KDE antiguo.

Puedo usar, por ejemplo, xwininfo -id <windowid> | grep "Map State"para determinar si la ventana IsViewable(lo que básicamente significa que las herramientas de captura de pantalla estándar no se quejarán), pero parece que no puedo entender cómo determinar si la ventana está superpuesta por otras ventanas y cuánto está (entonces podría imprimir la advertencia si, digamos, menos del 50 % de la ventana es visible).

(Como en realidad estoy tratando de solucionarlo porque no creo que exista, por supuesto no me quejaré si alguien me indica un método sencillo para, por ejemplo, "redibujar virtualmente" ventanas para que la captura de pantalla valga la pena...)

Respuesta1

Hasta donde yo sé (pero no soy un experto en X), la visibilidad solo se rastrea a través de VisibilityNotifyeventos, no es un estado que puedas consultar como IsViewable. Necesitarías hacer que KDE lo escupe, no sé si podrá hacerlo.

Puede resolver su problema enviando un VisibilityNotify(state=VisibilityUnobscured)evento a la ventana. No sé si eso es suficiente, es posible que también necesites enviar un MapNotifyevento. Aquí hay algo de código Python no probado para enviar un VisibilityNotifyevento.

#! /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]))

información relacionada