]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/app.cpp
new wxStringTokenizer
[wxWidgets.git] / src / gtk / app.cpp
index 43a5a92aa9535f015f60ce647302d527bd17dd09..9b13515ed41cf1ea66025cca230e1af6bd7da590 100644 (file)
@@ -49,6 +49,10 @@ wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NUL
 
 extern bool g_isIdle;
 
+bool g_mainThreadLocked = FALSE;
+
+GtkWidget *wxRootWindow = (GtkWidget*) NULL;
+
 //-----------------------------------------------------------------------------
 // local functions
 //-----------------------------------------------------------------------------
@@ -136,9 +140,6 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) )
     // thread so we must lock it here ourselves
     gdk_threads_enter();
 
-    /* sent idle event to all who request them */
-    while (wxTheApp->ProcessIdle()) { }
-
     /* we don't want any more idle events until the next event is
        sent to wxGTK */
     gtk_idle_remove( wxTheApp->m_idleTag );
@@ -151,6 +152,9 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) )
        emptied */
     g_isIdle = TRUE;
 
+    /* sent idle event to all who request them */
+    while (wxTheApp->ProcessIdle()) { }
+
     // release lock again
     gdk_threads_leave();
 
@@ -178,7 +182,7 @@ void wxapp_install_thread_wakeup()
 {
     if (wxTheApp->m_wakeUpTimerTag) return;
 
-    wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 500, wxapp_wakeup_timerout_callback, (gpointer) NULL );
+    wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 50, wxapp_wakeup_timerout_callback, (gpointer) NULL );
 }
 
 void wxapp_uninstall_thread_wakeup()
@@ -200,6 +204,8 @@ gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
 
     // unblock other threads wishing to do some GUI things
     wxMutexGuiLeave();
+    
+    g_mainThreadLocked = TRUE;
 
     // wake up other threads
     wxUsleep( 1 );
@@ -207,6 +213,8 @@ gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
     // block other thread again
     wxMutexGuiEnter();
 
+    g_mainThreadLocked = FALSE;
+
     wxapp_install_thread_wakeup();
 
     // release lock again
@@ -242,6 +250,8 @@ wxApp::wxApp()
 #endif
 
     m_colorCube = (unsigned char*) NULL;
+    
+    m_useBestVisual = FALSE;
 }
 
 wxApp::~wxApp()
@@ -262,8 +272,9 @@ bool wxApp::OnInitGui()
     /* on some machines, the default visual is just 256 colours, so
        we make sure we get the best. this can sometimes be wasteful,
        of course, but what do these guys pay $30.000 for? */
-/*
-    if (gdk_visual_get_best() != gdk_visual_get_system())
+       
+    if ((gdk_visual_get_best() != gdk_visual_get_system()) &&
+        (m_useBestVisual))
     {
         GdkVisual* vis = gdk_visual_get_best();
         gtk_widget_set_default_visual( vis );
@@ -273,7 +284,9 @@ bool wxApp::OnInitGui()
 
         visual = vis;
     }
-*/
+
+    wxRootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
+    gtk_widget_realize( wxRootWindow );
 
     /* Nothing to do for 15, 16, 24, 32 bit displays */
     if (visual->depth > 8) return TRUE;
@@ -346,11 +359,11 @@ bool wxApp::ProcessIdle()
 void wxApp::OnIdle( wxIdleEvent &event )
 {
     static bool s_inOnIdle = FALSE;
-
+    
     /* Avoid recursion (via ProcessEvent default case) */
     if (s_inOnIdle)
         return;
-
+    
     s_inOnIdle = TRUE;
 
     /* Resend in the main thread events which have been prepared in other
@@ -360,13 +373,6 @@ void wxApp::OnIdle( wxIdleEvent &event )
     /* 'Garbage' collection of windows deleted with Close(). */
     DeletePendingObjects();
 
-    /* flush the logged messages if any */
-#if wxUSE_LOG
-    wxLog *log = wxLog::GetActiveTarget();
-    if (log != NULL && log->HasPendingMessages())
-        log->Flush();
-#endif // wxUSE_LOG
-
     /* Send OnIdle events to all windows */
     bool needMore = SendIdleEvents();
 
@@ -374,6 +380,13 @@ void wxApp::OnIdle( wxIdleEvent &event )
         event.RequestMore(TRUE);
 
     s_inOnIdle = FALSE;
+
+    /* flush the logged messages if any */
+#if wxUSE_LOG
+    wxLog *log = wxLog::GetActiveTarget();
+    if (log != NULL && log->HasPendingMessages())
+        log->Flush();
+#endif // wxUSE_LOG
 }
 
 bool wxApp::SendIdleEvents()
@@ -476,17 +489,16 @@ bool wxApp::Initialize()
     wxPendingEventsLocker = new wxCriticalSection();
 #endif
 
-/*
-    wxTheFontNameDirectory =  new wxFontNameDirectory;
-    wxTheFontNameDirectory->Initialize();
-*/
-
     wxTheColourDatabase = new wxColourDatabase( wxKEY_STRING );
     wxTheColourDatabase->Initialize();
 
     wxInitializeStockLists();
     wxInitializeStockObjects();
 
+#if wxUSE_WX_RESOURCES
+    wxInitializeResourceSystem();
+#endif
+
     wxModule::RegisterModules();
     if (!wxModule::InitializeModules()) return FALSE;
 
@@ -497,15 +509,15 @@ void wxApp::CleanUp()
 {
     wxModule::CleanUpModules();
 
+#if wxUSE_WX_RESOURCES
+    wxCleanUpResourceSystem();
+#endif
+
     if (wxTheColourDatabase)
         delete wxTheColourDatabase;
+        
     wxTheColourDatabase = (wxColourDatabase*) NULL;
 
-/*
-    if (wxTheFontNameDirectory) delete wxTheFontNameDirectory;
-    wxTheFontNameDirectory = (wxFontNameDirectory*) NULL;
-*/
-
     wxDeleteStockObjects();
 
     wxDeleteStockLists();
@@ -553,7 +565,17 @@ void wxApp::CleanUp()
 int wxEntry( int argc, char *argv[] )
 {
 #if wxUSE_THREADS
-    g_thread_init(NULL);
+    /* 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: Disabled GUI threading due to outdated GTK version\n" );
+    }
+    else
+    {
+        g_thread_init(NULL);
+    }
 #endif
     
     gtk_set_locale();