计算部分隐藏窗口的可见区域

计算部分隐藏窗口的可见区域

我必须(以脚本方式)截取窗口的屏幕截图,其中一些窗口可能部分或完全被其他窗口隐藏。当然,在这种情况下,截图是没有用的,我宁愿打印一个警告。

不幸的是我不处于可以使用的情况窗口管理器甚至可以打印隐藏或最小化的窗口— 我被旧的 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]))

相关内容