介绍 GTK+ 2
在深入研究下一代 GTK+ 之前,您或许想知道什么时候可以指望 GNOME 2 可用于产品。GNOME 2 预定在 2002 年 2 月 15 日发行;如 Gnumeric 和 Evolution 等较大的应用程序将在稍后被移植到 GNOME 2。
好了,让我们开始探讨 GTK+!最初,开发 GTK+ 是为在 Gimp 中使用(GTK 表示 Gimp ToolKit)。GTK+ 目前可在许多平台(包括 Linux 和 Windows)上使用。许多自由的软件项目(包括 GNOME 本身、Mozilla、Gimp 以及许多其它项目)都使用它。
就象 GTK+ 1 一样,GTK+ 2 依赖于 GLib,它是 C 开发者的便利库。GLib 包含许多能使您的编程工作变得更加容易的好功能,包括对象系统和诸如散列表、列表和树之类的数据结构。
GTK+ 2 还依赖于 ATK 和 Pango。ATK 是可访问性工具箱(Accessibility Toolkit),它能使残障人士使用 GTK+ 应用程序。Pango 是显示国际化文本的框架。稍后,本文将描述这两个软件包。
安装 GTK+ 2
要想充分利用本文,我们建议您安装 GTK+ 2 并运行它。要安装 GTK+ 2, 首先应该确保您的系统上安装了 pkg-config 0.8 或更高版本。所有主要的分发版(distribution)都应该有一个提供 pkg-config 的软件包。当然,GTK+ 2 还依赖于外部库,如 glib、atk 和 pango。在 GTK+ 2 编译之前,必须先安装这些库。 通常,最好的方法是先下载最新版本的 glib、atk、pango 和 gtk+ 源代码 tar 压缩包(请参阅本文后面的参考资料)。 在里面您可以看到最新的“vx.y”目录,当前是“v1.3”。
您可能会感到奇怪:我们花了所有时间都在谈论 GTK+ 2,但还是建议您安装 GTK+ 1.3。 这是因为,在编写本文时,GTK+ 1.3.11 是最新可用的 GTK+ 版本。一旦 GTK+ 完全准备好用于产品时,就会发行 GTK+ 2.0。在此之前,将 GTK+ 1.3 用于测试是没问题的,因为它几乎包括了所有将出现在正式 GTK+ 2.0 发行版中的新功能部件。
好了,既然我们已经解释清楚,就该重新回到安装新的 GTK+ 的话题了。 因为 GTK+ 2 有几个构建时相关性,所以首先应该安装 glib,然后安装 atk、pango 和 gtk+,这个安装次序是很重要的。 如下安装每个软件包:
清单 1. 安装 GTK+ 和支持库源代码
tar xzvf package-version.tar.gz
cd package-version
./configure
make
make install
一旦安装完所有软件包,就应该能够启动 gtk-demo, 这是一个很棒的小程序,它使您可以看到 GTK+ 2 在运行。
那么,GTK+ 2 中有哪些新功能呢?许多用户一直要求 GTK+ 具有使用抗锯齿字体的能力。 现在,这一功能部件已被添加到 GTK+ 2。GTK+ 2 字体抗锯齿处理是通过使用 Xft 库和 XRender 扩展(它是 XFree86 4 和更高版本的一部分)实现的。
要使 GTK+ 2 应用程序启用抗锯齿字体,只要设置环境变量 GDK_USE_XFT=1。 从 GDK_USE_XFT 设置为 1 的 shell 启动的所有 GTK+ 2 应用程序都应该显示抗锯齿字体文本。 如果愿意,请启用抗锯齿文本,然后再次运行 gtk-demo。
使用抗锯齿字体文本的对话框示例
双倍缓冲和图像处理
字体抗锯齿处理不是 GTK+ 2 中唯一的图形改进;GTK+ 现在使用双倍缓冲来更新屏幕。 由于没有双倍缓冲,所以当重新绘制或调整大小时,GTK+ 1 应用程序有时会闪烁。GTK+ 2 不再有这种问题, 所以新的 GTK+ 2 应用程序的显示将更加平稳。
不仅外观漂亮了许多,GTK+ 2 还根据开发人员的希望提供了许多改进。 例如,GdkPixbuf(以前是一个单独的库)现在是 GTK+ 的一部分。GdkPixbuf 以多种格式(如 GIF、PNG、JPEG、BMP 等等)处理图像的装入和保存。既然 GdkPixbuf 已经是 GTK+ 的一部分了,那么 GTK+ 本身也可以利用它,使用它来绘制菜单、工具栏和按钮的阿尔法混合图标(alpha blended icon)。
这里是装入一个称为 gnome.png 的小位图图像的样本 GTK+ 2 程序:
在样本程序中,我们使用 gtk_image_from_new_file() 函数创建 GtkImage 对象。GtkImage 对象通过内部使用 GdkPixbuf 来自动装入图像:
清单 2. 使用 GtkImage 对象来显示图像
#include
int
main (int argc, char **argv)
{
GtkWidget *window;
GtkWidget *image;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (G_OBJECT (window), "destroy", gtk_main_quit, NULL);
image = gtk_image_new_from_file ("gnome.png");
gtk_container_add (GTK_CONTAINER (window), image);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
这里是如何编译这个简单程序:
gcc `pkg-config --cflags --libs gtk+-2.0` -o image-button image-button.c
一旦编译完,接着请执行 ./image-button。这是您应该看到的:
Pango
Pango 是新的用于国际化文本的布局和显示的全功能框架。 感谢 Pango,GTK+ 2 现在对于那些不居住在美国或欧洲的用户更为有用了。Pango 可以处理以非从左到右方向排列的文本,并且可以容易地管理复杂语言, 甚至还可以处理根据使用环境而采用不同形式的信函。
Pango 支持双向文本,所以您可以将从左到右的文本和从右到左的文本混合编排;还有用于确定各种复杂文本(如阿拉伯语和泰米尔语)形状的插件。Pango 不仅仅是国际化;Pango 库在 Xft 和 XRender 扩展的帮助下处理抗锯齿字体文本的显示。有关更多的详细信息,请阅读两篇有关 Pango 的 developerWorks 文章(请参阅参考资料)。
Unicode 和 UTF-8
在 GTK+ 2 中,传递到 gtk_*() 函数的任何字符串都应该是 Unicode UTF-8 编码形式。 由于内部使用 UTF-8,GTK+ 2 完全消除了 GTK+ 的先前版本中的国际化问题。
因为 ASCII 是 UTF-8 的子集,所以这个更改不会象您想象的那样影响现有的 GTK+ 代码。然而,当 ASCII 直接映射到 UTF-8 后,就不能逆向映射了。许多非英文字符集在以 UTF-8 编码时每个字符占据多个字节。为了处理大于正常字符编码的情况,当需要迭代 UTF-8 字符串形式的字符时, 应该使用称为 g_utf8_next_char() 的特殊函数(实际上,它是一个宏)。 这个宏将根据需要,确定是采用小字节还是大字节“跳跃(hop)”。这里是一个小示例,我们要验证和迭代一个 UTF-8 字符串:
清单 3. 验证和迭代一个 UTF-8 字符串
gchar *p;
g_return_if_fail (g_utf8_validate (str));
p = str;
while (p) {
gunichar c = g_utf8_get_char (p)
/* Do something with c. */
p = g_utf8_next_char (p);
}
如果需要将一个本地语言编码的字符串转换成 UTF-8,可以使用:
清单 4. 将本地语言编码的字符串转换成 UTF-8
gchar* g_locale_to_utf8 (const gchar *opsysstring,
gssize length,
gsize *bytes_read,
gsize *bytes_written,
GError **error);
如果不想知道读写了多少字节,则最后三个参数可以是 NULL。 如果正在将以 NULL 结束的字符串传递到这个函数,则将长度设置为 -1;例如:
utf8_string = g_locale_to_utf8 (locale_string, -1, NULL, NULL, NULL);
Atk,可访问性工具箱
现在,GTK+ 2 充分利用 ATK(可访问性工具箱(Accessibility Toolkit))。ATK 使残障人士(如视力低下或行动不便)与 GTK+ 2 应用程序交互成为可能。在今后的文章中, 我们将更详细地讨论 ATK 并向您演示如何使残障人士可以访问您自己的应用程序。 同时,您也可以访问 GNOME“可访问性项目(Accessibility Project)”(请参阅参考资料)。
固定项(stock item)
GNOME 1 和 GNOME 2 都支持“固定项”,使开发人员十分容易地将通用菜单项和按钮添加到他们的应用程序中。 因为固定项是全局定义的,而不是在应用程序内部定义的,所以它们能很容易地为所有 GNOME 应用程序提供统一的外观。
通常,一个单独的固定项由一个图标、一个文本标签和一个可选的快捷键组成。 除了给予应用程序一个统一的外观外,固定项还给国际化提供了很大的帮助, 因为只需要将它们转换一次(在 GTK+ 库中),而没有需要由开发人员自己转换的特定于应用程序的数据。对于 GNOME 2 平台,固定项支持已经从 gnome-lib 移到 GTK+,使更多的应用程序具有一致外观成为可能。
这里的示例代码片段用于创建一个具有软盘图像和“Save”标签的按钮:
清单 5. 创建一个具有软盘图像和“Save”标签的按钮
GtkWidget *button;
button = gtk_button_new_from_stock (GTK_STOCK_SAVE);
这里的屏幕快照显示了一个使用四个固定项的工具栏:
使用四个固定项的工具栏
在菜单项中也可以使用固定项,如下所示:
清单 6. 创建一个具有软盘图像和“Save”标签的菜单项
GtkWidget *menu_item;
menu_item