]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/app.cpp
applied patch #424066
[wxWidgets.git] / src / gtk / app.cpp
index e29797d061470572dbe7d4d4f45f64411b7754dd..07fadb9ea6c2abba67c103b86e479372eed1a079 100644 (file)
@@ -52,7 +52,7 @@ extern bool g_isIdle;
 bool   g_mainThreadLocked = FALSE;
 gint   g_pendingTag = 0;
 
 bool   g_mainThreadLocked = FALSE;
 gint   g_pendingTag = 0;
 
-GtkWidget *wxRootWindow = (GtkWidget*) NULL;
+static GtkWidget *gs_RootWindow = (GtkWidget*) NULL;
 
 //-----------------------------------------------------------------------------
 // local functions
 
 //-----------------------------------------------------------------------------
 // local functions
@@ -80,6 +80,8 @@ void wxExit()
 // wxYield
 //-----------------------------------------------------------------------------
 
 // wxYield
 //-----------------------------------------------------------------------------
 
+static bool gs_inYield = FALSE;
+
 bool wxYield()
 {
 #if wxUSE_THREADS
 bool wxYield()
 {
 #if wxUSE_THREADS
@@ -91,14 +93,12 @@ bool wxYield()
 #endif // wxUSE_THREADS
 
 #ifdef __WXDEBUG__
 #endif // wxUSE_THREADS
 
 #ifdef __WXDEBUG__
-    static bool s_inYield = FALSE;
-    
-    if (s_inYield)
+    if (gs_inYield)
         wxFAIL_MSG( wxT("wxYield called recursively" ) );
         wxFAIL_MSG( wxT("wxYield called recursively" ) );
-    
-    s_inYield = TRUE;
 #endif
 
 #endif
 
+    gs_inYield = TRUE;
+
     if (!g_isIdle)
     {
         // We need to remove idle callbacks or the loop will
     if (!g_isIdle)
     {
         // We need to remove idle callbacks or the loop will
@@ -123,13 +123,24 @@ bool wxYield()
     // let the logs be flashed again
     wxLog::Resume();
 
     // let the logs be flashed again
     wxLog::Resume();
 
-#ifdef __WXDEBUG__
-    s_inYield = FALSE;
-#endif
+    gs_inYield = FALSE;
 
     return TRUE;
 }
 
 
     return TRUE;
 }
 
+//-----------------------------------------------------------------------------
+// wxYieldIfNeeded
+// Like wxYield, but fails silently if the yield is recursive.
+//-----------------------------------------------------------------------------
+
+bool wxYieldIfNeeded()
+{
+    if (gs_inYield)
+        return FALSE;
+
+    return wxYield();
+}
+
 //-----------------------------------------------------------------------------
 // wxWakeUpIdle
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // wxWakeUpIdle
 //-----------------------------------------------------------------------------
@@ -157,7 +168,7 @@ void wxWakeUpIdle()
 gint wxapp_pending_callback( gpointer WXUNUSED(data) )
 {
     if (!wxTheApp) return TRUE;
 gint wxapp_pending_callback( gpointer WXUNUSED(data) )
 {
     if (!wxTheApp) return TRUE;
-    
+
     // 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
     // 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
@@ -184,7 +195,7 @@ gint wxapp_pending_callback( gpointer WXUNUSED(data) )
 gint wxapp_idle_callback( gpointer WXUNUSED(data) )
 {
     if (!wxTheApp) return TRUE;
 gint wxapp_idle_callback( gpointer WXUNUSED(data) )
 {
     if (!wxTheApp) return TRUE;
-    
+
     // 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
     // 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
@@ -217,7 +228,7 @@ void wxapp_install_idle_handler()
 
     if (g_pendingTag == 0)
         g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL );
 
     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
     /* 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
@@ -234,7 +245,7 @@ static int g_threadUninstallLevel = 0;
 void wxapp_install_thread_wakeup()
 {
     g_threadUninstallLevel++;
 void wxapp_install_thread_wakeup()
 {
     g_threadUninstallLevel++;
-    
+
     if (g_threadUninstallLevel != 1) return;
 
     if (wxTheApp->m_wakeUpTimerTag) return;
     if (g_threadUninstallLevel != 1) return;
 
     if (wxTheApp->m_wakeUpTimerTag) return;
@@ -245,7 +256,7 @@ void wxapp_install_thread_wakeup()
 void wxapp_uninstall_thread_wakeup()
 {
     g_threadUninstallLevel--;
 void wxapp_uninstall_thread_wakeup()
 {
     g_threadUninstallLevel--;
-    
+
     if (g_threadUninstallLevel != 0) return;
 
     if (!wxTheApp->m_wakeUpTimerTag) return;
     if (g_threadUninstallLevel != 0) return;
 
     if (!wxTheApp->m_wakeUpTimerTag) return;
@@ -615,6 +626,19 @@ void wxApp::CleanUp()
 #endif // wxUSE_LOG
 }
 
 #endif // wxUSE_LOG
 }
 
+//-----------------------------------------------------------------------------
+// Access to the root window global
+//-----------------------------------------------------------------------------
+
+GtkWidget* wxGetRootWindow()
+{
+    if (gs_RootWindow == NULL) {
+        gs_RootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
+        gtk_widget_realize( gs_RootWindow );
+    }
+    return gs_RootWindow;
+}
+
 //-----------------------------------------------------------------------------
 // wxEntry
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // wxEntry
 //-----------------------------------------------------------------------------
@@ -665,6 +689,7 @@ int wxEntryStart( int argc, char *argv[] )
     return 0;
 }
 
     return 0;
 }
 
+
 int wxEntryInitGui()
 {
     int retValue = 0;
 int wxEntryInitGui()
 {
     int retValue = 0;
@@ -672,8 +697,7 @@ int wxEntryInitGui()
     if ( !wxTheApp->OnInitGui() )
         retValue = -1;
 
     if ( !wxTheApp->OnInitGui() )
         retValue = -1;
 
-    wxRootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
-    gtk_widget_realize( wxRootWindow );
+    wxGetRootWindow();
 
     return retValue;
 }
 
     return retValue;
 }