GtkApplication对象

举报
yd_221104950 发表于 2020/12/02 23:56:14 2020/12/02
【摘要】 使用GtkApplication对象的实例: #include <gtk/gtk.h> static void activateApp(GApplication *app,gpointer user_data){ GtkWidget *window; window = gtk_application_window_new(GTK_APPLICATION(a...

使用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”。

《GtkApplication函数使用》

谢谢阅读

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/102582476

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。