X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8461e4c253d4cec65e8f0320246a56d22555eb5e..e9f692911da77538e58ed4539be6f7ac3774d320:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 0ef365ec05..daa4e27b35 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -61,14 +61,15 @@ static GtkWidget *gs_RootWindow = (GtkWidget*) NULL; // local functions //----------------------------------------------------------------------------- -/* forward declaration */ -gint wxapp_idle_callback( gpointer WXUNUSED(data) ); -gint wxapp_pending_callback( gpointer WXUNUSED(data) ); -void wxapp_install_idle_handler(); +extern "C" +{ + gint wxapp_idle_callback( gpointer WXUNUSED(data) ); + gint wxapp_pending_callback( gpointer WXUNUSED(data) ); +} -#if wxUSE_THREADS -gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ); -#endif +void wxapp_install_thread_wakeup(); +void wxapp_uninstall_thread_wakeup(); +void wxapp_install_idle_handler(); //----------------------------------------------------------------------------- // wxExit @@ -163,6 +164,28 @@ void wxWakeUpIdle() // local functions //----------------------------------------------------------------------------- +void wxapp_install_idle_handler() +{ + wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); + + g_isIdle = FALSE; + + if (g_pendingTag == 0) + g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL ); + + /* This routine gets called by all event handlers + indicating that the idle is over. It may also + get called from other thread for sending events + to the main thread (and processing these in + idle time). Very low priority. */ + + wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL ); +} + +// the callback functions must be extern "C" to comply with GTK+ declarations +extern "C" +{ + gint wxapp_pending_callback( gpointer WXUNUSED(data) ) { if (!wxTheApp) return TRUE; @@ -230,24 +253,42 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) ) return FALSE; } -void wxapp_install_idle_handler() +#if wxUSE_THREADS + +gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) { - wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); + // when getting called from GDK's time-out handler + // we are no longer within GDK's grab on the GUI + // thread so we must lock it here ourselves + gdk_threads_enter(); - g_isIdle = FALSE; + wxapp_uninstall_thread_wakeup(); - if (g_pendingTag == 0) - g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL ); + // unblock other threads wishing to do some GUI things + wxMutexGuiLeave(); - /* This routine gets called by all event handlers - indicating that the idle is over. It may also - get called from other thread for sending events - to the main thread (and processing these in - idle time). Very low priority. */ + g_mainThreadLocked = TRUE; - wxTheApp->m_idleTag = gtk_idle_add_priority( 1000, wxapp_idle_callback, (gpointer) NULL ); + // wake up other threads + wxUsleep( 1 ); + + // block other thread again + wxMutexGuiEnter(); + + g_mainThreadLocked = FALSE; + + wxapp_install_thread_wakeup(); + + // release lock again + gdk_threads_leave(); + + return TRUE; } +#endif // wxUSE_THREADS + +} // extern "C" + #if wxUSE_THREADS static int g_threadUninstallLevel = 0; @@ -275,36 +316,6 @@ void wxapp_uninstall_thread_wakeup() wxTheApp->m_wakeUpTimerTag = 0; } -gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) -{ - // when getting called from GDK's time-out handler - // we are no longer within GDK's grab on the GUI - // thread so we must lock it here ourselves - gdk_threads_enter(); - - wxapp_uninstall_thread_wakeup(); - - // unblock other threads wishing to do some GUI things - wxMutexGuiLeave(); - - g_mainThreadLocked = TRUE; - - // wake up other threads - wxUsleep( 1 ); - - // block other thread again - wxMutexGuiEnter(); - - g_mainThreadLocked = FALSE; - - wxapp_install_thread_wakeup(); - - // release lock again - gdk_threads_leave(); - - return TRUE; -} - #endif // wxUSE_THREADS //----------------------------------------------------------------------------- @@ -580,8 +591,6 @@ bool wxApp::Initialize() wxClassInfo::InitializeClasses(); - wxSystemSettings::Init(); - #if wxUSE_INTL wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding()); #endif @@ -636,8 +645,6 @@ void wxApp::CleanUp() delete wxPendingEventsLocker; #endif - wxSystemSettings::Done(); - delete[] wxBuffer; wxClassInfo::CleanUpClasses(); @@ -679,8 +686,8 @@ GtkWidget* wxGetRootWindow() // wxEntry //----------------------------------------------------------------------------- - -int wxEntryStart( int argc, char *argv[] ) +// NB: argc and argv may be changed here, pass by reference! +int wxEntryStart( int& argc, char *argv[] ) { #if wxUSE_THREADS /* GTK 1.2 up to version 1.2.3 has broken threads */