+static void get_stackframe_callback(void* p)
+{
+ StackDump* dump = static_cast<StackDump*>(p);
+ // skip over frames up to including wxOnAssert()
+ dump->ProcessFrames(7);
+}
+
+#endif // wxDEBUG_LEVEL && wxUSE_STACKWALKER
+
+bool wxGUIAppTraits::ShowAssertDialog(const wxString& msg)
+{
+#if wxDEBUG_LEVEL
+ // we can't show the dialog from another thread
+ if ( wxIsMainThread() )
+ {
+ // under GTK2 we prefer to use a dialog widget written using directly
+ // in GTK+ as use a dialog written using wxWidgets would need the
+ // wxWidgets idle processing to work correctly which might not be the
+ // case when assert happens
+ GtkWidget *dialog = gtk_assert_dialog_new();
+ gtk_assert_dialog_set_message(GTK_ASSERT_DIALOG(dialog), msg.mb_str());
+
+#if wxUSE_STACKWALKER
+ // save the current stack ow...
+ StackDump dump(GTK_ASSERT_DIALOG(dialog));
+ dump.SaveStack(100); // showing more than 100 frames is not very useful
+
+ // ...but process it only if the user needs it
+ gtk_assert_dialog_set_backtrace_callback
+ (
+ GTK_ASSERT_DIALOG(dialog),
+ 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( wxT("unexpected return code from GtkAssertDialog") );
+ }
+
+ gtk_widget_destroy(dialog);
+ return returnCode;
+ }
+#endif // wxDEBUG_LEVEL
+
+ return wxAppTraitsBase::ShowAssertDialog(msg);
+}
+
+#endif // __UNIX__
+
+#if defined(__UNIX__) || defined(__OS2__)
+
+wxString wxGUIAppTraits::GetDesktopEnvironment() const
+{
+ wxString de = wxSystemOptions::GetOption(wxT("gtk.desktop"));
+#if wxUSE_DETECT_SM
+ if ( de.empty() )
+ {
+ static const wxString s_SM = GetSM();
+
+ if (s_SM == wxT("GnomeSM"))
+ de = wxT("GNOME");
+ else if (s_SM == wxT("KDE"))
+ de = wxT("KDE");
+ }
+#endif // wxUSE_DETECT_SM
+
+ return de;
+}
+
+#endif // __UNIX__ || __OS2__
+
+// see the hack below in wxCmdLineParser::GetUsageString().
+// TODO: replace this hack with a g_option_group_get_entries()
+// call as soon as such function exists;
+// see http://bugzilla.gnome.org/show_bug.cgi?id=431021 for the relative
+// feature request
+struct _GOptionGroup