X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f9837e4693de73bc10087e6709e9cdd6e3834855..c9ed413ab4f5673ffff00198dc6ce1397398bda4:/src/gtk/utilsgtk.cpp diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index bfcbbc8ab2..0850010f6e 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -40,14 +40,13 @@ #include // for WNOHANG #include -#include "glib.h" -#include "gdk/gdk.h" -#include "gtk/gtk.h" -#include "gdk/gdkx.h" +#include +#include #if wxUSE_DETECT_SM - #include "X11/Xlib.h" - #include "X11/SM/SMlib.h" + #include + + #include "wx/unix/utilsx11.h" #endif //----------------------------------------------------------------------------- @@ -242,17 +241,7 @@ wxTimerImpl *wxGUIAppTraits::CreateTimerImpl(wxTimer *timer) #if wxUSE_DETECT_SM static wxString GetSM() { - class Dpy - { - public: - Dpy() { m_dpy = XOpenDisplay(NULL); } - ~Dpy() { if ( m_dpy ) XCloseDisplay(m_dpy); } - - operator Display *() const { return m_dpy; } - private: - Display *m_dpy; - } dpy; - + wxX11Display dpy; if ( !dpy ) return wxEmptyString; @@ -354,55 +343,55 @@ extern "C" bool wxGUIAppTraits::ShowAssertDialog(const wxString& msg) { #if wxDEBUG_LEVEL - // 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()); + // 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 - // 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( wxT("unexpected return code from GtkAssertDialog") ); + // 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), + (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( wxT("unexpected return code from GtkAssertDialog") ); + } + + gtk_widget_destroy(dialog); + return returnCode; } +#endif // wxDEBUG_LEVEL - gtk_widget_destroy(dialog); - return returnCode; -#else // !wxDEBUG_LEVEL - // this function is never called in this case - wxUnusedVar(msg); - return false; -#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL + return wxAppTraitsBase::ShowAssertDialog(msg); } wxString wxGUIAppTraits::GetDesktopEnvironment() const