#include /* Keep one of these for each dialog window. */ typedef struct _MyDialog { /* The dialog we are displaying. */ GtkWidget *dialog; /* Timeout until we auto-popdown the dialog. */ unsigned int popdown_timeout; } MyDialog; gboolean timeout_cb( MyDialog *mydialog ) { mydialog->popdown_timeout = 0; gtk_widget_destroy( mydialog->dialog ); /* Returning FALSE means we don't want this timeout triggered again. */ return( FALSE ); } void response_cb( GtkDialog *dialog, int response_id, MyDialog *mydialog ) { gtk_widget_destroy( mydialog->dialog ); } void destroy_cb( GtkDialog *dialog, MyDialog *mydialog ) { if( mydialog->popdown_timeout ) { g_source_remove( mydialog->popdown_timeout ); mydialog->popdown_timeout = 0; } g_free( mydialog ); } void mydialog_new() { MyDialog *mydialog = g_new( MyDialog, 1 ); mydialog->dialog = gtk_message_dialog_new( NULL, 0, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "You are feeling sleeepy ..." ); mydialog->popdown_timeout = g_timeout_add( 4500, (GSourceFunc) timeout_cb, mydialog ); g_signal_connect( mydialog->dialog, "response", G_CALLBACK( response_cb ), mydialog ); g_signal_connect( mydialog->dialog, "destroy", G_CALLBACK( destroy_cb ), mydialog ); gtk_widget_show( mydialog->dialog ); } gboolean main_timeout_cb() { mydialog_new(); return( TRUE ); } int main( int argc, char **argv ) { gtk_init (&argc, &argv); g_timeout_add( 2000, (GSourceFunc) main_timeout_cb, NULL ); gtk_main(); return( 0 ); }