]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/app.cpp
Various changes to make pop up menus work
[wxWidgets.git] / src / gtk1 / app.cpp
index 7b88bc6f5e8c6247b92403b09a75cae334889d52..65710bb24dccd17b3d952cbcc99b9e22ab6e898b 100644 (file)
     #pragma implementation "app.h"
 #endif
 
+#ifdef __VMS
+#include <vms_jackets.h>
+#endif
+
 #include "wx/app.h"
 #include "wx/gdicmn.h"
 #include "wx/utils.h"
 #endif
 
 #include <unistd.h>
+#ifdef __VMS
+# include <poll.h>
+#else
+# include <sys/poll.h>
+#endif
 #include "wx/gtk/win_gtk.h"
 
 #include <gtk/gtk.h>
 wxApp *wxTheApp = (wxApp *)  NULL;
 wxAppInitializerFunction wxAppBase::m_appInitFn = (wxAppInitializerFunction) NULL;
 
-extern bool g_isIdle;
-
 bool   g_mainThreadLocked = FALSE;
 gint   g_pendingTag = 0;
 
 static GtkWidget *gs_RootWindow = (GtkWidget*) NULL;
 
 //-----------------------------------------------------------------------------
-// local functions
+// idle system
 //-----------------------------------------------------------------------------
 
-extern "C"
-{
-    gint wxapp_idle_callback( gpointer WXUNUSED(data) );
-    gint wxapp_pending_callback( gpointer WXUNUSED(data) );
-}
+extern bool g_isIdle;
 
-void wxapp_install_thread_wakeup();
-void wxapp_uninstall_thread_wakeup();
 void wxapp_install_idle_handler();
 
 //-----------------------------------------------------------------------------
@@ -165,29 +166,11 @@ 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) )
+static gint wxapp_pending_callback( gpointer WXUNUSED(data) )
 {
     if (!wxTheApp) return TRUE;
 
@@ -214,7 +197,7 @@ gint wxapp_pending_callback( gpointer WXUNUSED(data) )
     return FALSE;
 }
 
-gint wxapp_idle_callback( gpointer WXUNUSED(data) )
+static gint wxapp_idle_callback( gpointer WXUNUSED(data) )
 {
     if (!wxTheApp)
         return TRUE;
@@ -239,7 +222,7 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) )
     g_isIdle = TRUE;
     wxTheApp->m_idleTag = 0;
 
-    // Sent idle event to all who request them as long as
+    // Send idle event to all who request them as long as
     // no events have popped up in the event queue.
     while (wxTheApp->ProcessIdle() && (gtk_events_pending() == 0))
         ;
@@ -254,69 +237,45 @@ gint wxapp_idle_callback( gpointer WXUNUSED(data) )
 
 #if wxUSE_THREADS
 
-gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) )
+static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout )
 {
-    // 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
+    gint res;
     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 );
+    res = poll( (struct pollfd*) ufds, nfds, timeout );
 
-    // block other thread again
     wxMutexGuiEnter();
-
     g_mainThreadLocked = FALSE;
 
-    wxapp_install_thread_wakeup();
-
-    // release lock again
     gdk_threads_leave();
 
-    return TRUE;
+    return res;
 }
 
 #endif // wxUSE_THREADS
 
 } // extern "C"
 
-#if wxUSE_THREADS
-
-static int g_threadUninstallLevel = 0;
-
-void wxapp_install_thread_wakeup()
-{
-    g_threadUninstallLevel++;
-
-    if (g_threadUninstallLevel != 1) return;
-
-    if (wxTheApp->m_wakeUpTimerTag) return;
-
-    wxTheApp->m_wakeUpTimerTag = gtk_timeout_add( 50, wxapp_wakeup_timerout_callback, (gpointer) NULL );
-}
-
-void wxapp_uninstall_thread_wakeup()
+void wxapp_install_idle_handler()
 {
-    g_threadUninstallLevel--;
+    wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") );
 
-    if (g_threadUninstallLevel != 0) return;
+    g_isIdle = FALSE;
 
-    if (!wxTheApp->m_wakeUpTimerTag) return;
+    if (g_pendingTag == 0)
+        g_pendingTag = gtk_idle_add_priority( 900, wxapp_pending_callback, (gpointer) NULL );
 
-    gtk_timeout_remove( wxTheApp->m_wakeUpTimerTag );
-    wxTheApp->m_wakeUpTimerTag = 0;
+    // 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 );
 }
 
-#endif // wxUSE_THREADS
-
 //-----------------------------------------------------------------------------
 // Access to the root window global
 //-----------------------------------------------------------------------------
@@ -352,8 +311,7 @@ wxApp::wxApp()
     wxapp_install_idle_handler();
 
 #if wxUSE_THREADS
-    m_wakeUpTimerTag = 0;
-    wxapp_install_thread_wakeup();
+    g_main_set_poll_func( wxapp_poll_func );
 #endif
 
     m_colorCube = (unsigned char*) NULL;
@@ -366,10 +324,6 @@ wxApp::~wxApp()
 {
     if (m_idleTag) gtk_idle_remove( m_idleTag );
 
-#if wxUSE_THREADS
-    wxapp_uninstall_thread_wakeup();
-#endif
-
     if (m_colorCube) free(m_colorCube);
 }
 
@@ -561,7 +515,8 @@ bool wxApp::SendIdleEvents( wxWindow* win )
 
         node = node->Next();
     }
-    return needMore ;
+    
+    return needMore;
 }
 
 int wxApp::MainLoop()
@@ -609,8 +564,6 @@ void wxApp::DeletePendingObjects()
 
 bool wxApp::Initialize()
 {
-    wxBuffer = new wxChar[BUFSIZ + 512];
-
     wxClassInfo::InitializeClasses();
 
 #if wxUSE_INTL
@@ -648,9 +601,7 @@ void wxApp::CleanUp()
     wxCleanUpResourceSystem();
 #endif
 
-    if (wxTheColourDatabase)
-        delete wxTheColourDatabase;
-
+    delete wxTheColourDatabase;
     wxTheColourDatabase = (wxColourDatabase*) NULL;
 
     wxDeleteStockObjects();
@@ -660,17 +611,13 @@ void wxApp::CleanUp()
     delete wxTheApp;
     wxTheApp = (wxApp*) NULL;
 
-    // GL: I'm annoyed ... I don't know where to put this and I don't want to
-    // create a module for that as it's part of the core.
+    wxClassInfo::CleanUpClasses();
+
 #if wxUSE_THREADS
     delete wxPendingEvents;
     delete wxPendingEventsLocker;
 #endif
 
-    delete[] wxBuffer;
-
-    wxClassInfo::CleanUpClasses();
-
     // check for memory leaks
 #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
     if (wxDebugContext::CountObjectsLeft(TRUE) > 0)