My Gtk Tutorial 1

大概我这样的人还是超少见的,或者你可以称之为傲娇。

于是这个是我自己写Gtk程序的心得。我个人的主力发行版是一个几乎无Gtk的发行版,平时唯一用于测试gtk的程序其实是gtk-demo。不过即使如此我也照样开发着Gtk程序,不过由于发行版没有Glade,虽然用下也不会少块肉,不过界面大部分还是靠手写。反正就是省点事情。

本文基于 Gtk3 和 up to date 的 Glib。

另外我对于所有动态语言抱有一种不信任的态度,另外就是写C比较熟悉,所以还是写C。

那么开始第一个程序吧。

在最新的GLib中,GLib终于也诞生了一个称为Application的概念,对于Gtk2时代的人来说这大概是个没听过的概念。用了有什么好处呢?

1、支持单实例
2、支持Application Menu

说道Application Menu,这究竟又是个什么东西呢?可以理解为“属于这个程序的”菜单,例如Firefox,Opera的大按钮等等。

当然不幸的是,我最近唯一写的Gtk程序是不需要Menu的,而且反正这个功能在非GNOME3环境下惨不忍睹(显示为只有一项的菜单栏,要多难看有多难看),所以这里带过不提。

那么第一个GtkApplication就从这里开始:

https://github.com/fcitx/fcitx-configtool/blob/b68086d4b6773845065e44956875d90bca195eba/gtk3/main.c

(该死的WP贴代码不方便)

如果你用过 Qt 的话,大概就看出了

QApplication app(argc, argv);
app.exec();

的影子,总之就是差不多的东西。

这里还实现了一个函数,activate,这个函数会在执行程序的时候被调用,而且是交给主进程的程序,于是里面的内容很简单,如果有窗口,那就显示出来,如果没有,那就创建一个。

关于 GObject 的 Signal,在下不才其实并不十分了解,你可以参考:

http://nanjingabcdefg.is-programmer.com/posts/24116.html

activate 本身其实也是一个 signal,具体你要实现activate被调用的效果其实有很多方式,在这个小地方怎么实现其实都并无所谓,你可以自己g_signal_connect 一个上去,或者采用别的方式。

但总之单实例就是这么简单就可以用上了。

里面的window部分是我自己实现的window,你如果想要随便测试玩玩的话,可以用 gtk_window_new 随便搞一个简单的出来。这里和Qt的一个差别是,top level的需要是GtkWindow,而Qt里面Toplevel的只要是Widget就可以了。

那么另一个可能的需求就是,你想要处理参数,这里让我当年好是头疼了一会。

那么再来看代码吧。

https://github.com/fcitx/fcitx-configtool/blob/1837cdf9bd0e03e05569c899e09ac9c4e024eb6a/gtk3/main.c

这里我处理参数处理的很简单,就是打开了一个fcitx对应addon的配置窗口。

这段代码存在了许多非常magic的地方,首先是创建Gtk程序的FLAGS变了,变成了,

G_APPLICATION_HANDLES_COMMAND_LINE

首先说明你需要command-line的支持。

其次,由于程序变成了单实例,于是就出现了local-command-line和command-line两个signal,其一,是在当前进程处理的,第二个则是在单实例的程序那边处理的。

这里我们并不需要local处理,于是跳过。然后这里就是magic的地方,当这个flag存在时,activate是不会被自动调用的,于是可以看到我在 fcitx_config_app_handle_command_line 手动调用了activate,然后进行了打开addon窗口的处理,第一次写这个的时候我迷惑了好半天……不如说是默认处理command line的行为就是activate,如果使用了这个flag的话这个行为将被discard而需要自己操作。

至于具体的参数处理,虽然glib也给了一些函数进行处理,不过我还是不善于此道,就直接用了第一个参数。

P. S.

至于这些和浆糊一样的内容究竟是有用还是没用呢?谁知道啊。

有没有2呢,谁知道啊。

This entry was posted in Gtk. Bookmark the permalink.

17 Responses to My Gtk Tutorial 1

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.