- else {
- // we're in parent
- close(end_proc_detect[1]); // close writing side
- data->tag = gdk_input_add(end_proc_detect[0], GDK_INPUT_READ,
- GTK_EndProcessDetector, (gpointer)data);
- data->pid = pid;
- if (!sync) {
- data->process = process;
- }
- else {
- data->process = (wxProcess *) NULL;
- data->pid = -(data->pid);
-
- while (data->pid != 0)
- wxYield();
-
- delete data;
- }
-
- // @@@ our return value indicates success even if execvp() in the child
- // failed!
- return pid;
+}
+
+#endif // wxUSE_STACKWALKER
+
+bool wxGUIAppTraits::ShowAssertDialog(const wxString& msg)
+{
+ // under GTK2 we prefer to use a dialog widget written using directly GTK+;
+ // in fact we cannot use a dialog written using wxWidgets: it would need
+ // the wxWidgets idle processing to work correctly!
+ GtkWidget *dialog = gtk_assert_dialog_new();
+ gtk_assert_dialog_set_message(GTK_ASSERT_DIALOG(dialog), msg.mb_str());
+
+#if wxUSE_STACKWALKER
+ // don't show more than maxLines or we could get a dialog too tall to be
+ // shown on screen: 20 should be ok everywhere as even with 15 pixel high
+ // characters it is still only 300 pixels...
+ static const int maxLines = 20;
+
+ // save current stack frame...
+ StackDump dump(GTK_ASSERT_DIALOG(dialog));
+ dump.SaveStack(maxLines);
+
+ // ...but process it only if the user needs it
+ gtk_assert_dialog_set_backtrace_callback(GTK_ASSERT_DIALOG(dialog),
+ (GtkAssertDialogStackFrameCallback)get_stackframe_callback,
+ &dump);
+#endif // wxUSE_STACKWALKER
+
+ gint result = gtk_dialog_run(GTK_DIALOG (dialog));
+ bool returnCode = false;
+ switch (result)
+ {
+ case GTK_ASSERT_DIALOG_STOP:
+ wxTrap();
+ break;
+ case GTK_ASSERT_DIALOG_CONTINUE:
+ // nothing to do
+ break;
+ case GTK_ASSERT_DIALOG_CONTINUE_SUPPRESSING:
+ // no more asserts
+ returnCode = true;
+ break;
+
+ default:
+ wxFAIL_MSG( _T("unexpected return code from GtkAssertDialog") );