五千年(敝帚自珍)

主题:【原创】基于Linux内核的开放源代码操作系统的组成:第一篇 -- 请尽量

共:💬75 🌺106
全看分页树展 · 主题 跟帖
家园 【原创】基于Linux内核的开放源代码操作系统的组成:第三篇(上)

第三篇 图形界面(上):X Window System和GTK+

与Windows不同,Linux的图形界面是可选的(不知道Windows XP Embedded Edition是否可以配置成只有字符界面的),所以在嵌入式系统和服务器上,系统的资源如内存等可以节省下来。似乎是UNIX的一个传统,Linux也依赖于X协议(X Protocol)提供图形用户界面。X协议出现于上个世纪八十年代,其目的就是为UNIX操作系统提供对网络透明的(network transparent)图形用户界面。记得我第一次接触X是在大学的SUN工作站上,那也是我第一次看到计算机图形界面。那是个黑白灰度级(gray scale)的图形终端,通过X协议连接到空调机房里的SUN工作站上(不记得是SUN2还是SUN3了)。看着高年级的学长在用鼠标玩国际象棋,我想我的嘴当时一定是没有合拢的。

X协议采用了客户/服务器的体系结构。各个应用程序就是客户端,发出作图请求。服务器端(又称为display)收到作图请求后,把绘制好的图形输出到屏幕上,另外还把来自键盘、鼠标、数字化仪等设备的输入传递给应用程序。在X协议刚刚出现的时代,计算机的处理能力和图形终端都是稀有的资源。为了充分利用这些计算资源,X协议的体系结构使得图形应用程序可以在具有强大计算能力的工作站上运行,通过网络把作图请求发送到图形终端上输出。这样,各种应用程序,图形或字符界面,都可以在工作站上运行,利用其计算能力。同时,有限的图形终端也可以为多个工作站共享。

在客户端,X协议的底层被抽象、概括为一个程序库,通常称为XLIB。XLIB向应用程序提供了各种的绘制原语(drawing primitives),并将来自于鼠标、键盘等设备的输入映射为事件(events)。大体上说,应用程序在一个事件循环(event loop)中接收并处理自己感兴趣的事件,调用作图原语函数进行作图。在一个统一的应用编程接口(Application Programming Interface)下面,异步网络通信、输入和输出设备的差异等都被XLIB巧妙地隐藏起来了,这样不仅简化了应用程序,还有较高的可移植性。

实现X协议的软件系统,包括客户端的XLIB和服务器端的设备驱动程序,统称为X窗口系统(X Window System)。大概由于是微软的Windows的普及,很多人,包括一些IT从业人员,都错误地把X Window System叫成了X Windows System。

当强大的计算能力和图形显示成了每个PC都必须具有的卖点后,X协议并没有落后于时代。首先,服务器端,包括图形控制卡、键盘、鼠标等设备驱动程序,从独立的图形终端上移到了PC上,成为了运行在本机上的一个服务器程序,而不再是一个实实在在的机器。而应用程序依然向以前一样,通过XLIB向服务器端发出作图原语。由于现在服务器和客户都在同一个操作系统上,各自作为一个进程运行,XLIB使用UNIX socket而不是TCP socket在两者间进行作图原语和事件的传输。也就是说,应用程序并不用修改,只要在启动时指定运行在本机上的X服务器进程作为自己的display就可以了。

当然,XLIB仍然可以继续使用网络来传输作图请求和输入事件。两个安装了X的PC在连上网络后,一个可以成为另一个的display。这个feature在某些特定的场合非常handy。例如,结合netboot和NFS,把廉价的或淘汰的PC改造为无盘图形终端,用在图书馆、学校等预算有限,又需要严格控制的公共场合。

在2004年以前,XFree86()是Linux和其他开放源代码操作系统的首选X Window System。由于这是唯一的一个成熟稳定的采用开放源代码许可的X Window System,几乎所有的Linux distors都使用XFree86,直到其4.3版。在很长一段以来,XFree86的用户对于xfree86.org的自我任命的Board of Directors抱怨甚多。认为他们与现实脱节,保守僵化,在开发管理中独断专行,没有积极相应用户的要求,事实上阻碍了XFree86的发展。很多Linux distros更是认为XFree86的种种不足成了Linux向桌面系统进军路上的绊脚石。在2003年,xfree86.org内部对于产品发展方向、开发管理等问题产生了分歧,一部分开发人员和积极分子(active contributors)分裂了出去。在2004年初,xfree86.org的Board of Directors在发布4.4版前对其软件许可做了修改,给开放源代码操作系统再发行(redistribute)XFree86的4.4和以后版本造成了很大困难。绝大部分的Linux distors决定了将不使用4.4和以后版本的XFree86软件。

