我有一个涉及sshfs挂载的程序,当用户关闭主窗口时,我想首先卸载sshfs,然后对该sshfs挂载进行一些测试,告诉用户测试结果并最终关闭程序。
所以基本上,我只是想在测试之后,主窗口保持打开一段时间然后关闭。
我尝试将g_usleep(3000000);
放在gtk_main_quit();
之前,但它不起作用。
在GTK的踏板系统中挖掘了一下,然后我尝试了这个:
gboolean wait_func(gpointer data) {
g_usleep(3000000);
return FALSE;
}
void on_window_destroy(GtkWidget *object, app_widgets *app_wid)
{
//close connection and verify state
//....
//updating label text
gtk_label_set_text(GTK_LABEL(app_wid->lab_test),"connection closed. Exiting...");
while(gtk_events_pending()) gtk_main_iteration();
g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)wait_func,app_wid,(GDestroyNotify)gtk_main_quit);
}
但主窗口立即关闭,程序休眠3秒钟结束。我希望窗户能够保持开放状态。我怎么能这样做?
答案 0 :(得分:1)
使用delete-event
代替destroy
。请注意,如果要继续触发FALSE
:
destroy
#include <gtk/gtk.h>
static gboolean delete_event(GtkWidget *w, GdkEvent *e, gpointer d) {
g_print("Doing stuff\n");
g_usleep(3000000);
g_print("Stuff done\n");
return FALSE;
}
int main(int argc, char *argv[]) {
GtkWidget *w;
gtk_init(&argc, &argv);
w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(w, "delete-event", G_CALLBACK (delete_event), NULL);
g_signal_connect(w, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_show(w);
gtk_main();
return 0;
}