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

gstreamer 专栏收录该内容
9 篇文章 0 订阅

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
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

Table of Contents Introduction I. Concepts Background Data types and programming Exporting a C API The Glib Dynamic Type System Copy functions Conventions Non-Instantiable non-classed fundamental types Instantiable classed types: objects Initialization and Destruction Non-instantiable classed types: Interfaces. Interface Initialization Interface Destruction The GObject base class Object instanciation Object memory management Reference count Weak References Reference counts and cycles Object properties Accessing multiple properties at once The GObject messaging system Closures C Closures non-C closures (for the fearless). Signals Signal registration Signal connection Signal emission The detail argument II. API Reference GType - The GLib Runtime type identification and management system GTypePlugin - An interface for dynamically loadable types GTypeModule - Type loading modules GObject - The base object type Enums and Flags - Enumeration and flags types GBoxed - A mechanism to wrap opaque C structures registered by the type system Generic Values - A polymorphic type that can hold values of any other type Parameters and Values - Standard Parameter and Value Types Varargs Value Collection - Converting varargs to generic values GParamSpec - Metadata for parameter specifications Signals - A means for customization of object behaviour and a general purpose notification mechanism Closures - Functions as first-class objects Value arrays - A container structure to maintain an array of generic values III. Tools Reference glib-mkenums - C language enum description generation utility glib-genmarshal - C code marshaller generation utility for GLib closures gobject-query - display a tree of types IV. Tutorial How To define and implement a new GObject? Boilerplate header code Boilerplate code Object Construction Object Destruction Object methods Non-virtual public methods Virtual public methods Virtual private Methods Chaini
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值