我必須(以腳本方式)截取視窗的螢幕截圖,其中一些視窗可能部分或完全被其他視窗隱藏。當然,在這種情況下,截圖是沒有用的,我寧願列印一個警告。
不幸的是我不處於可以使用的情況視窗管理器甚至可以列印隱藏或最小化的窗口— 我被舊的 KDE 困住了。
我可以使用 例如xwininfo -id <windowid> | grep "Map State"
來確定視窗是否IsViewable
(這基本上意味著標準螢幕截圖工具不會抱怨),但我似乎無法弄清楚如何確定該視窗是否與其他視窗重疊以及重疊了多少(然後我例如,如果視窗的可見部分少於50%,則可列印警告)。
(因為我實際上正在嘗試解決它,因為我不相信它存在,當然,如果有人向我指出一種簡單的方法,例如“虛擬重繪”窗口,以便屏幕截圖是值得的,我當然不會抱怨……)
答案1
據我所知(但我不是 X 專家),可見性只能透過VisibilityNotify
事件進行跟踪,它不是一種可以像IsViewable
.你需要讓 KDE 來吐出它,我不知道它是否可以做到這一點。
您可以透過向視窗發送VisibilityNotify(state=VisibilityUnobscured)
事件來解決您的問題。我不知道這是否足夠,您可能還需要發送MapNotify
事件。以下是一些未經測試的用於發送VisibilityNotify
事件的 Python 程式碼。
#! /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]))