【发布时间】:2014-06-10 18:54:26
【问题描述】:
等到 X11 窗口被映射并可见的正确方法是什么?确切地说,我想等到我可以安全地调用 XSetInputFocus() 而不会遇到任何 X 服务器适得其反的风险并出现以下错误:
// X Error of failed request: BadMatch (invalid parameter attributes)
// Major opcode of failed request: 42 (X_SetInputFocus)
目前,此错误经常发生,尤其是在慢速 X 服务器上,或者在使用 libXrandr 更改显示器分辨率后立即尝试打开新窗口时。
我已经有了解决这个问题的方法,但它很hacky,因为它会轮询窗口属性,所以我想知道是否有更简洁的版本。
这是我目前的做法:
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);
}
这段代码运行良好,但它很老套,所以我在这里提出讨论——以防万一有更简洁的方法来做这件事。
【问题讨论】: