]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/app.cpp
Compilation fix for wxUSE_PROTOCOL && !wxUSE_URL.
[wxWidgets.git] / src / gtk / app.cpp
index a7c984dd3bdc1746228868bc6d204431b8a69cbb..a627c8ee2207cf536472109aaacb3b719cf13d3f 100644 (file)
     wxFORCE_LINK_MODULE(gnome_vfs)
 #endif
 
-//-----------------------------------------------------------------------------
-// global data
-//-----------------------------------------------------------------------------
-
-static GtkWidget *gs_RootWindow = NULL;
-static wxArrayPtrVoid g_arrGdkEvents;
-
-//-----------------------------------------------------------------------------
-// wxYield
-//-----------------------------------------------------------------------------
-
-bool wxApp::DoYield(bool onlyIfNeeded, long eventsToProcess)
-{
-    if ( m_isInsideYield )
-    {
-        if ( !onlyIfNeeded )
-        {
-            wxFAIL_MSG( wxT("wxYield called recursively" ) );
-        }
-
-        return false;
-    }
-
-#if wxUSE_THREADS
-    if ( !wxThread::IsMain() )
-    {
-        // can't call gtk_main_iteration() from other threads like this
-        return true;
-    }
-#endif // wxUSE_THREADS
-
-    m_isInsideYield = true;
-    m_eventsToProcessInsideYield = eventsToProcess;
-
-#if wxUSE_LOG
-    // disable log flushing from here because a call to wxYield() shouldn't
-    // normally result in message boxes popping up &c
-    wxLog::Suspend();
-#endif
-
-    // NOTE: gtk_main_iteration() doesn't allow us to filter events, so we
-    //       rather use gtk_main_do_event() after filtering the events at
-    //       GDK level
-
-    GdkDisplay* disp = gtk_widget_get_display(gs_RootWindow);
-
-    // gdk_display_get_event() will transform X11 events into GDK events
-    // and will queue all of them in the display (private) structure;
-    // finally it will "unqueue" the last one and return it to us
-    GdkEvent* event = gdk_display_get_event(disp);
-    while (event)
-    {
-        // categorize the GDK event according to wxEventCategory.
-        // See http://library.gnome.org/devel/gdk/unstable/gdk-Events.html#GdkEventType
-        // for more info.
-
-        wxEventCategory cat = wxEVT_CATEGORY_UNKNOWN;
-        switch (event->type)
-        {
-        case GDK_SELECTION_REQUEST:
-        case GDK_SELECTION_NOTIFY:
-        case GDK_SELECTION_CLEAR:
-        case GDK_OWNER_CHANGE:
-            cat = wxEVT_CATEGORY_CLIPBOARD;
-            break;
-
-
-        case GDK_KEY_PRESS:
-        case GDK_KEY_RELEASE:
-        case GDK_BUTTON_PRESS:
-        case GDK_2BUTTON_PRESS:
-        case GDK_3BUTTON_PRESS:
-        case GDK_BUTTON_RELEASE:
-        case GDK_SCROLL:        // generated from mouse buttons
-        case GDK_CLIENT_EVENT:
-            cat = wxEVT_CATEGORY_USER_INPUT;
-            break;
-
-
-        case GDK_PROXIMITY_IN:
-        case GDK_PROXIMITY_OUT:
-
-        case GDK_MOTION_NOTIFY:
-        case GDK_ENTER_NOTIFY:
-        case GDK_LEAVE_NOTIFY:
-        case GDK_VISIBILITY_NOTIFY:
-        case GDK_PROPERTY_NOTIFY:
-
-        case GDK_FOCUS_CHANGE:
-        case GDK_CONFIGURE:
-        case GDK_WINDOW_STATE:
-        case GDK_SETTING:
-        case GDK_DELETE:
-        case GDK_DESTROY:
-
-        case GDK_EXPOSE:
-        case GDK_NO_EXPOSE:
-        case GDK_MAP:
-        case GDK_UNMAP:
-        //case GDK_DAMAGE:
-
-        case GDK_DRAG_ENTER:
-        case GDK_DRAG_LEAVE:
-        case GDK_DRAG_MOTION:
-        case GDK_DRAG_STATUS:
-        case GDK_DROP_START:
-        case GDK_DROP_FINISHED:
-        case GDK_GRAB_BROKEN:
-            cat = wxEVT_CATEGORY_UI;
-            break;
-
-        default:
-            cat = wxEVT_CATEGORY_UNKNOWN;
-            break;
-        }
-
-        if (eventsToProcess & cat)
-            gtk_main_do_event(event);       // process it now
-        else
-            g_arrGdkEvents.Add(event);      // process it later
-
-        // get next event
-        event = gdk_display_get_event(disp);
-    }
-
-    if (eventsToProcess != wxEVT_CATEGORY_CLIPBOARD)
-    {
-        // 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). But we
-        // call ProcessIdle() only once since this is not meant for longish
-        // background jobs (controlled by wxIdleEvent::RequestMore() and the
-        // return value of Processidle().
-        ProcessIdle();      // ProcessIdle() also calls ProcessPendingEvents()
-    }
-    //else: if we are inside ~wxClipboardSync() and we call ProcessIdle() and
-    //      the user app contains an UI update handler which calls wxClipboard::IsSupported,
-    //      then we fall into a never-ending loop...
-
-    // put all unprocessed GDK events back in the queue
-    for (size_t i=0; i<g_arrGdkEvents.GetCount(); i++)
-    {
-        GdkEvent* ev = (GdkEvent*)g_arrGdkEvents[i];
-
-        // NOTE: gdk_display_put_event makes a copy of the event passed to it
-        gdk_display_put_event(disp, ev);
-        gdk_event_free(ev);
-    }
-
-    g_arrGdkEvents.Clear();
-
-#if wxUSE_LOG
-    // let the logs be flashed again
-    wxLog::Resume();
-#endif
-
-    m_isInsideYield = false;
-
-    return true;
-}
-
 //-----------------------------------------------------------------------------
 // local functions
 //-----------------------------------------------------------------------------
