linux中使用XCreateWindow或者XCreateSimpleWindow时指定parent为一个已存在的窗口时,新建的窗口嵌入到已存在的窗口,例如给wps嵌入一个长宽一致的子窗口,设置窗口属性,使其不响应键盘数据事件并透窗给底层窗口,然后设置窗口属性使其透明显示底层窗口,后续在子窗口上绘制水印,该思路看似可以给wps嵌入水印,在实际调试中,无论怎么设置参数,子窗口透明显示底层时出现黑底,如果窗口不指定父窗口时透明又是正常的,查找原因发现,像qt这样的gui库,qwidget这样的控件在qt的底层共享一个x11的句柄,其透明效果是qt自身渲染出来的,像这种原生的窗口透明效果是linux的窗口合成器来实现的,例如xcompmgr,uos中kwin_x11窗口管理器中包含了composite,查看xcompmgr源码,发现合成器只处理toplevel窗口的透明效果,上面那种嵌入到其它窗口后,窗口成为toplevel的子窗口后合成器不处理它的透明效果
例如xcompmgr的main函数中初始化时add_win添加的窗口均为root的子窗口
XCompositeRedirectSubwindows (dpy, root, CompositeRedirectManual);
XSelectInput (dpy, root,
SubstructureNotifyMask|
ExposureMask|
StructureNotifyMask|
PropertyChangeMask);
XShapeSelectInput (dpy, root, ShapeNotifyMask);
XQueryTree (dpy, root, &root_return, &parent_return, &children, &nchildren);
for (unsigned int i = 0; i < nchildren; i++)
add_win (dpy, children[i], i ? children[i-1] : None);
XFree (children);
因此直接嵌入水印窗口到wps来实现水印是行不通的