注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Nihui's Blog

nihui的私人空间和日志

 
 
 

日志

 
 

桌面壁纸和窗口部件假透明  

2011-04-13 16:30:42|  分类: 工作側記 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
动机如下:
KDE4 的 plasma 桌面面板在不开启桌面特效的时候无法拥有透明背景;kwin 的窗口装饰无法在不开启桌面特效的时候变得透明;konsole 的背景在不开启桌面特效的时候无法使用透明。
然而,KDE3 都可以做到,KDE3 的 yakuake 可以做到,KDE3 的右键菜单都可以。
因为显卡老,机器旧,开桌面特效不现实,所以得想办法把 KDE3 的那套机制搬到 KDE4 上。
plasma 团队从根本上就不愿意弄这一套,他们总是认为开启桌面特效才是正道,给出很多理由,所以 plasma 桌面据我估计可能一辈子也不可能实现这个机制。
别人不理你,你就只好自己动手解决。

桌面壁纸和窗口部件假透明 - nihui - Nihuis Blog
 

需要变成透明的部件是 target,处于客户端进程中
透明部件下面透过看到的 pixmap,处于服务端进程中
服务端里存放着所有的 pixmap,每个 pixmap 都有引用计数维护,某个 pixmap 可能被很多 target 所需要。
target 需要某个 pixmap 作为其背景图片,这样子就看起来像是透明了一样。
具体实现为一个辅助的 KRootPixmap,用来负责实时绘制 target 的背景,只要说明透过 target 能看到的这个 pixmap 在哪个服务端进程里面就可以了。KRootPixmap 会在适当的时候,比如移动事件、调整大小事件,自动通过 krootpixmaploader 请求更新背景图片所需的 pixmap。krootpixmaploader 将从 X 的服务端那边寻找所需的 pixmap 资源,如果能找到的话就尝试获得这个服务端的 pixmap 资源并按照 target 的尺寸裁剪一部分返回给 KRootPixmap,KRootPixmap 收到后设置 target 的背景;如果没有找到,那就说明这个 pixmap 不存在,不绘制 target 的背景。
服务端进程如果要让自己的 pixmap 给别的上层透明部件使用的话,必须将这个 pixmap 放到 pixmapserver 中,并标上个名字以便查询。引用计数为了保证 pixmap 能在所有的客户端部件的显示过程中都可以访问到,并且一旦服务端进程结束,pixmapserver 会收到该 pixmap 删除的消息,然后收回所有被共享的资源。

桌面壁纸和窗口部件假透明 - nihui - Nihuis Blog
 
上面截图中的示例客户端,很容易的 api 吧 桌面壁纸和窗口部件假透明 - nihui - Nihuis Blog

#include <QApplication>
#include <QWidget>
#include "krootpixmap.h"

int main( int argc, char** argv )
{
    QApplication app( argc, argv );

    QWidget w;
    new KRootPixmap( &w, &w );
    w.resize( 300, 300 );
    w.show();

    return app.exec();
}


  评论这张
 
阅读(881)| 评论(6)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017