linux托盘菜单(或indicator)开发

在Gnome2时代,托盘菜单广泛采用GtkStatusIcon,但在gnome3时代好像也可以,但ubuntu13.04之后unity不支持GtkStatusIcon了(ubuntu12可以通过白名单的形式解除这一限制),所以在ubuntu13.04的unity下使用GtkStatusIcon会没有任何显示,所以得用libappindicator来显示托盘菜单,实际上ubuntu并没有去除托盘菜单这个东西,只不过把托盘菜单改了个名为indicator applet,规范了些,不过差不多,加了点限制而已,使用还是挺方便的。

之后研究了些高级菜单,就是说菜单项里面包含一些其他控件,比如一个播放器想要托盘菜单控制音量,如果只是简单的菜单,可想而知控制音量多么不方便,显然应该在菜单中加个滑块嘛。所以这个需求咋整呢,把ubuntu的系统indicator的源码down下来研究了一下,找到一种继承GtkMenuItem的自定义控件类的方法,即做一个GtkMenuItem的子类,不过这个子类里面包含了一些其他控件,如滑块啊,切换按钮啊,日历啊什么的。这些自定义控件在一个libido库里面(真爽,不用自己费心了)。这样按说使用这个自定义MenuItem来替换之前的MenuItem就能达到高级控件的效果了,而且还可以捕获事件信号,但libappindicator这个库真TMD让人无语,替换自定义的MenuItem之后,托盘菜单上所有原始的MenuItem都能正常显示,而自定义的MenuItem貌似只能显示出原始MenuItem的元素,控件那些都不见了,妹的。可是如果不用libappindicator,用原生的GtkMenuBar来显示菜单,却是可以的。真是奇葩啊。而且在xfce和kde,gnome3环境下貌似也是可以的?(需要再次验证一下),为啥呢?

没办法,对于这种奇葩的问题,目前有点免疫力,另辟蹊径了罢。不用libappindicator罢,于是找到了libinidcator和dbus-menu这两个高端货,libindicator文档缺乏,研究麻烦,转战到dbus-menu,找到一些文章,dbus是linux下的一个进程间通信的东东,很强大,可以实现gtk,qt进程间通信。dbus-menu自然就能共享菜单了。不过呢,今天down了一个indicator-applet的代码,又被我发现了一个最TMD简单的解决方案(需要验证一下),就是呢,GtkMenuItem是GtkContainter的子类!我擦!直接gtk_container_add完事!亏我搞了这么久真是没想到啊。不过对于dbus-menu确实也可以研究一下,多进程共享菜单还是挺诱人的嘛,君不见ubuntu的那个很爽的音量indicator吗?可以集成多个播放器哦亲!

说到dbus,还有高级货,mpris和osd-lyrics!mpris是一个播放器控制接口,如果要集成自己的播放器到音量indicator中,就得实现这个,更重要的是,实现这个之后还能通过osd-lyrics来显示歌词哦亲啊,我的亲啊,这尼玛又免去了一大堆代码啊,有木有,开源的世界就是协作啊,各种拼接啊。哈哈。所以,对播放器来说,必须得搞定mpris这货,加油!