如图所示(除UI部分外,其余还未完工): 总体来说,写GNOME Shell的扩展还是比较轻松和愉快的,只要你懂JavaScript,知道什么是prototype,再加些类GObject API的使用经验,就可以开工了。 简单解说下我目前扩展所做的工作吧(源代码在此:https://github.com/tualatrix/vpn-indicator/tree/master/gnome-shell) ●首先构建“/etc/openvpn/”这个目录的GFile对象,然后调用“enumerate_children”方法遍历其子文件(我尝试用GLib的glob,但是失败了) ●通过JavaScript正式表达式匹配后缀为“.ovpn”的配置文件,生成如上图所示的“PopMenu” ●调用GFileType的“get_symlink_target”方法取得当前配置的真实路径,然后就可以使用PopMenuItem的setShowDot方法来指示当前使用的配置了 ●最上面是一个PopupSwitchMenuItem对象,计划是它在Toggle的时候再去调用DBus方法以控制VPN的开关,但是目前无法取得DBus(SystemBus)返回的数据,于是得不到状态 总体来说,GNOME Shell提供的一些UI库,如StIcon、PopMenu、PopMenuItem和PopMenuSwitchItem等还是很丰富的,这些都可以用CSS来控制样式,其次再利用GLib、Gio等库,可以完成任何有关本地、网络和进程间通讯等桌面应用程序常用到的任务,只要有什么想法一般都是可以实现的。 但目前GNOME Shell还有严重的问题——它的扩展机制仅仅是扩展自身,而不关心第三方应用程序与它的集成度,于是比较悲剧的是,连iBus输入法暂时都用的是旧的StatusIcon。 这方面Ubuntu就做的好多了,AppIndicator、Unity就设计了比较好的API供第三方应用程序使用,并且已经有大量第三方应用程序开始采用。 GNOME Shell、Unity,两者应该取长补短,这会是最好的。让我真的在这两者中选择一个,我还真选不出来。目前的总结是: ●GNOME Shell:简洁、一致、稳定、扩展能力强 ●Unity:不够稳定、Bug多、很多不一致、第三方应用集成性好、性能相对好一些 到了Ubuntu 11.10,它将同时搭载GNOME Shell和Unity,到时用户会选哪个呢?我又会用哪个?到时再看着办吧! |