GNOME 项目
GNOME 是 GNU 网络对象模型环境(GNU's Network Object Model Environment)的首字母缩写。GNOME 旨在解决 UNIX 世界中以前未解决的许多问题,例如:
提供一致的用户界面。
提供用户友好的工具,并通过利用 UNIX 基础使其功能强大。
为组件编程和组件重用创建 UNIX 标准。
为打印提供一致的机制。
GNU GNOME 项目最初于 1997 年 8 月宣布。仅仅经过一年的开发,全球约有 200 名程序员参与该项目。
最初的公告呼吁开发人员在多个论坛中塑造 GNOME 项目:GNU 公告邮件列表;Guile 邮件列表;以及 GTK+ 和 GIMP 邮件列表。影响该项目的程序员和其他人员主要是自由软件爱好者,他们在图形编程和语言设计等领域拥有不同的专业知识。
GNOME 团队一直稳步致力于为未来的自由软件开发创建基础。GNOME 提供了工具包和可重用组件集,以构建自由软件最终用户所渴望的软件。
我们最近发布的 GNU 网络对象模型环境版本包括:GNOME 0.20,GNOME 的第一个显示集成迹象的版本,于 1998 年 5 月发布;Drooling Macaque 0.25 版本,具有更多功能;以及最终的最新公开版本 GNOME 0.30,代号为 Bouncing Bonobo。
GNOME 0.20 版本是第一个包含在 CD-ROM 发行版中的版本。Red Hat 5.1 附带了 GNOME 桌面环境的技术预览版,并于 1998 年在北卡罗来纳州 Linux Expo 上首次演示。
在 Drooling Macaque 版本之前,GNOME 软件版本的协调工作由团队中的两三个人完成。这成为一个沉重的负担,因为宝贵的时间被用于协调每个版本。我们一直在努力使发布过程更加模块化,并将不同的模块分配给软件包维护者。每个软件包维护者负责独立于主发行版打包、测试和发布他们的软件包,我们认为主发行版是核心库和核心桌面应用程序。到目前为止,我们取得了一些成功,但仍有改进空间。我们将继续改进发布流程,使其更简单。
最新的 GNOME 版本 Bouncing Bonobo 是第一个以 GNOME 电子表格 Gnumeric 为特色的版本。
1998 年 1 月,Red Hat 宣布成立 Red Hat 高级开发实验室 (RHAD)。Red Hat 实验室的最初目标是通过提供代码和程序员以及帮助我们管理项目资源来帮助 GNOME 项目。
Red Hat 高级实验室贡献给 GNOME 的所有代码均根据 GNU GPL 和 GNU LGPL 许可证的条款提供。Red Hat 聘请了几位 GTK+ 和 GNOME 开发人员,他们迅速为 GNOME 项目提供了许多重要功能。
例如,Rasterman 为 GTK+ 实现了主题;GTK+ 主题允许用户更改小部件的外观。这是通过从小部件工具包中抽象出小部件绘制例程,并将这些绘制例程放入可以在运行时加载的模块中来完成的。因此,用户无需关闭应用程序或重启桌面即可更改应用程序的外观。
GTK+ 主题功能齐全。到目前为止,已经编写了许多主题前端。在撰写本文时,可用的主题包括 Motif、Windows95、Metal、原生 GTK+ 和通用基于位图的引擎(请参阅“资源”)。网站 http://gtk.themes.org/ 保留了一个最新的列表,其中包含许多可供选择的贡献主题。
GNOME 项目所需的 GTK+ 工具包的各种重要更改,例如菜单键盘导航代码和增强的“拖放”协议(XDND 和 Motif DND),由 Owen Taylor 编写,他是一位著名的 GTK+ 黑客,现在在 Red Hat 实验室工作。
RHAD 的 GNOME 团队创建或维护了各种应用程序,包括:Ghostscript 前端(由 Jonathan Blandford 编写)、GNOME 帮助浏览器和 GNOME RPM 界面(Marc Ewing 和 Michael Fullbright 编写)、GNOME 日历和 GNOME 画布(Federico Mena 编写)以及 ORBit CORBA 2.2 实现(Elliot Lee 编写)。
GNOME 项目在项目早期收到了 GNU/Linux Debian 团队的货币捐赠,以及 Quant-X Service and Consulting GmbH 提供的 Alpha 板。我们非常感谢他们的贡献。
GNOME 库提供了一个框架来创建一致的应用程序并简化程序员的任务。GNOME 库的更多功能将在稍后介绍。这里讨论 GNOME 库中当前一些最重要的发展。
元数据
桌面环境面临的一个问题是,通常需要一种机制来存储有关文件属性的信息。例如,应用程序可能希望为特定的可执行文件绑定一个图标,或者为图形程序生成的图形绑定一个小的缩略图图像。这些图标应该在语义上附加到主文件。
例如,Macintosh OS 提供了一种将此信息作为其“资源分支”存储在文件中的方法。这种机制在 UNIX 环境中实现充其量会很笨拙。主要问题是,不了解元数据的应用程序可能会导致元数据信息不同步。
GNOME 元数据由 Cygnus 的 Tom Tromey 实现,考虑到许多设计约束和权衡(在其网站上详细描述)。以下是 GNOME 元数据功能的列表:
在每个用户设置中,在每个文件的基础上绑定信息,并且每个用户跟踪自己的绑定。系统默认设置在这些设置之上应用。
通过文件内容绑定信息是根据文件类型使用文件签名完成的,类似于 UNIX 的 file 命令。
通过正则表达式绑定信息:例如,gif 文件的默认图标将由正则表达式 .*\.gif$ 提供。
元数据系统经过优化,旨在提供连贯的 GUI 解决方案,而不是作为对现有命令行工具的妥协或权宜之计。
大多数文件的普通使用将继续在没有元数据的情况下工作,就像现在一样。
GNOME 中提供了许多文件元数据的标准属性。例如,“View”存储用于查看文件内容的操作;“Open”存储用于编辑的类似操作;“Icon”(包含图标)用于在桌面上显示文件。
元数据类型是 MIME 类型。
画布
GNOME 提供了一个 Canvas 小部件,仿照 Tk 出色的画布。此小部件简化了需要控制图形组件的应用程序的编程。GNOME 画布最引人注目的功能是它提供了一个无闪烁的绘图区域,可以在其中插入和操作高级对象。基本的缩放和滚动功能也是画布的一部分。
插入到画布中的高级对象的行为类似于常规小部件。它们可以接收 X 事件、捕获焦点并捕获鼠标,就像常规小部件一样。与 Tk 对应物一样,GNOME 画布项目可以在运行时使用类似 Tk 的配置机制更改其属性。
GNOME 画布附带了许多从 GnomeCanvasItem 对象派生的项目:线条、矩形、椭圆、箭头、折线和一个通用小部件容器,用于在画布中嵌入 GTK+ 小部件。画布框架被设计为非常可扩展。作为这种可扩展性的证明,GNOME 电子表格是在基本画布引擎之上实现的,电子表格特定的 CanvasItems 提供了附加功能。
请注意,当前的画布使用 Gdk 原语(Xlib 原语的薄包装器)进行绘制,因此它在可以提供的特殊效果的质量和范围方面受到限制,这使我们进入了画布技术的下一步。
Raph Levien 正在为画布开发高级渲染引擎。它最初是在他的 Type1 轮廓字体编辑器 gfonted 中作为独立小部件开发的。在撰写本文时,将引擎集成到画布的工作正在进行中。
此引擎的功能包括:
所有项目的抗锯齿渲染
Alpha 透明度
用于矢量和贝塞尔路径的项目
用于 RGB 和 RGB 加 Alpha 图像的项目
矢量操作,包括剪辑(相交)、并集、差集和笔画布局
PostScript Type1 字体加载和渲染
该引擎的设计目标是支持几乎所有 PostScript 图像模型,并添加 Alpha 透明度。因此,它有望成为功能强大的图形应用程序的绝佳起点。
尽管保持显示与完全抗锯齿和 Alpha 合成项目同步的目标雄心勃勃,但性能却出奇地好——实际上与基于 Xlib 原语的画布引擎相当。
他的代码预计很快将合并到主画布中。
窗口管理器独立性
GNOME 不依赖于特殊的窗口管理器——任何现有的窗口管理器都可以。GNOME 指定了窗口管理器提示,窗口管理器可以实现这些提示,以便为用户提供更好的桌面集成,但它们是可选的。E 窗口管理器实现了所有 GNOME 窗口管理器提示,可以用作希望扩展其窗口管理器以符合 GNOME 标准的人员的参考实现。ICEWM 管理器正在跟踪这些开发,也被认为是符合 GNOME 标准的窗口管理器,尽管目前它有点落后。一些人表示有兴趣向 WindowMaker 和 FVWM2 维护者提供补丁,以使这些窗口管理器了解 GNOME。
组件编程
从历史上看,UNIX 的吸引力之一在于小型工具的理念,每个工具都擅长做一件事,并使用管道和简单的 shell 脚本组合这些工具来执行更复杂的任务。当数据对象表示为纯文本且操作有效地是过滤器时,这种理念非常有效。然而,这种 UNIX 命令行理念无法很好地扩展到当今的多媒体对象世界。
因此,在 GNOME 中拥有一个框架来提供软件重用和组件插入和交互(即,连接小型专用工具来执行复杂任务)将是一件好事。有了这个基础设施,GNOME 应用程序可以再次回归 UNIX 简单、高度专业化的工具的根源。
然后需要一个 RPC 系统来提供这种功能,因此我们决定使用对象管理组织 (OMG) 的 CORBA(公共对象请求代理体系结构)。CORBA 可以被认为是一个面向对象的 RPC 系统,它恰好具有不同语言的标准化绑定。
CORBA 为我们打开了一系列应用程序。组件编程允许我们将程序和共享库打包为程序服务器,每个服务器都实现特定的接口。
例如,GNOME 邮件程序 Balsa 实现了 GNOME::MailMessage 接口,该接口使任何了解 CORBA 的程序都可以远程编写和自定义邮件消息的内容并发送它。因此,可以将邮件程序替换为任何实现 GNOME::MailMessage 接口的程序。就 GNOME 桌面而言,该进程只是实现了 GNOME::MailMessage 接口。这意味着,例如,我将能够继续使用 GNUS 阅读我的邮件,并将 GNUS 与桌面的其余部分完全集成。这也适用于 GNOME 系统中的其他组件:地址簿、文件管理器、终端模拟程序、帮助浏览器、办公应用程序等。
除了提供基本的 GNOME 接口外,应用程序还可以提供其特定于实现的特性的接口。这是通过使用 CORBA 的接口继承来完成的。特定接口将从更通用的接口派生而来。例如,GNUS 将实现 GNOME::MailMessage 接口,并使用 GNOME::GnusMailMessage 接口扩展 GNUS 特定的功能。这个接口理论上允许用户在 Lisp 级别自定义 GNUS,这是其他邮件程序可能无法做到的。另一个示例是 GNOME::MozillaMailMessage 接口,它将允许用户配置 Mozilla 邮件中的 HTML 渲染引擎。
CORBA 不仅解决了这些问题,而且还可以用作通用的进程间通信引擎。与其在两个程序需要通信时每次都发明一个新的临时进程间通信系统,不如使用 CORBA 接口。
Microsoft 通过其对象链接和嵌入架构普及了将文档嵌入到其他文档中。GNOME 正在为 GNOME 设计一个精神相似的文档嵌入模型(Baboon 模型),并且此模型中的所有进程间通信都以 CORBA 接口的形式定义。
最初,我们对 CORBA 为我们提供的可能性感到非常兴奋,但我们很快意识到在 GNOME 桌面中使用 CORBA 将比我们预期的更困难。
我们尝试使用 Xerox 的 ILU 来满足我们的 CORBA 需求。当时的许可证不允许我们修改代码并重新分发它们,这对自由软件社区来说是一件重要的事情,因此我们不得不寻找替代方案。Xerox 后来更改了许可政策。
在评估了各种免费 CORBA 实现之后,我们选择了 MICO,因为它是一个功能最全的免费实现。MICO 被设计为 CORBA 的教学工具,主要侧重于代码清晰度。
不幸的是,我们很快发现 MICO 不是适合 GNOME 需求的生产质量工具。首先,我们发现大量使用 C++ 模板(在 MICO 和 MICO 生成的存根中)被证明是资源消耗大户。即使对于 CORBA 的最简单用途,编译 GNOME 位也需要高达 48MB 的 RAM,这减慢了我们的开发速度。另一个问题是 MICO 仅支持 C++ CORBA 绑定。即使最初尝试提供 C 绑定,它们也是不完整的且维护不善。
为了解决这些问题,i2it 的 Dick Porter 和 Red Hat 实验室的 Elliot Lee 编写了一个基于 C 的、轻量级且快速的 CORBA 2.2 实现,称为 ORBit。一旦 ORBit 变得稳定,在延迟了将近八个月之后,CORBA 在整个 GNOME 中的使用就开始了。
有了高效、生产质量的 CORBA 实现的控制权,我们可以确保启用 CORBA 的进程间通信对应用程序程序员来说是一项有价值的服务,而不是开销和臃肿的来源。
工具包
GNOME 桌面应用程序构建在面向对象的 GTK+ 工具包之上,该工具包最初是作为 GNU 图像处理程序 (GIMP) 的 GUI 工具包而设计的。
GTK+ 是在称为 Gdk(GTK 绘图工具包)的简单窗口和绘图 API 之上实现的。Gdk 的初始版本是 Xlib 库周围的一个相当薄的包装器,但 Win32 端口和 Y 窗口系统的端口目前处于 alpha 阶段。
GTK+ 完全在 C 中实现了一个对象系统。这个对象系统功能非常丰富,包括经典单继承、动态创建新方法和类,以及用于动态将处理程序附加到用户界面中发生的各种事件的“信号”机制。GTK 的一大优势是提供了广泛的语言绑定,包括 C++、Objective-C、Perl、Python、Scheme 和 Tom。这些语言绑定提供了对 GTK+ 对象和以选择的语言编程的新对象的访问。
GNOME 的另一个功能是 Rasterman 的 Imlib 库。此库与 Gdk 一起实现,并为加载和保存图像以及在屏幕上渲染图像提供了快速而灵活的界面。使用 Imlib 的应用程序可以快速直接地访问 PNG、GIF、TIFF、JPEG 和 XPM 文件以及通过外部转换过滤器提供的其他格式。
支持库
基于 C 的 GNOME 应用程序使用 GLIB 实用程序库。glib 为 C 程序员提供了一组有用的数据结构:链表、双向链表、哈希表(一对一映射)、树、字符串操作、内存块重用、调试宏、断言和日志记录工具。glib 还包括用于动态模块工具的便携式接口。
GNOME 库
GNOME 库添加了工具包中缺少的组件,以创建完整的应用程序,制定一些策略,并帮助提供一致的用户界面以及本地化 GNOME 应用程序,以便它们可以在各个国家/地区使用。
当前的 GNOME 库包括 GTK+-Xmhtml、gnome-print、libgnome、libgnomeui、libgnorba、libgtop、gnome-dom 和 gnome-xml。其他库用于特定的应用程序:libPropList(即将被新的配置引擎取代)和 audiofile。
主要的非图形库称为 libgnome。它提供了用于跟踪最近使用的文档、配置信息、元数据处理(见下文)、游戏得分功能和命令行参数处理的功能。此库不依赖于窗口系统的使用。
由于我们使用 CORBA 来实现桌面集成的部分,因此我们有一个名为 libgnorba 库的特殊库来处理各种 CORBA 问题。它提供了 GUI/CORBA 集成(使我们的 GUI 应用程序充当服务器)、GNOME 框架内的身份验证和服务激活。
另一方面,gnomeui 库具有需要窗口系统才能运行的代码。它包含以下组件:
GNOME 会话管理支持
小部件,既作为 GTK+ 的直接扩展,又设计为依赖于 libgnome 功能
GTK+ 上原本不可用的一组标准对话框,与其他 GNOME 库良好集成
标准属性配置对话框
标准顶级窗口处理
多文档界面 (gnome-mdi)
窗口提示
在需要时集成 CORBA
GTK+-XmHTML 是 Koen D'Hondt 的 XmHTML 小部件 для Motif 的端口,用于满足我们的 HTML 显示需求。我们的更改正在被折叠回主发行版。
lib gtop 库允许系统应用程序轻松移植到各种操作系统;它提供系统、进程和文件系统信息。
gnome-xml 为 GNOME 应用程序提供 XML 文件加载、解析和保存功能,并用于 GNOME 电子表格 (Gnumeric) 和 GNOME 文字处理器程序中。gnome-dom 为 GNOME 应用程序提供万维网联盟文档对象模型的实现。当您阅读本文时,gnome-dom 将已广泛部署在 GNOME 办公应用程序中。gnome-xml 和 gnome-dom 均由万维网联盟的 Daniel Veillard 开发。
gnome-print 实现了 GNOME 的打印体系结构。它由可插拔的渲染引擎以及一组用于选择和配置打印机的窗口小部件和标准对话框组成。此外,gnome-print 负责管理轮廓字体,并包含自动查找系统上已安装字体的脚本。
GNOME 打印成像模型仿照 PostScript。基本操作包括矢量和贝塞尔路径构造、描边、填充、剪辑、文本(使用 Type1 字体,TrueType 字体即将推出)和图像。
目前,gnome-print 仅生成 PostScript 输出。但是,成像模型的设计与画布的抗锯齿渲染引擎紧密同步,预计这两个模块将很快互操作。特别是,可以将内容“打印”到画布中(对于提供高质量的屏幕预览很有用),并打印画布的内容。此功能应简化使用画布的应用程序的设计,因为支持打印几乎不需要额外的代码。
相同的渲染引擎将用于直接渲染打印页面,而无需经过 PostScript 步骤。对于为彩色喷墨打印机提供高质量、高性能的打印(即使是包含透明度、渐变和传统 PostScript 成像模型中被认为是“棘手”的其他元素的复杂页面)而言,此路径尤其令人兴奋。
绑定
GNOME 的一个明确目标是支持使用多种语言进行开发,因为没有一种语言对于每个应用程序都是理想的。为此,GTK+ 和 GNOME 库的绑定存在于许多流行的编程语言中,目前包括 C、C++、Objective-C、Perl、Python、Scheme 和 Tom。
Scheme、Tom 和 Perl 黑客早期参与 GTK+ 和 GNOME 项目,有助于使 GTK+ 和 GNOME API 易于为各种语言包装。多语言支持“内置”到 GTK+ 和 GNOME 的设计中,而不是作为事后添加的。
GNOME 由世界各地松散耦合的程序员团队开发。项目协调在各种 GNOME 邮件列表上完成。
GNOME 源代码保存在 GNOME CVS 服务器上 (cvs:cvs.gnome.org:/cvs/gnome/)。通过 Netscape 的 Bonsai 和 LXR 工具访问源代码在 http://cvs.gnome.org/ 上提供,以帮助程序员熟悉 GNOME 源代码库。
大多数为 GNOME 贡献了代码、重大错误修复和文档的开发人员都拥有 CVS 写入权限,营造了非常开放的氛围。GNOME 开发人员来自广泛的背景,并且拥有不同的技能和经验水平。经验不足的人的贡献非常有用,而年长、更明智的编码人员很乐意指导团队中较年轻的贡献者。GNOME 开发人员社区重视干净、可维护的代码。即使是具有多年编码经验的程序员也注意到参与 GNOME 项目如何帮助他们编写更好的代码。
随着 GNOME 基础库变得更加稳定,更大型的编程项目的开发成为可能,并允许小型开发团队将构成 GNOME 办公套件的应用程序组合在一起。
与其他 GNOME 组件一样,GNOME 办公套件目前正在赶上商业产品。通过提供一个可靠、快速且基于组件的办公套件,为 GNOME 项目编写的代码可能会成为自由软件程序开发新时代的基础。
办公套件利用了我们许多人在过去一年中开发各种 GNOME 组件时获得的许多知识。我们的编码标准更高,质量更好,代码更简洁、更健壮。
这些应用程序的可用性为我们提供了完成文档嵌入界面(Baboon 模型)所需的测试平台。
GNOME 正在进行两个文字处理项目:一个是 Hungry Programmers 的 Seth Alves 的 GWP,另一个是 Chris Lahey 的 Go。GWP 目前更先进,并且打印功能与 GNOME 打印体系结构配合使用。
Gnumeric,GNOME 电子表格项目,旨在提供具有高级功能的商业质量电子表格。它提供了舒适而强大的用户界面。与 GNOME 中的其他组件一样,我们致力于为未来的开发提供一个坚实且可扩展的框架。
最近,Achtung(GNOME 演示程序)的工作已经开始。它仍处于开发的早期阶段。
Miguel de Icaza 是 GNU Midnight Commander 的作者之一,也是 GNOME 的开发人员。他还参与了 Linux/SPARC 内核端口的工作。可以通过电子邮件 miguel@gnu.ai.mit.edu 与他联系。