GTK implementation of MessageBox

前端 未结 3 1222
悲哀的现实
悲哀的现实 2020-12-30 19:37

I have been trying to implement Win32\'s MessageBox using GTK. The app uses SDL/OpenGL, so this isn\'t a GTK app.

I handle the initialization (gtk_

3条回答
  •  一向
    一向 (楼主)
    2020-12-30 19:54

    Hmm, ok. I'd suggest code like this, then:

    typedef struct {
        int type;
        int result;
    } DialogData;
        
    static gboolean
    display_dialog(gpointer user_data)
    {
        DialogData *dialog_data = user_data;
        GtkWidget *dialog;
        
        if (dialog_data->type & MB_YESNO)
            dialog = gtk_message_dialog_new(...);
        else
            dialog = gtk_message_dialog_new(...);
        
        // Set title, etc.
        
        dialog_data->result = gtk_dialog_run(...);
        
        gtk_main_quit();  // Quits the main loop run in MessageBox()
        
        return FALSE;
    }
        
    int MessageBox(...)
    {
        DialogData dialog_data;
        
        dialog_data.type = type;
        
        gtk_idle_add(display_dialog, &dialog_data);
        
        gtk_main();
        
        // Do stuff based on dialog_data.result
    }
    

    The struct is required because you need to pass around a couple pieces of data. The gtk_idle_add() call adds a method to be run when the main loop is running and idle, and the FALSE return value from the display_dialog() call means that it's only run once. After we get the result from the dialog, we quit the main loop. That'll cause the gtk_main() in your main MessageBox() method to return, and you'll be able to access the result from there.

提交回复
热议问题