X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/863136dea65adc3103b7c94272d0ed6e12346de0..c543817b3280c560d53307c0fa98e7a99aa00bf9:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index e58a9c8e97..86822b5abd 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -35,6 +35,10 @@ #include "wx/module.h" #include "wx/image.h" +#ifdef __WXGPE__ +#include +#endif + #ifdef __WXUNIVERSAL__ #include "wx/univ/theme.h" #include "wx/univ/renderer.h" @@ -160,20 +164,31 @@ bool wxApp::Yield(bool onlyIfNeeded) // wxWakeUpIdle //----------------------------------------------------------------------------- +// RR/KH: The wxMutexGui calls are not needed on GTK2 according to +// the GTK faq, http://www.gtk.org/faq/#AEN500 +// The calls to gdk_threads_enter() and leave() are specifically noted +// as not being necessary. The MutexGui calls are still left in for GTK1. +// Eliminating the MutexGui calls fixes the long-standing "random" lockup +// when using wxPostEvent (which calls WakeUpIdle) from a thread. + void wxApp::WakeUpIdle() { +#ifndef __WXGTK20__ #if wxUSE_THREADS if (!wxThread::IsMain()) wxMutexGuiEnter(); -#endif +#endif // wxUSE_THREADS_ +#endif // __WXGTK2__ if (g_isIdle) wxapp_install_idle_handler(); +#ifndef __WXGTK20__ #if wxUSE_THREADS if (!wxThread::IsMain()) wxMutexGuiLeave(); -#endif +#endif // wxUSE_THREADS_ +#endif // __WXGTK2__ } //----------------------------------------------------------------------------- @@ -399,7 +414,6 @@ END_EVENT_TABLE() wxApp::wxApp() { - m_initialized = FALSE; #ifdef __WXDEBUG__ m_isInAssert = FALSE; #endif // __WXDEBUG__ @@ -538,49 +552,17 @@ GdkVisual *wxApp::GetGdkVisual() return visual; } -int wxApp::MainLoop() -{ - gtk_main(); - return 0; -} - -void wxApp::Exit() -{ - // VZ: no idea why is it different from ExitMainLoop() but this is what - // wxExit() used to do - gtk_main_quit(); -} - -void wxApp::ExitMainLoop() -{ - if (gtk_main_level() > 0) - gtk_main_quit(); -} - -bool wxApp::Initialized() -{ - return m_initialized; -} - -bool wxApp::Pending() -{ - return (gtk_events_pending() > 0); -} - -void wxApp::Dispatch() -{ - gtk_main_iteration(); -} - bool wxApp::Initialize(int& argc, wxChar **argv) { + bool init_result; + #if wxUSE_THREADS // GTK 1.2 up to version 1.2.3 has broken threads if ((gtk_major_version == 1) && (gtk_minor_version == 2) && (gtk_micro_version < 4)) { - printf( "wxWindows warning: GUI threading disabled due to outdated GTK version\n" ); + printf( "wxWidgets warning: GUI threading disabled due to outdated GTK version\n" ); } else { @@ -617,7 +599,13 @@ bool wxApp::Initialize(int& argc, wxChar **argv) argvGTK[argc] = NULL; int argcGTK = argc; - gtk_init( &argcGTK, &argvGTK ); + +#ifdef __WXGPE__ + init_result = true; // is there a _check() version of this? + gpe_application_init( &argcGTK, &argvGTK ); +#else + init_result = gtk_init_check( &argcGTK, &argvGTK ); +#endif if ( argcGTK != argc ) { @@ -644,9 +632,14 @@ bool wxApp::Initialize(int& argc, wxChar **argv) #else // !wxUSE_UNICODE // gtk_init() shouldn't actually change argv itself (just its contents) so // it's ok to pass pointer to it - gtk_init( &argc, &argv ); + init_result = gtk_init_check( &argc, &argv ); #endif // wxUSE_UNICODE/!wxUSE_UNICODE + if (!init_result) { + wxLogError(wxT("Unable to initialize gtk, is DISPLAY set properly?")); + return false; + } + // we can not enter threads before gtk_init is done gdk_threads_enter(); @@ -663,8 +656,6 @@ bool wxApp::Initialize(int& argc, wxChar **argv) wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding()); #endif - wxGetRootWindow(); - return true; }