部分的に隠されたウィンドウの表示領域の計算

部分的に隠されたウィンドウの表示領域の計算

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

残念ながら、私は隠されたウィンドウや最小化されたウィンドウも印刷するウィンドウマネージャ— 古い KDE を使い続けています。

xwininfo -id <windowid> | grep "Map State"たとえば、ウィンドウかどうかを判断するために使用できますIsViewable(基本的に、標準のスクリーンショット ツールはエラーを発生しません) が、ウィンドウが他のウィンドウと重なっているかどうか、また重なっている場合はどの程度かを判断する方法がわかりません (たとえば、ウィンドウの 50% 未満しか表示されない場合に警告を印刷できます)。

(私は実際にそれが存在するとは信じていないので回避策を試みていますが、スクリーンショットを撮る価値があるように、たとえばウィンドウを「仮想的に再描画」する簡単な方法を誰かが教えてくれたとしても、もちろん文句は言いません…)

答え1

私の知る限りでは (ただし、私は X の専門家ではありません)、可視性はVisibilityNotifyイベントを通じてのみ追跡され、のようにクエリできる状態ではありませんIsViewable。KDE にそれを吐き出させる必要がありますが、それができるかどうかはわかりません。

ウィンドウに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]))

関連情報