X11 창이 매핑되고 표시 될 때까지 기다리는 적절한 방법은 무엇입니까?창이 매핑되고 볼 때까지 기다리는 방법
// X Error of failed request: BadMatch (invalid parameter attributes)
// Major opcode of failed request: 42 (X_SetInputFocus)
는 현재이 오류가 특히 느린 X 서버 또는 경우에 자주 발생합니다 정확하게, 나는 안전하게 다음 오류 역효과 X 서버의 위험에 실행하지 않고 XSetInputFocus()를 호출 할 수있을 때까지 대기 할 libXrandr을 사용하여 모니터 해상도를 변경 한 직후 새 창을 열려고합니다.
나는 이미이 문제에 대한 해결책을 가지고 있지만 깨끗한 버전이 있는지 여부를 알기 위해 창 속성을 폴링하기 때문에 꽤 해킹됩니다.
여기에 내 현재의 접근 방식 :
static Bool predicate(Display *display, XEvent *ev, XPointer arg)
{
return(ev->type == MapNotify);
}
static void waitmapnotify(struct osdisplayinfo *osd)
{
XEvent ev;
XWindowAttributes xwa;
XPeekIfEvent(osd->display, &ev, predicate, NULL);
do {
XGetWindowAttributes(osd->display, osd->window, &xwa);
usleep(1);
} while(xwa.map_state != IsViewable);
}
이 코드는 잘 작동하지만 내가 여기에 토론을 위해 그것을 참을 수있어 해키 - 단지의 경우이 작업을 수행하는 청소기 방법이있다.
문제는 AFAICS가 이제는 창을 볼 수 있다는 신호로 보내지는 이벤트가 없다는 것입니다. "MapNotify"가 있으며 이미이 작업을 기다리고 있지만 (위 참조) 충분하지 않습니다. "IsViewable"이 속성에 설정 될 때까지 기다릴 필요가 있지만 AFAICS에는이 속성이 설정/변경 될 때 신호를 보내는 이벤트가 없습니다. – Andreas
Xlib에서 내 기억을 "새로 고침"할 때 다음 이벤트가 발견되었습니다. http://www.x.org/releases/X11R7.7/doc/libX11/libX11/libX11.html#VisibilityNotify_Events, AFAIA가 있어야합니다. 창 가시성 상태 변경에 의해 트리거됩니다. 그것은 당신의 시나리오에 대한 이해가 되니? – sergico
VisibilityNotify를 시도했지만 불행히도 이전에 최소화 된 창을 다시 표시 할 때만 전송됩니다. 창을 만들고 처음 표시하면 VisibilityNotify가 전송되지 않습니다. – Andreas