GtkApplication对象
使用GtkApplication对象的实例:
#include <gtk/gtk.h>
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()函数是由操作系统来调用的,属于操作系统实现细节。
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”。
谢谢阅读
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/102582476
- 点赞
- 收藏
- 关注作者
评论(0)