]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/app.cpp
regenerated from filelist.txt
[wxWidgets.git] / src / gtk / app.cpp
index ba0fd8ed6b4f902579a1d912ad66df54f84d08c9..b89d77cd5c779f47bfdfa004fb4b4eecaafcc484 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
 //-----------------------------------------------------------------------------
@@ -89,17 +93,25 @@ bool wxYield()
     while (gtk_events_pending())
         gtk_main_iteration();
 
-    /* it's necessary to call ProcessIdle() to update the frames sizes which
-       might have been changed (it also will update other things set from
-       OnUpdateUI() which is a nice (and desired) side effect) */
-    while (wxTheApp->ProcessIdle()) { }
-
     if (has_idle)
     {
         /* re-add idle handler */
         wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL );
     }
 
+    // disable log flushing from here because a call to wxYield() shouldn't
+    // normally result in message boxes popping up &c
+    wxLog::Suspend();
+
+    /* it's necessary to call ProcessIdle() to update the frames sizes which
+       might have been changed (it also will update other things set from
+       OnUpdateUI() which is a nice (and desired) side effect) */
+    while (wxTheApp->ProcessIdle())
+        ;
+
+    // let the logs be flashed again
+    wxLog::Resume();
+
     return TRUE;
 }
 
@@ -114,9 +126,9 @@ void wxWakeUpIdle()
         wxMutexGuiEnter();
 #endif
 
-    if (g_isIdle) 
+    if (g_isIdle)
         wxapp_install_idle_handler();
-    
+
 #if wxUSE_THREADS
     if (!wxThread::IsMain())
         wxMutexGuiLeave();
@@ -136,9 +148,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 +160,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();
 
@@ -201,17 +213,21 @@ 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 );
 
     // block other thread again
     wxMutexGuiEnter();
 
+    g_mainThreadLocked = FALSE;
+
     wxapp_install_thread_wakeup();
 
     // release lock again
     gdk_threads_leave();
-    
+
     return TRUE;
 }
 
@@ -242,6 +258,8 @@ wxApp::wxApp()
 #endif
 
     m_colorCube = (unsigned char*) NULL;
+
+    m_useBestVisual = FALSE;
 }
 
 wxApp::~wxApp()
@@ -262,8 +280,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 +292,6 @@ bool wxApp::OnInitGui()
 
         visual = vis;
     }
-*/
 
     /* Nothing to do for 15, 16, 24, 32 bit displays */
     if (visual->depth > 8) return TRUE;
@@ -360,13 +378,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 +385,11 @@ void wxApp::OnIdle( wxIdleEvent &event )
         event.RequestMore(TRUE);
 
     s_inOnIdle = FALSE;
+
+    /* flush the logged messages if any */
+#if wxUSE_LOG
+    wxLog::FlushActive();
+#endif // wxUSE_LOG
 }
 
 bool wxApp::SendIdleEvents()
@@ -502,7 +518,7 @@ void wxApp::CleanUp()
 
     if (wxTheColourDatabase)
         delete wxTheColourDatabase;
-        
+
     wxTheColourDatabase = (wxColourDatabase*) NULL;
 
     wxDeleteStockObjects();
@@ -552,9 +568,19 @@ 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: GUI threading disabled due to outdated GTK version\n" );
+    }
+    else
+    {
+        g_thread_init(NULL);
+    }
 #endif
-    
+
     gtk_set_locale();
 
 #if wxUSE_WCHAR_T
@@ -593,7 +619,7 @@ int wxEntry( int argc, char *argv[] )
 #if wxUSE_UNICODE
     wxTheApp->argv = new wxChar*[argc+1];
     int mb_argc = 0;
-    while (mb_argc < argc) 
+    while (mb_argc < argc)
     {
         wxTheApp->argv[mb_argc] = wxStrdup(wxConvLibc.cMB2WX(argv[mb_argc]));
         mb_argc++;
@@ -612,6 +638,9 @@ int wxEntry( int argc, char *argv[] )
     if ( !wxTheApp->OnInitGui() )
         retValue = -1;
 
+    wxRootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
+    gtk_widget_realize( wxRootWindow );
+
     // Here frames insert themselves automatically into wxTopLevelWindows by
     // getting created in OnInit().
     if ( retValue == 0 )
@@ -631,7 +660,7 @@ int wxEntry( int argc, char *argv[] )
 
         if (wxTheApp->Initialized())
         {
-            retValue = wxTheApp->OnRun();
+            wxTheApp->OnRun();
 
             wxWindow *topWindow = wxTheApp->GetTopWindow();
             if (topWindow)
@@ -649,7 +678,8 @@ int wxEntry( int argc, char *argv[] )
                     wxTheApp->SetTopWindow( (wxWindow*) NULL );
                 }
             }
-            wxTheApp->OnExit();
+
+            retValue = wxTheApp->OnExit();
         }
     }