Hum, d'accord. Je suggérerais un code comme celui-ci, alors :
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
}
La structure est due au fait que vous devez transmettre quelques données. L'appel gtk_idle_add()
ajoute une méthode à exécuter lorsque la boucle principale est en cours d'exécution et inactive, et la valeur de retour FALSE
de l'appel display_dialog()
signifie que il n'est exécuté qu'une seule fois. Après avoir obtenu le résultat de la boîte de dialogue, nous quittons la boucle principale. Cela entraînera le retour du gtk_main()
dans votre méthode principale MessageBox()
, et vous pourrez accéder au résultat à partir de là.
J'espère que cela vous aidera !