GTK+
2010-09-24 15:09:28 阿炯

GTK(GIMP Toolkit)+最初作为另一个著名的开放源码项目 -- GNU Image Manipulation Program (GIMP) 的副产品而创建的。在开发早期的 GIMP 版本时,Peter Mattis 和 Spencer Kimball 于1998年4月创建了GTK(它代表 GIMP Toolkit),作为 Motif 工具包的替代,后者在当时不是免费的(当这个工具包获得了面向对象特性和可扩展性之后,才在名称后面加上了一个加号,但在2019年2月又正式更名去掉了加号。



GTK 是一套跨多种平台的图形工具包,最初为 GIMP 而开发,GIMP 是指 GNU 图像处理程序,其拥有几乎所有图象处理所需的功能,号称 Linux 下的 PhotoShop。GTK 后来发展成为 Linux 下开发图形界面应用的主流开发工具。它使用C语言开发的一种图形用户界面(GUI)工具包。也就是说,它是一个库或者是若干个密切相关的库的集合,它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。其实质上是一个面向对象的应用程序接口 (API),尽管完全用 C 写成的,但它是基于类和回调函数(指向函数的指针)的思想实现的。GTK使用C语言开发,但是其设计者使用面向对象技术。也提供了C++(gtkmm)、Perl、Ruby、Java和Python(PyGTK)绑定,其他的绑定有Ada、D、Haskell、PHP和所有的.NET编程语言。与其他很多部件工具箱不同,GTK并不基于Xt。

GTK+依赖于以下库:
GLib 是一个多方面用途的库,不仅仅针对图形界面。还提供了有用的数据类型、宏、类型转换,字符串工具,文件工具,主循环抽象等等。
GObject 是一个提供了类型系统、包括一个元类型的基础类型集合、信号系统的库。
GIO 是一个包括文件、设备、声音、输入输出流、网络编程和DBus通信的现代的易于使用的VFS 应用程序编程接口。
Cairo Cairo 是一个支持复杂设备输出的2D图形库。
Pango Pango 是一个国际化正文布局库。它围绕一个表现正文段落的PangoLayout object。Pango提供GtkTextView、GtkLabel、GtkEntry和其他表现正文的引擎。
ATK ATK 是一个友好的工具箱。它提供了一个允许技术和图形用户界面交互的界面的集合。例如,一个屏幕阅读程序用ATK去发现界面上的文字并为盲人用户阅读。GTK+部件已经被制作方便支持ATK框架。
GdkPixbuf 是一个允许你从图像数据或图像文件创建GdkPixbuf("pixel buffer")的小的库。用一个GdkPixbuf与显示图像的GtkImage结合。
GDK GDK 是一个允许GTK+支持复杂图形系统的抽象层。GDK支持X11、Windows和OS X的图形系统工具。
GTK+ 是GTK+库本身包含的部件,确切的说是GUI零件,比如GtkButton或者GtkTextView。


名为 GLib 的第三方组件,包含一些标准函数的替代函数,以及一些处理链表等数据结构的函数等。这些替代函数被用来增强GTK的可移植性,因为它们所实现的一些函数在其它 Unix 系统上未实现或不符合标准,比如 g_strerror()。一些是对 libc 的对应函数的增强,比如 g_malloc() 具有增强的调试功能。最初GTK包括一些和图形无关的常规功能,如上面提及的链表和二叉树等数据结构。这些基本功能和对象系统GObject已经合并到独立的库Glib,它被程序员专门用于开发不需要图形界面的代码库中。

Glade是一个界面设计工具,但是它也包含了一种描述GUI界面的XML语言,它和libglade一起工作就可以直接使用GTK和GNOME控件;新的Glade-3不再直接支持生成编程语言源代码。

GTK总的来说比较容易的,基本上会C语言就能轻松上手C语言绑定的GTK。个人并不觉得在Linux上有比GTK更好的C语言的图形库。GTK和Qt是Linux中绝对的主力图形库,当然Qt是C++的绑定且其背后的公司发展多变,所以强烈建议用GTK开发。在GTK的官方网站看developer guide,基本上看几个简单的demo就能入门GTK+了,然后自己学着写点小程序,碰到要调用API的时候去GTK网站查找其手册页;另外建议多用Glib库,这样方便跨平台开发,而且Glib库中有很多优秀的函数,之前学C/C++碰到的需要自己写的函数可能在Glib中都有相应的函数供直接调用了。

学习GTK需要C语言和一定的面向对象编程知识,虽然GTK采用C开发,但却是一个面向对象的系统,其底层采用了C实现的GObject对象系统。Linux下的图形界面库有GTK+,QT和wxWidgets,并且它们都是跨平台的。采用GTK+开发Linux图形界面也有许多的其他的语言可供选择,因为它被绑定到了很多其他的语言上,如c,vala,perl,rust,javascript,python等。

GTK 2

2002年3月11日,GTK2.0版正式发布。GTK 2是GTK后继版本,也是一个具有里程碑意义的版本,其新特性包括使用Pango改进的文本渲染、新主题引擎、使用ATK改进的可达性、完全转换到使用UTF-8的Unicode和更灵活的API。但是它和GTK 1不完全兼容,因此必须由程序员做移植工作;由于GTK 1更快、相对更简单或更加适合嵌入式应用,所以还被继续使用。从GTK 2的2.8版起,它依靠程序库Cairo完成渲染,而这引入了矢量图形的支持。

GTK 3

于2011年2月正式发布,GTK 3 引入了 CSS 样式表来自定义组件的外观。开发者可以使用 CSS 样式表来定义组件的颜色、字体、边框、背景等属性。其CSS样式表语法与 Web 开发中的 CSS 类似,提供了灵活、强大的样式控制能力。


优点

不论开发的需要是什么,GTK+ 可能就是您正在寻找的答案。GTK+ 提供了许多东西:
* 它既现代,而且得到了积极的开发与维护,围绕它有一个充满活力的社区,且开发积极。
* 它提供了广泛的选项,用于把工作扩展到尽可能多的人,其中包括一个针对国际化、本地化和可访问性的完善的框架。
* 它简单易用,对开发人员和用户来说都是这样。
* 它的设计良好、灵活而可扩展。
* 它是自由软件,有一个自由的开放源码许可。
* 它是可移植的,从用户和开发人员的角度都是这样。

GTK最早应用于X Window System,如今已移植至其他平台,诸如Microsoft Windows、DirectFB,以及Mac OS X平台上的Quartz。

使用GTK的桌面环境

GNOME是以GTK为基础,就是说为GNOME编写的程序使用GTK做为其工具箱。
Xfce也基于GTK,但是它的应用程序并不对很多其他程序有依赖。(这就是"GNOME程序"和"GTK程序"的不同)
LXDE也基于GTK,一个尽可能减少包相依性的桌面环境。但因为v3.0的那些糟心的变化,转向了QT并开发新的桌面环境LXQt

这只是一部分,GTK也可以运行在KDE的环境下;而且GTK也可以在Microsoft Windows运行,另外还有DirectFB和ncurses。

使用GTK的窗口管理器

Metacity和Xfwm4使用GTK 2。

GTK应用程序

以下程序都是使用GTK开发、属于开源软件,可以运行于Linux/Unix,Windows,macOS等多种操作系统平台上:
Firefox-Mozilla基金会的网页浏览器
Geany-代码编辑器
GIMP-类似于Photoshop的图像处理程序
Inkscape-类似于Illustrator、CorelDraw的矢量图形绘制工具
Pidgin-支持多种协议(IRC、Gtalk、Yahoo Talk、MSN等等)的聊天工具
gcin-一种在Linux、Windows系统上常见的输入法平台


国际化、本地化和可访问性

在创建要让所有人使用的软件的时候,请记住三个关键字:国际化、本地化和可访问性(通常分别缩写为 i18n、l10n 和 a11y)。国际化是将程序准备为被母语不是开发应用程序所采用的语言的人使用的过程,所以应用程序不依赖于对任何特定语言的任何假设。i18n 远远不只是对程序使用的文本进行翻译。它还意味着要考虑所使用的不同脚本和字母表、不同的编写方向、显示许多语言所需要的特殊处理以及为用户提供输入文本的适当方法。不是每种语言都可以简单地把每个字母映射到键盘上的不同键,而且还必须实现更好的复杂性,例如确保在错误消息中使用正确的复数。

本地化与i18n密切相关,因为为国际用户准备应用程序不仅仅是改变语言。程序还必须能够理解并尊重日期、货币显示、数字标注、文本排序所使用的不同习惯,以及许多可能不太注意的细节之处 —— 例如有些符号的使用,在世界的不同地方可能会被认为是不恰当的或无礼的。正像 i18n,正确的 l10n 要求在代码中添加很多东西,而这些是事后很难轻松加入的。GTK+ 提供了针对 i18n 和 l10n 的恰当工具,会让代码(和二进制)可以在许多语言和地域上不加修改地运行。切换地域所需要的就是随操作系统(针对 l10n)或者一个可独立于实际的程序进行处理和发布的翻译文件(针对 i18n)一起发布的一组数据。带来的灵活性会得到开发人员、翻译者和用户的热爱。

可访问性

是让每个人都可以使用这些程序。有些用户的视力不佳,有些人可能不能用键盘或鼠标,而有些人可能只能移动他们的眼睛。要确保每个想使用您的应用程序的用户都能使用,需要做许多工作。幸运的是,GTK+ 提供了一个途径,可以通过一个完善的预先存在的 a11y 框架,立即得到这方面的支持,而您这边几乎什么工作也不需要做。使用这个框架(它是UNIX® 系统上的事实标准),可以把应用程序带给各类用户。GTK+在这三个领域都有优秀的支持。这个支持绝不完美,但在同类软件中是最好的,而且把这些关键字整合进应用程序的重要性并没有提到应有高度。在今天的世界中,计算机无处不在,用户众多而且独特,所以不能认为一个遗漏一整群用户的应用程序是一个完整的产品。

简单易用

这一点应当很明显,但是它实际上含义丰富。工具包对用户应当容易,这样才有可能创建简单的、直觉的和乐于使用的界面,哪怕针对的是新手。创建人机交互的正确模型不是一项简单的任务,GTK+ 正是长时间工作的结果,而且是众多的甚至困难的决策的结果。GTK+ 对于开发人员也易于使用。它允许开发人员用简单的方式说出自己想要的东西,不会用所谓正规方式给开发人员带来负担,这些正规方式是计算机为了弥补它们固有的缺乏想像力的缺陷而施加给人类的负担。

设计良好、灵活和可扩展

编写GTK+的方式允许在不改变基本设计的情况下,让维护人员添加新功能、让用户利用新功能。工具包也是可扩展的,这意味着可以向其中添加自己的块,并用使用内置块一样的方式使用它们。例如,可以编写自己的控制元素,比如说用于显示应用程序处理的科学数据,并让它正确地遵照用户选择的显示风格,就像 GTK+ 自身的控件那样。更进一步来讲,GTK+ 是可定制的,这样就可以让它适应自己的需求。它有一个系统,可以在所有应用程序之间复制设置,包括主题的选择。主题是一组一同发布的定制设置,会影响 GTK+ 使用的基本控件看起来的效果,甚至某种程度上的行为方式。使用主题可以模拟另一个操作系统的观感。

带有自由开放源码许可的自由软件

自由软件意味着每个人不仅可以自由地获得和使用这个工具包,还可以在满足某些条件的情况下修改并重新发布它。自由开放源码许可意味着这些条件不是严格限制的,可以得到的自由程度是显著的。最重要的是,GTK+ 采用了 Lesser General Public License (LGPLv2.1) 许可,这是 GNU 许可家族中一个不太严格的许可。LGPL 允许自由地获取、修改和发布它覆盖的任何软件,只要对修改也保持自由即可。LGPL 还允许任何人使用该库提供的功能,而不要求用户公开应用程序代码(这对于许多工业应用来说很重要,因为由于以前的协议或许可,这种场合下一般不希望公开代码或者公开代码是显然不现实的)。使用 LGPL 许可,您既可以是开放源码社区的好伙伴也可以是好公民。

可移植

最后(但并不是最不重要),GTK+ 是可移植的,这意味着用户可以在许多平台和系统上运行它。另一方面,开发人员可以把软件提供给众多用户,却只要编写一次程序,还可以使用许多不同的编程和开发平台、工具和编程语言。所有这些都可以理解为更多的潜在用户,您可以利用更好地满足需求的更广泛的技能和工具。

所有这些优势组合在一起,让 GTK+ 成为软件开发的坚实基础。使用它就能够把注意力集中在解决实际问题上,而不必重新发明轮子,而且也可以确信创建的应用程序会按照用户预期的方式运作、解决他们的问题,而不必创建新的应用程序。

版本历史
主要版本发布日期主要增强最后次要版本
1.01998年4月14日第一个稳定版本1.0.6
1.21999年2月27日新增部件(GtkFontSelectorGtkPackerGtkItemFactoryGtkCTreeGtkInvisibleGtkCalendar、GtkLayoutGtkPlugGtkSocket1.2.10
2.02002年3月11日GObject, UnicodeUTF-8)支持2.0.9
2.22002年12月22日Multihead support2.2.4
2.42004年3月16日新增部件(GtkFileChooser、GtkComboBox、GtkComboBoxEntry、GtkExpander、GtkFontButton、GtkColorButton)2.4.14
2.62004年12月16日New widgets(GtkIconView, GtkAboutDialog, GtkCellView).
最后一个支持Windows 98/Me的版本
2.6.10
2.82005年8月13日Cairo integration2.8.20
2.102006年7月3日新增部件(GtkStatusIcon、GtkAssistant、GtkLinkButton、GtkRecentChooser)以及打印支持(GtkPrintOperation)2.10.14
2.122007年9月14日GtkBuilder2.12.12
2.142008年9月4日Jpeg2000 load support2.14.7
2.162009年3月13日New GtkOrientable, Caps Lock warning in password Entry.
Improvement on GtkScale, GtkStatusIcon, GtkFileChooser.
2.16.6
2.182009年9月23日New GtkInfoBar. Improvement on file chooser, printing.
GDK has been rewritten to use 'client-side windows'
2.18.9
2.202010年3月23日New GtkSpinner and GtkToolPalette, GtkOffscreenWindow. Improvement on file chooser,
keyboard handling, GDK.Introspection data is now included in GTK
2.20.1
2.222010年9月23日gdk-pixbuf moved to separate module, most GDK drawing are based on Cairo,
many internal data are now private and can be sealed in preparation to GTK3
2.22.1
2.242011年1月30日New simple combo box widget (GtkComboBoxText) added, the cups print backend can send print jobs as PDF,
GtkBuilder has gained support for text tags and menu toolbuttons and many introspection annotation fixes were added
2.24.0
3.02011年2月10日Cairo, more X11 agnostic, XInput2, CSS-based theme API.从3.0版开始支持使用类似CSS的语法编写的主题?3.0.0

2019年2月,经过广泛讨论,GTK+ 团队决定将项目名中的加号“+”移除,重命名“GTK+”为“GTK”。

在脱离 GIMP 源码树并加入 GLib 和 GTK 类型系统等项目之后,为了与原来版本区分开,项目名加上了加号“+”,变成“GTK+”,而现在在经过一系列讨论之后,项目团队决定将“+”去掉。宣布改名的公开信中表示,“GTK+”中的“+”给新手和专家都造成了困惑,人们还会因此加入到错误的 IRC 频道,维基上的网址也十分丑陋。现在是时候跟“+”说再见了,其中还透露项目的下个大版本将被称为 GTK 4。


GTK采用较传统的C语言,C本身不支持面向对象设计,因此GTK开发了一套基于C语言的对象系统。这样的复杂性是不言而喻的,使用起来也不如C++方便,因此GTK还定义了一堆宏来协助面对象系统的编写。但其优势在于方便移植,灵活性高,不需要引入一套新的标准语言。因此仍然一直被沿用至今。GTK+和GLib都是GTK团队自己开发的,依赖一系列通用工具库:

GLib
构成GTK基础的底层核心库。它为C语言提供了数据结构处理,为事件循环、线程、动态加载和对象系统等运行时功能提供了可移植性包装器和接口。

Pango
一个用于文本布局和呈现的库,强调国际化。它是GTK文本和字体处理的核心。

Cairo
一个2D图形库,支持多种输出设备(包括X Window System, Win32),同时在所有媒体上生成一致的输出,支持显示硬件加速。

GDK (GIMP Drawing Kit)
主要负责和 X Window 的程序库做低层的沟通. 它也提供较为简化的程序界面給 GTK 使用。 其中几乎所有绘图功能都是透过 GDK 來完成的。

GTK生态

GTK直接或通过各种依赖关系为应用程序开发提供了一个完整的平台,可以看到一系列的依赖库:

显示与UI
GTK — 用于图形界面的小部件工具包
GDK — 窗口系统的低级抽象
GSK — 低级场景图和3D渲染的API
Pango — 多国文字渲染,具有完整Unicode支持
Cairo — 2D,基于矢量的高质量图形绘制
ATK — (仅GTK3支持)实现对屏幕阅读器和其他工具的支持可访问性工具包

用户数据存储
GSettings — 为应用程序首选项配置存储空间

文件访问
GFile — 文件和URI处理,异步文件操作,卷处理

网络
GNetworking — 网络和套接字
Soup — 带有cookie、SSL和XML-RPC的异步HTTP库

多媒体
GStreamer — 播放、混音和音视频处理
GdkPixbuf — 图标和其它图形资源的加载

IPC 进程间通信
D-Bus — 进程间通信总线,为其他进程提供api
Polkit — 通过D-Bus提供的系统级服务,提供访问控制

异步任务
GTask – 可取消的同步异步处理

应用支持
GApplication — 应用编写

C实用工具库,和对象系统
GLib — C语言数据结构和工具
GObject — 基于C语言的对象系统,带有信号槽功能

GLib
GLib是一个通用的、可移植的实用程序库,它提供了许多有用的数据类型、宏、类型转换、字符串实用程序、文件实用程序和主循环抽象等等。

GObject
GLib提供的一个轻便的对象系统,实现C语言的面对像编程。

GType
提供了一个面向对象的类型系统,可以在运行时动态注册类型。GType 是GLib 运行时类型认证和管理系统。GType API 是GObject的基础系统,所以理解GType是理解GObject的关键。Gtype提供了注册和管理所有基本数据类型、用户定义对象和界面类型的技术实现。

GValue
Generic Value,泛型。对数据类型的抽象,面对一个标准的容器或者函数集,比如链表或者map,不依赖具体的数据类型,实现统一的定义。

注意:在运用任一GType和GObject函数之前必需运行g_type_init()函数来初始化类型系统。

为实现类型定制和注册这一目的,所有类型必需是静态的或动态的这二者之一。静态的类型永远不能在运行时加载或卸载,而动态的类型则可以。静态类型由g_type_register_static()创建,通过GTypeInfo结构来取得类型的特殊信息。动态类型则由g_type_register_dynamic()创建,用GTypePlugin结构来取代GTypeInfo,并且还包括g_type_plugin_*()系列API。这些注册函数通常只运行一次,目的是取得它们返回的专有类的类型标识。

由于使用C模拟面对象编程非常复杂,很多代码比较琐碎难以理解。为了降低开发难度,定义了很多的宏,来实现的扩展。

在GStreamer插件开发中,很多时候就直接使用模板来创建新的类型,然后修改自定义的部分。需要参考如下的子系统:
GObject对象系统、GType类型系统、GObject 设计思想、GObject和信号。

GStreamer是在GLib基础上的插件化多媒体处理架构,但GStreamer是一个独立的项目。因此GStreamer可以直接使用GObject的基础功能,比如创建和注册对象,编写属性和信号槽函数。GObject有基于多媒体本身的特性定义,比如总线、管道、状态和事件等。


最新版本:3.6
该版本实现了 gtk-primary-button-warps-slider 设置,可控制不同平台缩放和滚动,修复了一些小 bug。

最新版本:4.0
2020年12月17日,负责发布工作的 GTK 团队成员 mclasen 感慨道:“2020年是漫长的一年,没有比用大版本更新来告别2020的更好方式了,所以 GTK 4.0 今天正式发布”。自2016年11月发布 GTK 3.89.1 以来,GTK 开发者为项目添加了 18000 多个提交,并发布了 20 多个开发版本。因此 GTK 4.0 是一个凝聚了大量开发者时间和精力的重要版本。开发团队表示,目前 GTK 4.0 已处于稳定阶段,GTK 3 在“可预见的未来”将会继续维护和更新,而 GTK 2 即将 EOL,计划在未来几天发布一个最终的 2.x 版本,此后不再受支持。因此建议开发者将 GTK 2 应用程序移植到 GTK 3 或 4。GTK 4.0 部分更新亮点:
新的 widget 小部件以及对现有元素的重新设计
集成媒体播放支持
改进 GPU 加速功能(比如使用新的 Vulkan 渲染器)
更好的 macOS 支持
改进数据传输功能
对着色器的重大改动
Vulkan 之外的 OpenGL 渲染改进
更好的 Windows 支持,更多详情查看发行公告

最新版本:4.2
GTK 4.2 已于2021年3月末发布,更新内容包括修复错误、改进 API,以及添加新功能。例如增加了新的 GL 渲染器;改进 GTK Toolkit 处理组合键和死键序列的方式; 改进构建系统,以便在 Windows 和 macOS 上编译 GTK;以及一个全新的 API 参考,它由语言绑定也使用的相同内省数据 (introspection data) 生成。新增的渲染器是 "NGL" OpenGL 渲染器,并在 Linux、macOS 和 Windows 平台上默认使用,旧的 OpenGL 渲染器暂时还在维护,可以通过环境变量覆盖 (GSK_RENDERER=gl) 来启用。

GTK4 NGL 渲染器在移动和桌面系统上有不错的性能表现,同时开发者还在继续努力优化以提供更多的功能和性能。另外在性能方面,从用于渲染内容的 GLSL 着色器到按需创建的可访问性对象,性能都得到了全面提升。另外还改进了输入处理、可移植性和构建系统功能,以及改进 GTK4 文档,更好的 Wayland 输入方法协议支持,改进滚动性能,增强文本的亚像素 (sub-pixel) 定位等。更多详情查看发行公告

GTK 4.11.1 于2023年4月上旬发布,该版本最重要的是引入了对 Wayland 分数缩放的初始支持,可通过 GDK_DEBUG=gl-fractional 环境变量激活。此外还优化了一些内容,比如对新的 GtkListView 小部件:修复了长期存在的滚动错误;更好的键盘导航,具有可自定义的选项卡行为;对焦控制,程序化滚动。对 GTK 的 OpenGL 渲染器也提供更好的纹理支持,比如添加了对人为限制纹理大小的支持(使用 GSK_MAX_TEXTURE_SIZE 环境变量)。

2023年8月上旬发布的GTK 4.12 为其 Vulkan 后端带来了许多改进,为列表部件添加了 "scroll_to" API,改进 Flatpak 包内的字体渲染,添加了 GTK4 渲染节点工具,以及其他各种修复和更新。针对 Vulkan 后端的改进包括添加管道缓存、渐变和其他各种更小的全面改进。在 GTK 4.12 开发周期中,GTK4 在 Vulkan 渲染方面的持续工作似乎是最重要的变化。还包括部分针对 Wayland 的工作,比如修复手写笔按钮的行为和支持悬浮窗口状态。详情查看发行说明

根据此前的计划,GTK5 将在 4.12 发布后启动。


官方主页:http://www.gtk.org/
该文章最后由 阿炯 于 2024-08-18 21:29:50 更新,目前是第 3 版。