存档

文章标签 ‘ubuntu’

武汉Deepin Linux DAU会议见闻

六月 1st, {2011 7 条评论 9,309 人阅读过  

上次在ubuntu11.04 release party北京站遇到deepin linux负责人刘文欢,他也就是deepin本人,邀请我去参加上个周末在武汉举行的deepin linux DAU大会,当时没有马上答应他,因为怕实验室太忙时间安排不开,后来跟领导商量了下领导表示支持,于是就趁周末跑了过去,一方面是希望能见到开源社区的朋友,另一方面也是很想看看deepin这个出自国人之手的linux发行版会做到什么水准。

会议到场人数很多,我作为特邀嘉宾很惭愧地坐在了前排,会议第一部分是deepin主题演讲,deepin操作系统创始人hiweed介绍深度的发展以及现状,接着是深度软件中心的主要开发者王勇介绍软件中心的相关情况,我个人感觉软件中心还是一个很不错的软件,虽然看上去很容易让人联想到360的软件中心,但不能不说这确实是一个很符合用户使用习惯的软件,从软件的搜索和安装都比ubuntu软件中心要舒服一些,当然这也是我个人的感受,据deepin介绍,软件中心的开发者王勇只有22岁,而且并没有读过大学,当时我就对他特别敬佩,像我们这些读了这么多年书现在还是这样技术平平的人真应该感到惭愧。最后由deepin本人介绍开源社区的管理与运营,让大家对深度这个社区有了一个比较深入的认识。

会议的第二部分是主题嘉宾演讲,第一位是国内开源界的名人袁萌教授,讲永中Office的事情,袁萌可以说是相当有争议的人物了,之前在ubuntu 10.10和11.04的release party现场都见过袁老出现,而且对于这种开源活动袁老似乎每次都不会缺席,这种活动每次出现的为数不多的老年人身影也就只有袁老了,但不管是他在新浪博客上还是在其它地方,大家对他的评论都是褒贬不一,我之前对袁老不熟悉,后来在twitter上打听袁老的事情,有人表示袁老人不错,但口头老挂着永中和U盘的事情就让人有点烦了,确实,袁老讲话我听不太明白(口音原因),但言谈中总会提到永中和U盘的事情,我对此到没什么特别的看法,可能年纪大了人会比较偏执,遇到自己觉得好的东西就会一直推崇。再看他的新浪博客,有人支持也有人很负面地骂,确实让人感觉到袁老真是中国开源界最有争议的人物,其实我觉得像袁老这样一位古希老人,不图名利,仍然能对中国的开源事业如此热心,已经实属不易了,即便大家对他的观点不认同,也不至于用那么偏激的语言去骂他,除非你让我去相信这样一位风烛残年的退休老教授还在用某种低劣的手段去谋取私利,与袁老见面听他言谈,感觉他人非常正直,绝不是什么小人,所以我觉得大家可以不喜欢他,但真的没有必要去骂他。

会议袁老讲完后我也给大家就我的一些经历做了个小报告,简单介绍了一个飞信的开发过程以及我个人的Linux使用经验等,接下来是中科大的张成同学讲在校园同推广Linux,张成是mirrors.ustc.edu.cn的现任维护者,中科大开源协会的副会长,感觉中科大的开源协会做得蛮不错的,大家都很热心地在做一些很有意义的事情,张成技术也非常不错,再一次让我表示汗颜。再之后便是在场的用户提问,具体都问了哪些问题我也记不清了,我也没有刻意地去做会议记录。

会议结束后第二天晚上我和deepin在他们公司单独聊了两个多小时,deepin确实是想在Linux发行版这一块做些事情出来的,在中国做这样的事情难免会遇到种种阻力,包括舆论上的政策上的等等,红旗这样一个烂到根的公司似乎让国人对国产Linux发行版很是绝望,雨林木枫反对的人也很多,我到不太了解原因是什么,我个人不太喜欢它是因为它之前山寨了Windows的UI来适应中国用户的使用习惯,其实说起来如果没有什么版权协议的问题的话也没什么不好。做操作系统是个很漫长的过程,不可能在一两年内就得到用户的普遍认可,即便是ubuntu也是经历了一个长期的过程,Canonical公司也出资做了那么久的公益,说实话,哪家做Linux的公司纯粹做公益我们都没法相信,包括Canonical也是想用ubuntu做出一个品牌再去拓展其它的业务,如ubuntu server. 当然,深度的经济实力远不如Canonical,但做发行版在最开始是很难有经济回报的,我们所能期望的就是深度能坚持下去,毕竟深度和红旗是两家完全不同性质的公司,应该不会像红旗那样腐化,而做这样一个发行版也一直是hiweed和deepin的梦想,其实我个人还是对他们挺有信心的,即便中国人做不出来自己自主研发的操作系统,能出一个被国际认同的Linux发行版也确实是一件好事。

我是站在一个中立的立场,我支持我认为好的东西,如果有一天深度变成了红旗那我也会跟着去骂的。当时deepin在北京给我演示深度系统的时候我真地觉得很不错,起码它降低了新手的技术门坎,通过虚拟化的手段让OFFICE和QQ都跑在了上面,可以说这两个软件对很多新用户来说都是很大的壁垒,这个问题解决了就解决了很多新手的烦恼,我个人觉得任何一家第三方的OFFICE都很难与MS OFFICE兼容,即便是永中它的公式编辑器也完全跟不上。他们没有集成这两款软件,也就不涉及到版权协议之类的问题了。

总之这一行还是受益匪浅的,希望几年之后deepin能成为让国人为之骄傲的发行版,当然也希望它千万不要成为第二个红旗。

分类: Linux 标签: ,

Openfetion for ubuntu messaging menu开发手记

五月 3rd, {2011 7 条评论 11,642 人阅读过  

自从ubuntu11.04发布之后Openfetion就遇到了一个比较麻烦的问题,把Openfetion飞信最小化到托盘之后就找不到了,没用过ubuntu11.04,不过据说它的unity桌面貌似没有status icon这回事,所以把Openfetion塞进Messaging Menu也成了一个很重要的任务,在这里把开发过程和大家分享。

首先要感谢@YunQiangSu提供的关于ubuntu messaging menu的资料,是在ubuntu wiki上关于Messaging Menu的介绍,链接在此:https://wiki.ubuntu.com/MessagingMenu/,这篇文章是关于Messaging Menu的一个介绍,以及它的行为和样式的一个指南,虽然没有涉及到具体的开发细则,但也不失为一个很重要的参考。很惭愧地说,在这之前我甚至不知道在ubuntu右上角看到的那个信封到底叫什么名字,后来知道它原来是一个Indicator,ubuntu的status icon区域很多软件都是用libappindicator来实现的,所以它们的行为和其它的发行版不太一致,比如Dropbox和Transimission左键点击Status Icon就可以弹出菜单,而在Slackware里面就只能用右键才能弹出菜单,这就是它们的不同,一个是Indicator,一个是普通的Gnome Status Icon,而这里面提到的右上角的那个信封便是Indiactor的一种,名字叫做Messaging Menu。好吧,我相信很多ubuntu用户会过来鄙视我的,写下这些给那些和我一样的小白扫扫盲,有误请指正。

我们可以把软件安装到Messaging Menu里面,这样即使软件没有启动也可以在Messaging Menu里面找到该软件,并可以从那里启动该软件,方法很简单。下面是pidgin的做法:

mkdir -p debian/pidgin/usr/share/indicators/messages/applications
echo /usr/share/applications/pidgin.desktop > \
		 debian/pidgin/usr/share/indicators/messages/applications/pidgin

这两句话的功能一眼就看地出来,无须解释了。

Messaging Menu相关的开发需要用到libindicate这个库,首先得确保在系统里面安装了这个库的开发版本:

sudo apt-get install libindicate-dev

首先我们需要获取默认IndicateServer对象的引用,并对其进行初始化:

IndicateServer *server = indicate_server_ref_default();
/* 这句话给软件分类,主要是保存位置不同 */
indicate_server_set_type(server, "message.openfetion");
/* 这句话比较重要,它会让已安装在Messaging Menu里面的软件项前面带一个箭头,
 * 表示该软件当前正在运行,效果图见下面 */
indicate_server_set_desktop_file(server, DESKTOP_DIR"openfetion.desktop");
indicate_server_show(server);
g_signal_connect(G_OBJECT(server), INDICATE_SERVER_SIGNAL_SERVER_DISPLAY, 
		G_CALLBACK(server_display), fxmain);

当收到好友发送过来的消息时可以在该项后面显示哪个好友发送过来的消息,以及显示未读消息的条数,效果图如下:

这时候就需要给当前的这个IndicateServer对象添加一个IndicateIndicator对象,并为该对象设置相关的属性,如name(即显示Indicator上显示的名字),count(未读消息的数目),time(消息发送的时间),icon(像如发送消息好友的头像),draw-attention(这个属性可以随便设置一个非空字符串,以使Indicator高亮提示用户有消息到达,同理设置空字符串可取消高亮)。
上面的几个属性除了time和icon之外都可以用indicate_indicator_set_property()函数来搞定,该函数设置的属性值都是字符串,time是一个时间值,需要使用indicate_indicator_set_property_time()函数来进行设置,至于icon属性的设置需要用到另外一个库libindicate-gtk,这个库仅提供了两个函数,其中一个便是indicate_indicator_set_proper_icon()用来设置icon属性,属性值是一个GdkPixbuf对象。下面看Openfetion上收到一条消息时Messaging Menu所对的动作:

/* no indicator found, create one :) */
indicator = indicate_indicator_new();
/* add it to the global indicator list */
indicators = g_slist_append(indicators, indicator);
indicate_server_add_indicator(server, indicator);
 
indicate_indicator_set_property(indicator, INDICATE_INDICATOR_MESSAGES_PROP_COUNT, "0");
indicate_indicator_set_property(indicator, "sid", sid);
/* set icon */
snprintf(portrait, sizeof(portrait) - 1, "%s/%s.jpg", fxmain->user->config->iconPath, sid);
pixbuf = gdk_pixbuf_new_from_file(portrait, NULL);
indicate_indicator_set_property_icon(indicator, INDICATE_INDICATOR_MESSAGES_PROP_ICON, pixbuf);
g_object_unref(pixbuf);
 
g_signal_connect(G_OBJECT(indicator), INDICATE_INDICATOR_SIGNAL_DISPLAY,
		G_CALLBACK(message_display), NULL);
 
indicate_indicator_show(indicator);

首先我们需要确定在Messaging Menu中是否已经有该用户对应的Indicator存在,如果有就没有必要再创建一个新的造成重复,而检测重复性这个问题费了我不小的力气,libindicate没有提供获取列表的API,但查了一下它的源码,发现它确实实现了一个获取列表的函数,它把它定义为虚函数,推荐用户从这个类继承,我对GTK的C语言面向对象的机制不太了解,不知道该怎么去继承,但既然有这个函数就可以想办法拿来调用,能获取到Indicator列表,但这个列表简直让我抓狂,一个GArray列表,里面存放的是Indicator的id,一个毫无用处的数字,通过它根本获取不到Indicator对象,更不用说Indicator对象的属性了,因此我只能用自己的方法来实现了,其实很简单,就是每创建一个Indicator对象就把它塞到一个GSList里面,创建之前搜索该链表,如果其中有indicator的sid值与要创建的sid相同,则表示已存在,无需再重新创建,把它的count值加1即可。

有一点需要注意的是libindicate-gtk新旧版本的pc文件名是不同的(感谢@riku的测试),在10.04上是旧版pc文件名是indicate-gtk.pc,因此编译选项可以是

pkg-config --cflags --libs indicate-gtk

而在ubuntu 11.04中文件名是indicate-gtk-0.5.pc,编译选项便是:

pkg-config --cflags --libs indicate-gtk-0.5

我在CMakeLists.txt做了一些处理来让它自动识别这两个版本的不同。

分类: C/C++ 标签: ,