0. 有关g_signal和gtk_signal
g_signal_emit之后,立即会调用g_signal_connect注册的回调函数。
gtk的signal也是gsignal, 当main_loop中收到x的event后,x_event ->gdk_event ->g_signal
如delete_event和destroy两个gtk的信号实际定义如下:
它们一个是GObject的信号(destroy),一个是widget的信号(delete_event)
1. delete event的产生
(1) main_loop中收到x_event ClientMessage -->gdk_event GDK_CLIENT_EVENT
(2) gdk_event GDK_CLIENT_EVENT --> gdk_event GDK_DELETE
当收到client event后, 通过函数gdk_wm_protocols_filter判断其为WM_DELETE_WINDOW后,会进到 gtk_main_do_event中:
(3) gdk_event GDK_DELETE --> g_signal DELETE_EVENT
2. destroy signal的产生过程
(1)当gtk_widget_destroy(widget)调用后,gtk_object_destroy(object)被调用
(2)g_object_run_dispose
(3) 调用gtk Object的dispose函数gtk_object_dispose
GtkObject中, gobject_class->dispose = gtk_object_dispose
(4)上一步发出的DESTROY信号,gtk_object连接了一个默认的处理函数gtk_object_real_destroy
从上面的1(2)中的代码,可以看到,delete_event的回调函数返回FALSE时,gtk_widget_destroy会被调用,进而触发destroy信号的发出