부분적으로 숨겨진 창의 보이는 영역을 계산합니다.

부분적으로 숨겨진 창의 보이는 영역을 계산합니다.

(스크립트 방식으로) 창의 스크린샷을 찍어야 하는데, 그 중 일부는 다른 창에 의해 부분적으로 또는 완전히 숨겨질 수 있습니다. 물론, 이 경우 스크린샷은 쓸모가 없으며 차라리 경고를 인쇄하고 싶습니다.

아쉽게도 제가 사용할 수 있는 상황은 아닙니다창 관리자는 숨겨진 창이나 최소화된 창도 인쇄할 수 있습니다.— 저는 오래된 KDE를 사용하고 있습니다.

xwininfo -id <windowid> | grep "Map State"예를 들어IsViewable 보이는

(나는 그것이 존재한다고 믿지 않기 때문에 실제로 그것을 고치려고 노력하고 있기 때문에 누군가 나에게 스크린샷이 가치가 있도록 창을 "가상으로 다시 그리는"과 같은 쉬운 방법을 알려준다면 나는 확실히 불평하지 않을 것입니다...)

답변1

내가 아는 한(그러나 나는 X 전문가는 아니다) 가시성은 VisibilityNotify이벤트를 통해서만 추적 할 수 있으며 IsViewableKDE가 뱉어내도록 해야 하는데 가능한지 모르겠습니다. 그렇게.

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]))

관련 정보