GtkApplication对象

网友投稿 493 2022-05-29

使用GtkApplication对象的实例:

#include static void activateApp(GApplication *app,gpointer user_data){ GtkWidget *window; window = gtk_application_window_new(GTK_APPLICATION(app)); gtk_widget_show(window); } int main(int argc,char** argv){ GtkApplication *app; int status; app = gtk_application_new("org.gnome.wong",G_APPLICATION_FLAGS_NONE); g_signal_connect(app,"activate",G_CALLBACK(activateApp),NULL); status = g_application_run(G_APPLICATION(app),argc,argv); return status; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

GtkApplication的出现是为了让我们的核心程序代码与main()函数分开。main()函数是由操作系统来调用的,属于操作系统实现细节。

GtkApplication对象

main()并不关心我们的程序能做什么的,有什么样的行为。操作系统只知道要启动应用程序,就调用它main()函数,仅此而已。而我们的程序对要做什么,要响应什么是很感兴趣的,不关心操作系统调用main()函数的确切机制。

这样的分离做法也显得很合理了。

GTK+库并没有默认实现main函数,需要我们自己来实现。除了在main()函数里创建GtkApplication对象并运行它之外,尽量不要在main()函数里做过多的操作。真正的工作,通常在GtkApplication发出的信号中完成。GtkApplication运行时可能发出的信号:

startup: 当程序第一次启动时,startup信号就会被触发,可以对应用程序进行一些设置。

shutdown: 执行关闭任务,如保存文件到磁盘等

activate: 程序启动时,显示应用程序默认的第一个窗口,特别是在桌面环境下首次打开应用程序的情况。

open: 打开文件,并在新窗口显示。使用应用程序从文件浏览器尝试打开文档的情况。

应用可以注册除了默认的“activate”和“open“行为之外的行为。

GtkApplication对象默认是一个单例。程序启动后的第一个实例,称为主实例。远程实例就是除主实例外的其他运行实例。本地实例就是当前实例。

当用户偿试打开第二个GtkApplication对象单例时,GtkApplication将发信号到主实例。主实例将再次收到activate或open信号。这种情况下,第二个实例将马上退出,也不调用startup或shutdown。

现在,你应该明白为什么不要在main函数做太多操作的原因了吧。这样可以避免第二个实例做无用功。所有启动初始化都应用在startup中完成。可以调用g_application_hold()强制应用保持存活。

如果本地实例是主实例,那么函数调用GtkApplication实例产生的信号,会在本地中触发。如果本地实例是一个远程实例,那么函数调用产生的信号将被发送到主实例中,并在那里被触发。例如,在主实例中,调用g_application_activate(),将在主实例中触发“activate”信号;如果在远程实例中调用它,则产生一个消息并发送到主实例,然后,在主实例将触发“activate”。

《GtkApplication函数使用》

谢谢阅读

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:电脑硬件知识入门之CPU篇
下一篇:微服务架构之优雅停机
相关文章