[Feelings & Sharing] 【水】一些GNOME/GTK系开发工具的简介和学习资源
Tofloor
poster avatar
enforcee
deepin
2022-04-16 00:59
Author

因为太零碎了不好找所以来写个合集

blush

先占个帖慢慢更新,欢迎补充

Reply Favorite View the author
All Replies
enforcee
deepin
2022-04-16 01:52
#1

1.GObject

GNOME一切组件基石中的基石,设计很厉害用着很糟心的代表之作。众所周知C语言是个不“面向对象”的语言,为了改进C语言,让他又具有原本的运行效率又支持对象系统,C++、Objective C等就被设计出来。但是有一帮人觉得C++这些语言既不是完全兼容C,又增加了太多运算符,写着不爽。于是他们放出话来“面向对象是一种设计思想,和语言无关”,硬生生用C语言的“宏”模拟出一套对象系统来,直接用C语言的编译器就可以通过编译。因为这个系统设计得很经典,但是写起来完全不像C语言,还有超级多的括号()(())下划线_ _ _,看上去和C++那些根本好不到哪去。看热闹的多,真正拿来开发的少,出了GNU/Linux的圈子就很少有人用了。

如果想学GTK的话,GObject是绕不开的。尽管GObject是基于C语言的,但是几乎不能用C语言的思维理解,近乎一门新的语言了。就算用其他语言做GTK开发,文档基本上都是用C语言的文档直接机翻过来,很多代码示例还都是C语言的。因此虽然不用把GObject的一切都学透,还是有必要了解一下他的写法和基本原理。

文档:

https://docs.gtk.org/gobject/

Reply View the author
enforcee
deepin
2022-04-16 02:13
#2

2.GLib

不是glibc,注意区分。

广义上的GLib包括:GObject、 GLib、Gio、 GModule。GObject因为太特殊因此拿到上面去介绍了。如果把GObject看作是程序语言,GLib就可以看作是语言的“标准库”。其中,GLib提供一些数据类型的封装和操作函数,Gio提供文件的读写、通信和网络等功能(包括坛友很熟悉的DBus和GSettings),GModule提供模块的动态加载(动态链接库)。尽管现已加入GTK豪华午餐,其实GLib也是可以单独拆出来用的(以下的一些库都是)。

除了GTK之外,使用GLib的知名项目有GStreamer。

GLib文档:

https://docs.gtk.org/glib/

Gio文档:

https://docs.gtk.org/gio/

GModule文档:

https://docs.gtk.org/gmodule/

Reply View the author
enforcee
deepin
2022-04-16 02:29
#3

3.Cairo

一个矢量图形的绘制库。GTK的渲染也是用的Cairo。他其实是C语言写的,不是GObject,本来也不是GTK的一部分,但是可能是因为太过重要,因此也被放到了GTK的结构里。

网站:

https://www.cairographics.org/

文档:

https://www.cairographics.org/documentation/

4.Pango

一个文本渲染库,所有GTK的程序都用这个库显示文本。

文档:

https://docs.gtk.org/Pango/

Reply View the author
enforcee
deepin
2022-04-16 02:42
#4

5.GDK(Drawing Kit)

用来显示窗口的库。如果不想用GTK做界面工具包,也可以直接用GDK做窗口,Cairo绘图。

文档:

https://docs.gtk.org/gdk4/

6.GSK(Scene Graph Kit)

用于3D渲染的库。

文档:

https://docs.gtk.org/gsk4/

Reply View the author
enforcee
deepin
2022-04-16 03:20
#5

7.GTK

曾用名Gimp ToolKit、GTK+

以前GTK是指这个窗口组件包,GTK+是指GNOME这一套开发工具的总称。现在好了,GTK又是指窗口组件包又是指整个这一套,不知道是怎么想的。

最开始他是作为图形处理应用Gimp的一部分,然后自立门户成为GNOME桌面环境的核心。多年过去,GTK已经发展到了第四代,而他的老东家Gimp居然还在用已经淘汰的GTK2,真是让人唏嘘不已。GTK与Qt之争也一直是自由软件界经久不衰的话题。想当年采用Qt技术的KDE率先在GNU/Linux系统踏出第一步,但是Qt当时并不是自由的许可证,因此GNU就针锋相对推出GTK和GNOME。GTK逐渐成长为实至名归的GNU/Linux的原生界面库,而Qt也在多年以后真正开源。现在来看Qt由于更优秀的跨平台特性受到了更多开发者的青睐,而GTK只能坚守GNU/Linux的基本盘...

网站:

https://www.gtk.org/

文档:

(广义的)

https://docs.gtk.org/

(狭义的)

https://docs.gtk.org/gtk4/

gnome开发者文档。包含许多有用信息:

https://developer.gnome.org/documentation/index.html

8.Libadwaita(Adw)

随着GTK4推出的界面组件和主题引擎。libadwaita是作为GTK4的扩展,具备自适应功能和一些预设的动画效果。是libhandy的继任。

主页:

https://gnome.pages.gitlab.gnome.org/libadwaita/

文档:

https://gnome.pages.gitlab.gnome.org/libadwaita/doc/

9.Libhandy(Hdy)

GTK3的自适应组件(随着窗口大小和形状变化改变布局,常用于PC端和移动端UI的实时转换)。包括许多移动端能用上的组件。