@@ -276,7 +115,8 @@ bool wxApp::DoIdle()
         id_save = m_idleSourceId;
         m_idleSourceId = 0;
         wx_add_idle_hooks();
-#ifdef __WXDEBUG__
+
+#if wxDEBUG_LEVEL
         // don't generate the idle events while the assert modal dialog is shown,
         // this matches the behavior of wxMSW
         if (m_isInAssert)
@@ -287,6 +127,8 @@ bool wxApp::DoIdle()
     gdk_threads_enter();
     bool needMore;
     do {
+        ProcessPendingEvents();
+
         needMore = ProcessIdle();
     } while (needMore && gtk_events_pending() == 0);
     gdk_threads_leave();
@@ -324,12 +166,14 @@ bool wxApp::DoIdle()
 
 GtkWidget* wxGetRootWindow()
 {
-    if (gs_RootWindow == NULL)
+    static GtkWidget *s_RootWindow = NULL;
+
+    if (s_RootWindow == NULL)
     {
-        gs_RootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
-        gtk_widget_realize( gs_RootWindow );
+        s_RootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
+        gtk_widget_realize( s_RootWindow );
     }
-    return gs_RootWindow;
+    return s_RootWindow;
 }
 
 //-----------------------------------------------------------------------------
@@ -340,9 +184,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler)
 
 wxApp::wxApp()
 {
-#ifdef __WXDEBUG__
     m_isInAssert = false;
-#endif // __WXDEBUG__
+
 #if wxUSE_THREADS
     m_idleMutex = NULL;
 #endif
@@ -468,9 +311,9 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_)
 
     // (1) this variable exists for the sole purpose of specifying the encoding
     //     of the filenames for GTK+ programs, so use it if it is set
-    wxString encName(wxGetenv(_T("G_FILENAME_ENCODING")));
-    encName = encName.BeforeFirst(_T(','));
-    if (encName.CmpNoCase(_T("@locale")) == 0)
+    wxString encName(wxGetenv(wxT("G_FILENAME_ENCODING")));
+    encName = encName.BeforeFirst(wxT(','));
+    if (encName.CmpNoCase(wxT("@locale")) == 0)
         encName.clear();
     encName.MakeUpper();
 #if wxUSE_INTL
@@ -480,13 +323,13 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_)
         //     filenames in this locale too
         encName = wxLocale::GetSystemEncodingName().Upper();
         // (3) finally use UTF-8 by default
-        if (encName.empty() || encName == _T("US-ASCII"))
-            encName = _T("UTF-8");
-        wxSetEnv(_T("G_FILENAME_ENCODING"), encName);
+        if (encName.empty() || encName == wxT("US-ASCII"))
+            encName = wxT("UTF-8");
+        wxSetEnv(wxT("G_FILENAME_ENCODING"), encName);
     }
 #else
     if (encName.empty())
-        encName = _T("UTF-8");
+        encName = wxT("UTF-8");
 
     // if wxUSE_INTL==0 it probably indicates that only "C" locale is supported
     // by the program anyhow so prevent GTK+ from calling setlocale(LC_ALL, "")
@@ -657,25 +500,30 @@ bool wxApp::EventsPending()
     return gtk_events_pending() != 0;
 }
 
-#ifdef __WXDEBUG__
-
 void wxApp::OnAssertFailure(const wxChar *file,
                             int line,
                             const wxChar* func,
                             const wxChar* cond,
                             const wxChar *msg)
 {
-
+    // there is no need to do anything if asserts are disabled in this build
+    // anyhow
+#if wxDEBUG_LEVEL
     // block wx idle events while assert dialog is showing
     m_isInAssert = true;
 
     wxAppBase::OnAssertFailure(file, line, func, cond, msg);
 
     m_isInAssert = false;
+#else // !wxDEBUG_LEVEL
+    wxUnusedVar(file);
+    wxUnusedVar(line);
+    wxUnusedVar(func);
+    wxUnusedVar(cond);
+    wxUnusedVar(msg);
+#endif // wxDEBUG_LEVEL/!wxDEBUG_LEVEL
 }
 
-#endif // __WXDEBUG__
-
 #if wxUSE_THREADS
 void wxGUIAppTraits::MutexGuiEnter()
 {