// 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
// 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;
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;
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
//-----------------------------------------------------------------------------
wxClassInfo::InitializeClasses();
- wxSystemSettings::Init();
-
#if wxUSE_INTL
wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
#endif
delete wxPendingEventsLocker;
#endif
- wxSystemSettings::Done();
-
delete[] wxBuffer;
wxClassInfo::CleanUpClasses();