I have been trying to implement Win32's MessageBox
using GTK. The app using SDL/OpenGL, so this isn't a GTK app.
I handle the initialisation (gtk_init
) sort of stuff inside the MessageBox
function as follows:
int MessageBox(HWND hwnd, const char* text, const char* caption, UINT type)
{
GtkWidget *window = NULL;
GtkWidget *dialog = NULL;
gtk_init(>kArgc, >kArgv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(delete_event), NULL);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
// gcallback calls gtk_main_quit()
gtk_init_add((GtkFunction)gcallback, NULL);
if (type & MB_YESNO) {
dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, text);
} else {
dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, text);
}
gtk_window_set_title(GTK_WINDOW(dialog), caption);
gint result = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_main();
gtk_widget_destroy(dialog);
if (type & MB_YESNO) {
switch (result) {
default:
case GTK_RESPONSE_DELETE_EVENT:
case GTK_RESPONSE_NO:
return IDNO;
break;
case GTK_RESPONSE_YES:
return IDYES;
break;
}
}
return IDOK;
}
Now, I am by no means an experienced GTK programmer, and I realise that I'm probably doing something horribly wrong.
However, my problem is that the last dialog popped up with this function stays around until the process exits. Any ideas?
Hmm, ok. I'd suggest code like this, then:
The struct is 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 theFALSE
return value from thedisplay_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 thegtk_main()
in your mainMessageBox()
method to return, and you'll be able to access the result from there.Hope this helps!
To manage a dialog box with GTK+, use a GtkDialog and gtk_dialog_run() instead of managing a window and a main loop by yourself.
EDIT / ADDENDUM :
What I mean is "just use" : I don't understand why you create a windows you never use and a main loop which seems useless (at least from the piece of code you posted). You can write something as short as :
A few things:
You are creating (and not using) an unnecessary toplevel window, named
window
. You can just delete these lines:Also, the flow doesn't seem quite right.
gtk_main()
starts the GTK main loop, which blocks until something exits it.gtk_dialog_run()
also starts a main loop, but it exits as soon as one of the buttons is clicked.I think it might be enough for you to remove the
gtk_init_add()
andgtk_main()
calls, and simply deal with the return value. Also thegtk_widget_destroy()
call is unnecessary, as the dialog window is automatically destroyed when gtk_dialog_run() returns.