当鼠标单击gtk+窗口的关闭按钮时,程序首先接收到delete_event,当该事件处理函数返回TRUE表示事件已处理禁止进一步传播,从而取消关闭操作;当返回FALSE时,事件消息进一步向上传播,此时会调用gtk+默认的处理函数,该函数产生destroy事件,一般在该事件的处理函数中用gtk_main_quit将窗口关闭;这时gtk_main()消息环退出,因而程序退出。

下面是示例代码:

#include <gnome.h>

gboolean delete_handle(GtkWidget *self,GdkEvent *event,gpointer data){
    static gint count = 0;
    g_print("Attempt number %d\n",++count);
    if(count>2) return FALSE;
    return TRUE;
}

gboolean destroy_handle(GtkWidget *self,GdkEvent *event,gpointer data){
    g_print("Shutting down\n");
    gtk_main_quit();
    return FALSE;
}

int main(int argc,char **argv){
    GtkWidget *w;
    gtk_init(&argc,&argv);
    w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_signal_connect(GTK_OBJECT(w),"delete_event",G_CALLBACK(delete_handle),NULL);
    gtk_signal_connect(GTK_OBJECT(w),"destroy",G_CALLBACK(destroy_handle),NULL);
    gtk_widget_show_all(w);
    gtk_main();
    return 0;
}

编译连接命令为:

clang `pkg-config --cflags --libs libgnomeui-2.0` -O3 -g -s -o destroy destroy.c
04-15 09:40