부분적으로 숨겨진 창의 보이는 영역 계산

부분적으로 숨겨진 창의 보이는 영역 계산

나는 창의 스크린샷을 (스크립트로) 찍어야 하는데, 그 중 일부는 다른 창에 의해 부분적으로 또는 완전히 숨겨질 수 있습니다. 물론, 그러한 경우에는 스크린샷이 쓸모가 없으므로 경고를 인쇄하는 것이 좋습니다.

아쉽게도 제가 사용할 수 있는 상황은 아닙니다숨겨진 창이나 최소화된 창까지 인쇄하는 창 관리자— 저는 오래된 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]))

관련 정보