部分的に隠されたウィンドウの可視領域を計算します。

部分的に隠されたウィンドウの可視領域を計算します。

(スクリプト方式で)ウィンドウのスクリーンショットを撮る必要がありますが、その一部は他のウィンドウによって部分的または完全に隠されることがあります。もちろん、この場合、スクリーンショットは役に立たず、むしろ警告を印刷したいと思います。

残念ながら私が使用できる状況ではありませんウィンドウマネージャは、隠しウィンドウまたは最小化されたウィンドウも印刷できます。- 私は古いKDEを使用しています。

xwininfo -id <windowid> | grep "Map State"たとえば、IsViewable見える

(私はそれが存在すると信じていないので、実際にそれを修正しようとしているので、誰かがスクリーンショットが価値があるようにウィンドウを「仮想で再描画する」などの簡単な方法を教えてくれたら、私は確かに文句を言わないでしょう。 )

ベストアンサー1

私が知っている限り(しかし私はXの専門家ではありません)、可視性はイベントを通してのみVisibilityNotify追跡IsViewableすることができます。そう。

windowにイベントを送信すると、VisibilityNotify(state=VisibilityUnobscured)問題を解決できます。これで十分かどうかわかりません。イベントも送信する必要がありますMapNotify。以下は、イベントを送信するテストされていないPythonコードです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]))

おすすめ記事