说说我做的东西
在一切开始之前,先做个广告....Emacs是一个编辑器,一个很好的写代码的工具,希望有更多的人能尝试Emacs,愿意用Emacs
大本营:http://www.gnu.org/software/emacs/
写这个帖子犹豫了很久,虽然日子一直都过得平平淡淡地,没有什么波澜,但是真到了动笔(键盘)的时候却一下子不知道从何说起,尽量做到以聊技术为主吧。
首先,我是做IT的,IT这个行业真的是很宽容的一个行业,五花八门,什么都有,甚至于连电脑城旁边卖光盘的小贩都可以称自己为做IT的。应该算不上码农,因为平时的工作里写代码不算太多。即使在一个如此宽容的行业里,我想我做的东西也应该是比较少人做的,往大了说是做Linux平台的桌面系统,往小了说是做Linux平台上的应用程序及界面的开发,用到的语言及工具主要是Gtk+、glib、clutter、glade3、GNU Autotools。
在我工作的前2年我做的是嵌入式平台上的Linux下的界面及应用程序的开发,在嵌入式Linux平台上比较流行的界面开发工具应该是QT,还有国内的MiniGUI,当时我们出于种种冠冕堂皇原因并没有使用这两种,比如QT太庞大,MiniGUI要收费等等等等,其实根本原因我觉得是我当时的老大太强...所以就由他带着我和另外一个刚刚毕业的兄弟一起开发了一套GUI系统,嗯。语言用了C++和C,面向嵌入式Linux平台,基于framebuffer。我们3个边开发边将其应用于种种小的东东上,从最开始的VOIP到后来的PMP,一直都在对其进行不断地完善,从只支持文字到bmp到jpg,到动态gif,再到png有了半透明,难得的是它编译出来的lib大小只有1M多一点。我一直对那套GUI系统心怀敬畏,因为我一直都不太懂它,不够了解它,这种情况持续了3年,直到我开始研究Gtk+和glib,原来如彼!
现在想来,简单说那套GUI系统首先是有一个WndBase,做为一切widget和window的parent,它负责处理整体的消息响应事件,以及基本的绘图。另外还有一个消息队列,通过后台的runtime不断地添加消息,分发消息。消息类型是定义好的,先找到要接收消息的窗口,再找到窗口中的widget,通过消息类型让widget来响应,这套系统完全是通过消息机制来进行的。这种机制有一个比较严重的缺点,我一直都没有认识到,因为算是半个设计人员,所以潜意识里在使用的时候就会故意避开,直到今年11月份,在我面某家公司的时候被问到了我才意识到。这个bug就是,假如同时有两个消息发出去后都是要处理某个相同的数据,这个时候没有一个锁在数据被编辑时进行保护。面试我的人一听我说起这套机制立刻就意识到了这个问题,是我太烂了...后来我去google他的名字,发现能搜到很多信息,大牛。另外一个不够完美的地方,就是这个GUI系统不能像Gtk+一样通过container的方式来由一个widget包容另外一个widget,所以我们就写了不少对应的widget,比如listbox、gridlist等等。好在我们主要应用于MP4等手持设备,像非智能手机一样,基本上不会有太复杂的应用。
说说优点,我当时的老大弄了一个Windows下的模拟器,因为最开始的时候没有很多的开发板,拿到了也会先给做driver的同事去测,而我们不能闲着。这个模拟器就是去模拟framebuffer了,创建一块共享内存,向里面填数据即可,主要是有一个double buffer的机制,绘图的时候先在备份的buffer里做好,将一整块内存替换掉,这样就避免了快速刷新时候产生的闪烁问题,这个也很强。
能够参与做这套GUI系统给我的帮助很大,让我明白了这些偏向于底层的东西是如何实现的,在我后来学习Gtk+的时候,经常会有熟悉的感觉,查看某个函数的源代码,果然实现方法差不多:)
/**************************************************XWindow的分割线********************************************************/
众所周知,标准的Linux是不带桌面系统的,也就是只有命令行。可以去ubuntu的官方网站上申请一张server版的试试,装好后不带桌面系统
要想有桌面系统就得装一个XWindow系统,XWindow是一种架构,主要是由XServer和XClient组成,它们之间通过XProtocol进行通讯
XServer流行的有两个,一个是XFree86,另外一个就是大名鼎鼎的Xorg。现在XFree86已经逐渐被淘汰了,所以3大发行版中用的都是Xorg,当前的版本应该是X11R7
装好了XServer还要安装一个XClient,XClient的选择就多了,在这之前还有两个概念,桌面环境(Desktop Environment)和窗口管理器(Window Manager)
桌面环境整合了窗口管理器及多种应用,像Gnome、KDE和Xfce,所以它会非常庞大,全部安装下来要上G
窗口管理器就是单纯的一个应用程序,起到管理所有窗口显示、排放等等很多种功能,这个就要小很多了,一般是M级,K级也有,传说中最小的一个,代码只有不到1000行..
在Gnome中用到窗口管理器是metacity,KDE因为我极少用,所以就不知道了,希望知道的兄弟能指出来,懒得查了..
说了半天,想说的只有一句话,其实窗口管理器就是一个特殊的XClient,装好了XServer再装一个窗口管理器就能实现有桌面了
推荐几个窗口管理器
漂亮且相对小巧的:Enlightenment17,即E17,千万不要装E16,复杂又难看
小巧的:blackbox、openbox、FVWM,这几个需要自己去配置,熟悉了配置出来东西绝对不比E17差
我最喜欢的:FVWM
[ 本帖最后由 emacs 于 6-1-2010 16:42 编辑 ] 写这个帖子要泄露一些公司或者个人的信息,这也是我一直犹豫的原因
现在敢写这个帖子的原因是我准备跳槽了,在这儿向我保证我说出来的技术都是可为大众所知的无公害的,不会有商业机密,呵呵
说说我的个人情况,尤其公司,说细了很容易被猜到,希望大家不要猜:P
06年本科毕业后去了深圳某公司,我的专业是通信工程,当时的职位也是硬件职位,只是由于很偶然的机会,进公司后开始写代码。
当时我很烂,基本不会,都是我老大带,和我一起做的那个同事很强,也教会了我很多东西,很感激他们
08年初由于某些很神奇的原因,调到了我们公司的中国区总部,在首都,正好离我家很近,LD也在首都,全家开心:D
现在过来马上就要满2年了,不过我还是一直都在等满足ACS的4年要求,汗..
[ 本帖最后由 emacs 于 3-1-2010 20:08 编辑 ] 占楼2 占楼3 gvim:good 进来学习学习 排队顶楼主,做Linux GUI底层,还是要敬佩一下:good :good :zan 原帖由 ubuntuhk 于 3-1-2010 16:27 发表 http://www.freeoz.org/bbs/images/common/back.gif
排队顶楼主,做Linux GUI底层,还是要敬佩一下:good :good :zan
没有U版说的那么强,我当时很烂,基本上没有涉及过底层的东西,95%都是应用层的
其实在嵌入式Linux上画图不算难,大家都是搞framebuffer,搞定了这一个driver就很容易实现了 Mark一下,明日上班再仔细看!
看到Clutter GTK+ Framebuffer QT等关键字就知道文章技术含量高,晚上睡觉前还是不看了,嘿嘿!:lol 看完了,重复发明轮子阿,汗。
好像没有说明这套库相对于其他GUI库的优势在哪里。
只知道怎么用AWT/Swing和SWT做UI,囧 高手真多阿。有的学习。
有个疑问 --
这个bug就是,假如同时有两个消息发出去后都是要处理某个相同的数据,这个时候没有一个锁在数据被编辑时进行保护。
...
如果发出的消息都是对Widget的, 在QT里widgets好象都是在主线程里,因此应该不用lock (coredump 版主指点下阿)。LZ的意思是不是这套GUI里widgets可以用在不同的thread里?
如果这个消息队列是发message到不同thread中的,那么是不是应该由响应的thread,而不是消息队列本身,来处理lock,这样才能使message despatch并发。我怎么觉得LZ的GUI没错,而是使用的APP错了?
回复 #12 GPS 的帖子
这个emacs同学没有细说,不知道他们这套系统是在哪一层实现的。如果是kernel级别的,那不尽可能是消息分派的不同线程,也有可能是不同进程。不过,一般来说,采用消息分派的GUI库的都是在同一个thread里的。比如MFC的HandleMessage主消息循环。 原帖由 Tux 于 4-1-2010 09:09 发表 http://www.freeoz.org/bbs/images/common/back.gif看完了,重复发明轮子阿,汗。
好像没有说明这套库相对于其他GUI库的优势在哪里。
只知道怎么用AWT/Swing和SWT做UI,囧
哈,这个东西的优势首先是免费,算是一个相当重要的原因
其次是我们从头到尾做了一遍,拥有全部代码的所有权,修改起来也很容易
可以在Windows下写代码、编译、运行、调试,在不涉及到Linux底层的地方使用模拟器来实现和真正开发板上一样的效果 原帖由 GPS 于 4-1-2010 16:05 发表 http://www.freeoz.org/bbs/images/common/back.gif
高手真多阿。有的学习。
有个疑问 --
如果发出的消息都是对Widget的, 在QT里widgets好象都是在主线程里,因此应该不用lock (coredump 版主指点下阿)。LZ的意思是不是这套GUI里widgets可以用在不同的thread里 ...
怪我没有说清楚,不好意思
这套系统,在我转调之前,只有一个主thread,不知道现在怎样
通过类似于gtk_main的方式进入消息循环,以后的事件都是由消息来驱动
在这种情况下我们采用的方法是回避了同一时间访问同一个数据的问题
比如我使用send_message,使消息在响应后才返回,在这之前用户不能有同一种操作
还有一种post_message,只管发,不管响应,通过判断条件来进行是否要响应这个消息,判断条件不行的话就要丢弃这个消息了。如果是连续的大量的这种消息,理论是只要响应最后一个,丢弃前面的了
这些事情从某些方面来说都是影响了用户的操作行为,所以我觉得这个不够完美.. emacs继续写啊,喜欢看:ppb_53 原帖由 coredump 于 5-1-2010 18:40 发表 http://www.freeoz.org/bbs/images/common/back.gif
emacs继续写啊,喜欢看:ppb_53
最近有点儿忙,上面是趁着元旦放假时候写的
老大在催活儿,我又在和下家谈具体情况,还没谈拢..
等有了时间我一定多写
希望core总写写QT的情况啊,我很感兴趣的:lol :lol :lol 为何说e16难看,我觉得e16安装后默认样子就不错,至少比某些*box看起来舒服点。不过在Arch上装e16导致我GNOME混乱倒是发生过,找不到原因后来就删了配置搞定的。
不知道三星赞助enlightenment之后,e17啥时候能出个release。
KDE其实到了4.x之后,效果非常赞,用户体验也很好了。大家应该去体验一下,估计认识就会有所变化了。
KDE的窗口管理器叫kwin,甚至实现了Compiz的那种特效。
BTW: 为何楼主喜欢用这种方式写"XWindow",很不习惯。还是习惯了X Window这种。 原帖由 Tux 于 6-1-2010 20:35 发表 http://www.freeoz.org/bbs/images/common/back.gif
为何说e16难看,我觉得e16安装后默认样子就不错,至少比某些*box看起来舒服点。不过在Arch上装e16导致我GNOME混乱倒是发生过,找不到原因后来就删了配置搞定的。
不知道三星赞助enlightenment之后,e17啥时候能出 ...
我对E16是浅尝辄止,记得是看到菜单的繁琐,而且又没有半透明,所以放弃了
而XWindow这个写法是因为我我最开始见的是这个,所以就一直这样写下来了
这个就像定义指针的时候
gchar* str;
gchar *str;
都一样,各有喜欢
以上都是我的一家之言,希望Tux兄勿怪:D
KDE的窗口管理器多谢指教,好象KDE中所有的组件都是以“K”打头的? 原帖由 emacs 于 6-1-2010 22:36 发表 http://www.freeoz.org/bbs/images/common/back.gif
KDE的窗口管理器多谢指教,好象KDE中所有的组件都是以“K”打头的?
对,比如Konqueror,Kmail,Kontact,KOrganizer, Knotes,Koffice, KDeveloper...
其实KDE还是很有特色的,3.1时代的不稳定让我对其一直有偏见。
看到全部大写的单词觉得怪怪的:lol 我们现在的开发都在Emacs下,刚开始用这个编辑器真得很纠结,所有的windows下快捷健都不能用,现在用了好几年了。。。还是不习惯 原帖由 sqfo 于 15-1-2010 15:54 发表 http://www.freeoz.org/bbs/images/common/back.gif
我们现在的开发都在Emacs下,刚开始用这个编辑器真得很纠结,所有的windows下快捷健都不能用,现在用了好几年了。。。还是不习惯
可以找Windows下的emacs来用,哈哈
页:
[1]