XFree86的异见分子们(dissidents)最终加入了X.Org。在HP、SUN、IBM的赞助下,X.Org以原来的XFree86版本4.3为基础开发了X.Org版本6.8.0。由于X.Org保持了XFree86原来的软件许可,并且在开发管理中更加开放,对于采纳新技术、新思想也更为主动、积极,各个Linux distros几乎是立即投入了X.Org的阵营。

在经过了二十多年的发展,X协议目前的版本是11R6.8。因为这个原因,人们经常又把X Window System简称为X11(由于介绍的是开放源代码的X Window System,下面出现的X11都指XFree86或X.Org)。一个符合目前这个版本的X Window System包括了在客户端的XLIB、在服务器端的输入输出设备驱动程序、管理display上各个window的windowing manager、和各种各样的extensions。现在X11系统的发展,基本集中在增加新的extensions和完善对各种显卡的支持上。比如,对TrueType字体的支持、对全屏幕视频播放的支持、对双显示器的支持、对direct rendering infrastructure(简称DRI)的支持等等。DRI提供了对显卡图形硬件的直接存取,可以大大提高2D和3D的绘图速度(Linux内核专门增加了设备驱动程序用于支持DRI)。

和其他硬件设备的开放源代码驱动程序一样,X11的显卡设备驱动程序也面临着硬件厂商不愿意或无法(受限于所采用的第三方零部件的许可协议)披露硬件设备接口规范的问题。各个厂商最新型的显卡往往都无法立即得到支持,或者是只有部分的支持,比如,没有3D的硬件加速(意味着无法玩最新的video games)。一种解决办法是当这个问题不存在,宣称自己不是gamer。另一种办法是使用厂商发布的closed source的设备驱动程序。两种办法其实都没有彻底解决问题。第一种办法是回避。意味着花几百美元买来的显卡却不能完全发挥作用。由于硬件厂商,特别是ATI和NVIDIA都把Linux当作二等公民对待,尽管时不时地发布closed source的Linux设备驱动程序,当无论稳定性、速度还是功都总是比不上Windows和Mac版的设备驱动程序。

X11对除了显卡外的其他设备的支持还算可以,比如USB鼠标、所谓的多媒体键盘、手写板(tablet,不是tablet电脑)等都基本支持。当然,和显卡一样,X11对这些设备支持也需要Linux内核的相应设备驱动程序,比如USB、串行口等等。

因为直接使用XLIB进行编程非常繁琐,于是人们为常见的图形用户接口编程工作开发了GUI toolkit。在Linux上,最流行的两个GUI toolkit是TrollTech的Qt和GNU的GTK+。由于我一直以来用的都是基于GTK+的GNOME,对Qt和基于Qt的KDE无甚了解,这里就着重讲一下GTK+。

GTK+源自于GIMP,GNU Image Manipulator Program,一个可以媲美Adobe Photoshop的开放源代码图象编辑程序。GIMP可以说是Linux上的第一个,可能还是最著名的killer application。GTK是GIMP Tool Kit的简称。和Qt不同,GTK+是用C写的。虽然C语言不是一种面向对象的编程语言,但GTK+的开发人员利用结构、函数指针和强制类型转换,把GTK+弄成了一个面向对象的应用程序库。GTK+由三个部分构成。第一部分是GLIB,提供了某种程度上的面向对象支持,如封装、继承等。GLIB提供的类包括常用的数据结构,如list、hash table、stack、queue,还有常见的其他类型如string、file、thread、date and time等。由于没有编译器的直接支持,GLIB的类其实就是C语言的结构(struct),加上类似于“g_list_append(GList*, gpointer*)”这样的“方法”函数。C++或Java开发人员需要花一些时间来习惯这种“半截”的面向对象编程。第二部分称为GDK,把操作系统提供的图形界面的实现细节隐藏起来,使得基于GTK+的应用程序可以独立于具体的图形界面,比方说X11和WIN32。第三部分就是GTK,提供了常见的GUI控件,如窗口、对话框、按钮、滚动条、下拉菜单等等。用GTK+编程要大量地使用callback。每个GUI控件响应用户的动作,如按下按钮,产生相应的事件,如“clicked”,然后调用应用程序注册的callback。GDK和GTK都使用了GLIB提供的facilities。在具体的组成上,GLIB单独是一个程序库,GDK和GTK通常放在一起,构成另一个程序库。

为了进一步简化应用程序的编程,GTK+的开发人员又提供了一个称为glade的interface builder和相应的程序库。使用glade,应用程序开发人员可以用GTK+所支持的控件在屏幕上“画”出用户界面,并存放在XML文件里。glade的程序库提供了函数可以根据XML文件直接构造出所有的控件,生成用户界面。应用程序因而可以专注于business logic和事件处理机制(callbacks)。

后记:本来这篇还应该介绍一些常用的图形界面的应用程序的。但有关X和GTK的篇幅实在太长,就分成了上、下两部分。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河