Friday, May 1, 2009

开始做 Rainmeter 的 Linux 移植

Rainmeter 是我非常喜欢的一个桌面小程序,它可以监控 CPU、内存等的使用量,并且在漂亮的界面上展现出来。Rainmeter 最为成功的一点在于,它提供了很好的自定义功能,有很方便的 API 用于创建个性化的界面。我最初就是被它的一个漂亮界面(ToHeart2主题)给吸引住的,然后就一直使用到了现在,已经有 2 年以上了吧。这个软件的作者还开发了另一个同样美观实用的桌面程序 Rainlendar ,并且同时提供了 Windows 和 Linux 的版本。可惜的是 Rainmeter 目前的开发似乎已经停止(保持0.14版本已经相当长时间),并且没有提供 Linux 版本。

不过 Linux 下也有类似的桌面程序,我目前就在使用 Screenlets。这是一个利用 Python + GTK 实现的小程序框架,有一些挺实用的小工具,并且还有一些实例。其实以前就想试着做一个 Screenlet 出来,但是对 Python 的掌握还不到家,没有能力实现。最近稍微多接触了一些相关的资料,觉得可以试着做做看。细心看了 Screenlets 自带的 Example 源代码之后,算是大致有了了解,知道该怎样做了。此外还得看点 cairo 的资料,因为 cairo 是 Screenlets 的绘图引擎。在 DevHelp 工具中有相当详细的文档,基本上需要的资料都可以查到,因此就没有太大的困难了。

Rainmeter 最难实现的部分就是它对于配置文件的解析,这相当于要写个解释器。Python 本身提供了一个 ConfigParser,专门用于解析 ini 文件,有一定的帮助作用,免去了做文本分析的工作。不过麻烦的是配置文件的逻辑,这个解析起来有一定难度。Rainmeter 配置脚本里主要有 4 类信息:基本配置,Measure,Meter 以及 Bang。基本配置倒是相当好处理,就是刷新频率、背景配置之类的信息。Measure 就是对某个信息的测量,比如时间、硬盘空间、CPU使用率、内存使用量等等,不过它还提供了一个“Calc”测量模式,就是计算一个公式,公式中可以将其他 Measure 作为变量,这是一个实现难点。Meter 就是对界面的定制,比如说绘制图片、直方图、曲线图、饼图等等,这个因为参数和种类都很多,因此做起来也比价麻烦。Bang 其实就是一些命令,因为以!开头所以叫这个名字。Bang 和 Measure 可以联系起来,比如说当测量数值达到某个值时执行某项命令;也可以和 Meter 联系起来,比如说点击某个图片执行某项命令之类。这个 Bang 的实现估计也够麻烦的。

今天写了一个晚上,因为对 PyGTK不熟悉,感觉写起来不是很顺利。代码发布到了 Github 上这个地方,现在还在开发中。现在倒是能够实现对部分 Meter 的绘制了,还支持了 Meter 的相对定位功能,效果看起来还行。明天继续来写吧~

贴几个图片,由于只实现了 Meter 部分,所以还不是正常工作状态,现在只是有了正确的 layout:

0 comments: