等待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所以我在这里讨论它 – 以防万一有一个更干净的方式来做这件事.最佳答案在根窗口中选择SubstructureNotifyMask.每次顶层窗口被映射,取消映射,移动,引发,调整大小等时,您都应该获得一个事件.这些事件可能会改变顶级窗口的可见性.每当发生此类事件时,此程序都会打印一条消息:
#include
请注意,您可能无法获得有关您自己的窗口映射的事件.这是因为WM很可能将顶级窗口重新定义为不是根目录的子节点,而是中间装饰窗口的子节点.
有两种方法可以应对这种情况:
>检查您的窗口父级,父级的父级,…等是否是事件的映射窗口.@H_301_38@>添加XSelectinput(d,yourwindow,StructureNotifyMask);混合.
注意,第一个选择具有SubstructureNotifyMask,第二个选择具有不同的MaskNotifyMask. 总结
以上是内存溢出为你收集整理的c – 如何等待窗口映射和可见全部内容,希望文章能够帮你解决c – 如何等待窗口映射和可见所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)