Berechnen des sichtbaren Bereichs eines teilweise verborgenen Fensters

Berechnen des sichtbaren Bereichs eines teilweise verborgenen Fensters

Ich muss (über ein Skript) Screenshots von Fenstern machen, von denen einige teilweise oder vollständig von anderen Fenstern verdeckt sein können. In einem solchen Fall ist der Screenshot natürlich nutzlos und ich drucke lieber eine Warnung aus.

Leider bin ich nicht in der Lage,ein Fenstermanager, der auch versteckte oder minimierte Fenster druckt– Ich hänge an einem alten KDE fest.

Ich kann zB verwenden, xwininfo -id <windowid> | grep "Map State"um zu ermitteln, ob das Fenster sichtbar ist IsViewable(was im Grunde bedeutet, dass Standard-Screenshot-Tools sich nicht beschweren), aber ich kann anscheinend nicht herausfinden, wie ich ermitteln kann, ob und wie stark das Fenster von anderen Fenstern überlappt wird (dann könnte ich die Warnung ausdrucken, wenn beispielsweise weniger als 50 % des Fensters sichtbar sind).

(Da ich eigentlich versuche, das Problem zu umgehen, weil ich nicht glaube, dass es existiert, werde ich mich natürlich nicht beschweren, wenn mir jemand eine einfache Methode zeigt, um beispielsweise Fenster „virtuell neu zu zeichnen“, damit sich der Screenshot lohnt …)

Antwort1

Soweit ich weiß (aber ich bin kein X-Experte), wird die Sichtbarkeit nur über VisibilityNotifyEreignisse verfolgt, es ist kein Status, den Sie wie abfragen können IsViewable. Sie müssten KDE dazu bringen, es auszuspucken, ich weiß nicht, ob es das kann.

Sie können Ihr Problem möglicherweise lösen, indem Sie dem Fenster ein VisibilityNotify(state=VisibilityUnobscured)Ereignis senden. Ich weiß nicht, ob das ausreicht, möglicherweise müssen Sie auch ein MapNotifyEreignis senden. Hier ist ein ungetesteter Python-Code zum Senden eines VisibilityNotifyEreignisses.

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

verwandte Informationen