等待X11窗口映射和查看的正确方法是什么?确切地说,我想等到我可以安全地调用XSetInputFocus()而不会遇到以下错误导致X服务器回火的任何风险:
// X Error of Failed request: BadMatch (invalid parameter attributes)
// Major opcode of Failed request: 42 (X_SetInputFocus)
目前这种错误经常发生,尤其是在慢速X服务器上或者在使用libXrandr更改了监视器分辨率后立即尝试打开新窗口时.
我已经有了这个问题的解决方案,但它非常hacky因为它轮询window属性所以我想知道是否有更清洁的版本.
这是我目前的做法:
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);
}
这段代码工作得很好,但它很hacky所以我在这里讨论它 – 以防万一有一个更干净的方式来做这件事.