linux 子窗口对父窗口透明时显示黑底

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来实现水印是行不通的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值