1. KDE与GNOME
1.1 X Window System
微软Windows取得市场地位后,unix业界也急于开发类似的图形化操作系统。麻省理工学院(MIT)开始在UNIX系统上开发一个分散式的视窗环境X Window。
X Window使用X-Server作为Ui与系统交互的桥梁,UI不直接与系统交互,因此拥有很强的设计灵活性和可移植性,任何厂商都可以在X Window基础上开发出不同的GUI图形环境。但因此也决定了X Window不可能与操作系统系统高度整合,运行效率较低。由此有人想彻底开发一套适合unix的完善桌面环境,这就是KDE。
1.2 KDE
1996年10月,图形排版工具Lyx的开发者、一位名为Matthias Ettrich的德国人发起了KDE(Kool Desktop Environment)项目。KDE 1.0在1998年的7月12日正式推出。
其问题在于,KDE是在Qt平台的基础上开发, 但Qt是一个商业软件,目前是有三种授权方式, 但是未来说不准会变动. 因此可能受制于人并产生授权风险。一部分开发者想要摆脱这一点风险,创造一个自由的桌面环境。由此产生两种解决方案,一种是开发Harmonny来替代Qt库,而另一路则直接发起GNOME项目,从头开始做。
1.3 GNOME
GTK和QT比较类似, 用于跨平台的图形界面开发工具包. 不同的是, GTK是LGPL协议, 因此在开源领域更受青睐.
GNOME 项目于1997年8月发起,选择GTK图形界面库为基础,因此我们也一般将GNOME和KDE两大阵营称为GNOME/GTK,以及 KDE/Qt。
虽然在实现上面有分歧,但至少大家追求的目标是基本一致的。KDE与GNOME目前也相互支持——只要你在KDE环境中安装GTK 库,便可以运行GNOME的程序,反之亦然。
2. GTK
GTK (GIMP ToolKit) 是一个小部件工具包。GTK创建的每个用户界面都由称为小部件的UI元素组成。GTK是事件驱动的。原本只是 GIMP 开发过程中用来管理图型界面的一套工具程序库,后来发展成为最受欢迎的用于图形交互界面(GUI)设计的工具包。
GTK本身主要包含GLib和GTK+两个部分, 也借助其它公共库实现额外的系统功能.
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 來完成的。
2.1 GTK生态
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语言的对象系统,带有信号槽功能
2.2 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和信号
2.3 GStreamer
GStreamer是在GLib基础上的插件化多媒体处理架构,但GStreamer是一个独立的项目。因此GStreamer可以直接使用GObject的基础功能,比如创建和注册对象,编写属性和信号槽函数。
但GObject有基于多媒体本身的特性定义,比如总线、管道、状态和事件等。
官方资料
- https://www.gnome.org/
- https://www.gtk.org/
- https://docs.gtk.org/glib/index.html
- https://docs.gtk.org/gobject/
- https://gstreamer.freedesktop.org/