任务栏美化之【让窗口的颜色蔓延进任务栏中】
Tofloor
poster avatar
quadpixels
deepin
2017-10-12 14:40
Author
本帖最后由 quadpixels 于 2017-10-12 06:53 编辑

任务栏美化之【让窗口的颜色蔓延进任务栏中】

Deepin的任务栏中带有毛玻璃特效,大家都知道吧!
但是不知大家是否发现,由于【边缘吸附】功能,移向任务栏的窗口最初会被挡住,而不会与任务栏发生互动,并且由于【屏幕边缘预留空间】的问题,最大化的窗口也不会与任务栏发生重合。因此就产生了如下现象:任务栏上的毛玻璃特效几乎就会与对在它边上的窗口产生反应,不会变亮或变暗,看起来少了一点生气。只有手动把窗口拖动到任务栏下方时,任务栏的毛玻璃才会变色。不然就一直呈现壁纸的色了。
因此,本篇文章的目的自然就是想个办法让任务栏的毛玻璃效果与周围的窗口产生互动这样当周围来一个亮的窗口,毛玻璃就会变亮,来一个五彩斑斓的窗口,任务栏就会变得五彩斑斓一些啦!

想要达到这个效果,就需要允许窗口与任务栏发生重叠。那么最直接的方法就是改变【屏幕边缘预留空间】。这个预留空间又叫【strut】,可以指定从“屏幕的哪一边”的“什么位置”开始延伸。深度的dock可以放置在屏幕的四个位置(上/下/左/右),在这四种情况下,这个strut就分别是从屏幕的这四个方向的“整条边的长度”开始延伸的。譬如说,当任务栏在屏幕下方,并且屏幕分辨率为1600x900时,dde-dock所预留的strut就是“从下方向上延伸,左、右的边界为[0,1600]象素,延伸的高度为32象素。”

这样看来,如果任务栏在屏幕下方,那只要把strut的高度减小一点就可以了,譬如说减小到27象素。这样是不是就可以使其它窗口能与任务栏发生一点点重叠,使得任务栏的毛玻璃效果能够覆盖到除了壁纸以外的其它窗口的颜色了呢。

但是根据测试结果,这种“把strut的延伸长度减小,从而使得窗口能与任务栏发生重叠”的办法只在任务栏停靠在屏幕上方和左方的时候有效;这是因为任务栏停靠在窗口下方或右方,并且延伸长度减小时,任务栏会被挤出屏幕外,从而使得任务栏不能超出strut的范围。譬如说,当任务栏停靠在下方时,如果把strut的延伸长度减小一象素,那任务栏也会向屏幕下方移动一象素,不仅任务栏显示不完全,而且任务栏也不会与窗口发生重叠,所以预想的目标就没有达成。

那怎么办呢?或是有无可以变通的地方呢?回想一下,我们的目标是将strut的覆盖范围从原先的屏幕底端32象素改成屏幕底端的27象素。也就是说,是把原先对角线为(0,868)-(1599,899)的矩形改成对角线为(0,873)-(1599,899)的矩形。并且这个矩形却得要以strut的格式表达出来。然而这里的表达方式并不止一种吧!这里的表达方式,其实可以有三种:

1) 从屏幕下方的第[0, 1599]象素开始延伸,延伸长度为27象素。
2) 从屏幕左侧的第[873,899]象素开始延伸,延伸长度为1600象素。
3) 从屏幕右侧的第[873,899]象素开始延伸,延伸长度为1600象素。

其中的方法1是dde-dock默认的。另外两种呢?不如就试试看咯!

经过尝试果然实现了“允许窗口与任务栏重叠5象素,同时避免任务栏跑到屏幕之外”的目标了耶!

具体而言、反应到程序里,就是在 frame/window/mainwindow.cpp 这个文件中的这一段

  1. m_xcbMisc->set_strut_partial(winId(), orientation, strut+delta, strutStart, strutEnd);
Copy the Code



改成(以下程序中,蔓延的范围为3象素)

  1. if (side == Position::Bottom) {
  2.         m_xcbMisc->set_strut_partial(winId(),
  3.             //XcbMisc::OrientationLeft,
  4.             XcbMisc::OrientationRight,
  5.             uint(maxScreenWidth),
  6.             uint(maxScreenHeight-strut+3),
  7.             uint(maxScreenHeight)
  8.         );
  9.     } else if (side == Position::Right) {
  10.         m_xcbMisc->set_strut_partial(winId(),
  11.             XcbMisc::OrientationBottom,
  12.             uint(maxScreenHeight),
  13.             uint(maxScreenWidth-strut+3),
  14.             uint(maxScreenWidth)
  15.         );
  16.     } else {
  17.         m_xcbMisc->set_strut_partial(winId(), orientation, strut+delta, strutStart, strutEnd);
  18.     }
Copy the Code

   
再编译安装就可以咯!

大家看以下两张图中的任务栏;是不是一张比另一张要明亮一些呢,那就是因为浏览器底端的白色蔓延到了任务栏里啦!其实看截图会看得更清楚的说。

没有蔓延的:



有蔓延的;注意颜色还会随着头像的出现而变化


这是在任务栏竖着放置时、有蔓延和没有蔓延的样子:



谢谢收看!




Reply Favorite View the author
All Replies
avatar
wangyong
deepin
2017-10-12 16:15
#1
点赞
Reply View the author
avatar
n1026
deepin
2017-10-12 16:32
#2

下次更新,官方就默认采用这种样子吧,真的挺好看
Reply View the author
avatar
jingle
deepin
2017-10-12 16:39
#3
点赞
Reply View the author
avatar
jingle
deepin
2017-10-12 16:39
#4
点赞
Reply View the author
avatar
justforlxz
deepin
2017-10-12 17:00
#5
最开始写顶栏的时候,写错大小了,无意间达成了这个效果,然而,我已经机智的修好了。
Reply View the author
Comments
quadpixels
2017-10-13 18:54
所以说这是在bug和feature之间转换的一个例子吗 XDDDDD
avatar
159******10
deepin
2017-10-12 17:18
#6
赞一个,虽然我喜欢现在的样子,但是你做的这个应该也有很多人喜欢
Reply View the author
Comments
quadpixels
2017-10-13 18:48
嗯嗯,这个其实是个人偏好的选择
avatar
打击越
deepin
2017-10-12 17:51
#7
这个牛B,希望系统加上这个效果!
Reply View the author
avatar
rekols
deepin
2017-10-12 18:23
#8
点赞
Reply View the author
avatar
moriwuhen
deepin
2017-10-12 18:49
#9
非常不错,这种功能值得拥有
Reply View the author
avatar
fredy4212
deepin
2017-10-12 19:36
#10
Mac上很多這樣的設計,感覺很自然
Reply View the author
avatar
要讲武德
deepin
2017-10-12 19:54
#11
点赞. 好看啊. 还有能不能把任务栏设置为透明 ? 毛玻璃有时候没那么好看.  Windows10 默认不支持透明, 但有软件可以更改为全透明 ,
Reply View the author
avatar
quadpixels
deepin
2017-10-12 20:06
#12
哇这么多回复好感动
其实我觉得这个方法是个hack,因为这样窗口重叠的部分就看不到了…
最优雅的解决方法应该是让模糊特效能够考虑到其覆盖范围以外的象素作为输入吧!可能这需要挖深一点才能彻底地解决了吧
Reply View the author
avatar
Ligocut光剪视频剪辑软件
deepin
Backbone of ecological co-construction group
2017-10-13 05:51
#13
原来deepin还能这样子改的。。。。
Reply View the author