主页:

https://gnome.pages.gitlab.gnome.org/libhandy/

文档:

https://gnome.pages.gitlab.gnome.org/libhandy/doc/

Reply View the author
枫叶
deepin
2022-04-16 03:35
#6

vala 语言了解一下

Reply View the author
enforcee
deepin
2022-04-16 03:48
#7

10.GObject Introspection 简称GI

用来实现各种语言的GObject绑定。任何支持GI的语言都可以通过GI去调用C语言(其实是GObject)的库。GTK支持那么多语言,都是GI的功劳。通过一些命令行工具可以把C语言的头文件转化成一种叫gi repository(GIR)的XML文件,然后编译成二进制文件称为typelib,就可以通过各种语言的GI库去调用。

文档:

https://gi.readthedocs.io

Reply View the author
enforcee
deepin
2022-04-16 04:14
#8

11.Vala

之前说过GObject很难用,GNOME也发现了这个问题,因此推出了一个全新的程序语言用来简化GObject的学习难度。Vala语言的语法模仿C#、Java,Vala的编译器valac先将Vala语言编译成C语言和GObject,然后再用C语言的编译器编译成目标文件。Vala语言除了GNOME外,忠实使用者有Elementary(就是Elementary OS的开发商。这家公司最近有点动荡)。Vala通过VAPI文件将对象和C库函数连接起来(不只局限于GObject)

因为API基本上都是翻译的C语言的,很多代码示例也是照搬,因此推荐学Vala时先研究下GObject。Vala的源文件扩展名是.vala。

主页:

https://wiki.gnome.org/Projects/Vala/

https://vala.dev/

文档:(还算是很丰富的,包括和C#,Java的对比)

https://wiki.gnome.org/Projects/Vala/Documentation

https://docs.vala.dev/

API参考:

https://valadoc.org/

12.Genie

Vala的姊妹语言,模仿python语法。编译器也是valac,需要源文件的扩展名是.gs。

主页:

https://wiki.gnome.org/Projects/Genie

Reply View the author
enforcee
deepin
2022-04-16 04:23
#9

13.Gjs

spidermonkey(Firefo*解释器)的分支。

采用上面提到的GI技术*也能编写桌面程序(虽然没看见过多少人用)。最知名的使用者是GNOME Shell。GNOME Shell的用户界面全*写的。不知道他们为什么对Web技术那么热衷,为了再把css也用上,他们把clutter*元素又套了一层皮,称为St(我猜测可能是style的缩写?)。如果想开发GNOME Shell的插件,学习Gjs是必须的。

另外一个知名项目是cinnamon(Linux Mint的桌面,解释器是gjs的分支cjs)

文档:

https://gjs.guide/

GNOME Shell插件开发:

https://gjs.guide/extensions/

API参考:

https://gjs-docs.gnome.org/

*clutter是GNOME维护的一个轻量级界面库,现已废弃不推荐使用,但是GNOME Shell还是需要他

Reply View the author
enforcee
deepin
2022-04-16 05:04
#10

14.Flatpak

虽然Flatpak并不明确属于GNOME,但是Flatpak的发展与GNOME的支持脱不开关系:https://flatpak.org/about/

Flatpak是一个新型的基于容器的包管理系统,Flatpak的后端是Ostree(类似apt和dpkg的关系),相比传统的包管理系统,Flatpak的优势是采用统一的运行时(而不是数量众多的依赖库),更细致的权限管理,原子更新(传统的软件包升级需要下载完整的软件包,而Flatpak只需要下载旧文件与新文件的差异“补丁”),多版本共存,并且不受发行版限制。

一个知名的Flatpak拥护者是Endless OS,他的系统采用apt管理,全部应用都采用Flatpak安装。

网站:

https://flatpak.org/

安装Flatpak并启用Flathub软件源的指南:

https://flatpak.org/setup/

开发者文档:

https://docs.flatpak.org/

Flathub软件源:

https://flathub.org/

Flatpak制作软件包(bundle)的办法(我自己写的):

https://bbs.deepin.org/post/203551

Reply View the author
enforcee
deepin
2022-04-16 05:42
#11

图形界面的开发工具:

GNOME Builder

GNOME的IDE,功能蛮多的,支持直接生成Flatpak。

主页:

https://wiki.gnome.org/Apps/Builder

文档:

https://builder.readthedocs.io/en/latest/

Glade

GTK3的界面设计器。

主页:

https://glade.gnome.org/

Cambalache

界面设计器,主要面向GTK4,也支持GTK3。作者和Glade的现任维护者是同一人。

主页:

https://gitlab.gnome.org/jpu/cambalache

Reply View the author
enforcee
deepin
2022-04-24 04:38
#12

15.gtkmm

C++语言绑定。用的人很少嘛。

主页:

http://www.gtkmm.org/en/

文档:

https://gtkmm.org/en/documentation.html

16.PyGObject

GObject的python语言绑定。使用了上面的GObject Introspection(GI)

文档:

https://pygobject.readthedocs.io/en/latest/

API:

https://lazka.github.io/pgi-docs/

17.gtk-rs

rust语言绑定。

主页:

https://gtk-rs.org/

一本书!:

https://gtk-rs.org/gtk4-rs/stable/latest/book/

Reply View the author