从GTK、GLib到GObject与GType历史梳理

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/
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值