]> git.saurik.com Git - wxWidgets.git/blobdiff - src/dfb/app.cpp
Fixes #10382: Memory leak in wxDataViewMainWindow::IsExpanded
[wxWidgets.git] / src / dfb / app.cpp
index 31bdf0f3504a7b599004917702787e1c2ddcf38e..c95912e53866c75d74b0b69b56ac506831b9838f 100644 (file)
@@ -19,7 +19,9 @@
 #include "wx/app.h"
 
 #include "wx/evtloop.h"
+#include "wx/thread.h"
 #include "wx/dfb/private.h"
+#include "wx/private/fontmgr.h"
 
 //-----------------------------------------------------------------------------
 // wxApp initialization
 
 IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
 
-BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
-    EVT_IDLE(wxAppBase::OnIdle)
-END_EVENT_TABLE()
-
 wxApp::wxApp()
 {
 }
@@ -39,24 +37,67 @@ wxApp::~wxApp()
 {
 }
 
-IDirectFBPtr wxApp::GetDirectFBInterface()
-{
-    return m_dfb;
-}
-
 bool wxApp::Initialize(int& argc, wxChar **argv)
 {
     if ( !wxAppBase::Initialize(argc, argv) )
         return false;
 
-    if ( !DFB_CALL( DirectFBInit(&argc, &argv) ) )
+    // FIXME-UTF8: This code is taken from wxGTK and duplicated here. This
+    //             is just a temporary fix to make wxDFB compile in Unicode
+    //             build, the real fix is to change Initialize()'s signature
+    //             to use char* on Unix.
+#if wxUSE_UNICODE
+    // DirectFBInit() wants UTF-8, not wchar_t, so convert
+    int i;
+    char **argvDFB = new char *[argc + 1];
+    for ( i = 0; i < argc; i++ )
+    {
+        argvDFB[i] = strdup(wxConvUTF8.cWX2MB(argv[i]));
+    }
+
+    argvDFB[argc] = NULL;
+
+    int argcDFB = argc;
+
+    if ( !wxDfbCheckReturn(DirectFBInit(&argcDFB, &argvDFB)) )
         return false;
 
-    if ( !DFB_CALL( DirectFBCreate(&m_dfb) ) )
+    if ( argcDFB != argc )
+    {
+        // we have to drop the parameters which were consumed by DFB+
+        for ( i = 0; i < argcDFB; i++ )
+        {
+            while ( strcmp(wxConvUTF8.cWX2MB(argv[i]), argvDFB[i]) != 0 )
+            {
+                memmove(argv + i, argv + i + 1, (argc - i)*sizeof(*argv));
+            }
+        }
+
+        argc = argcDFB;
+    }
+    //else: DirectFBInit() didn't modify our parameters
+
+    // free our copy
+    for ( i = 0; i < argcDFB; i++ )
+    {
+        free(argvDFB[i]);
+    }
+
+    delete [] argvDFB;
+
+#else // ANSI
+
+    if ( !wxDfbCheckReturn(DirectFBInit(&argc, &argv)) )
         return false;
 
-    #warning "FIXME: theme override is temporary"
-    wxTheme::Set(wxTheme::Create(_T("gtk")));
+#endif // Unicode/ANSI
+
+    // update internal arg[cv] as DFB may have removed processed options:
+    this->argc = argc;
+    this->argv = argv;
+
+    if ( !wxIDirectFB::Get() )
+        return false;
 
     return true;
 }
@@ -65,7 +106,10 @@ void wxApp::CleanUp()
 {
     wxAppBase::CleanUp();
 
-    m_dfb.Reset();
+    wxFontsManager::CleanUp();
+
+    wxEventLoop::CleanUp();
+    wxIDirectFB::CleanUp();
 }
 
 //-----------------------------------------------------------------------------
@@ -74,16 +118,11 @@ void wxApp::CleanUp()
 
 static wxVideoMode GetCurrentVideoMode()
 {
-    wxVideoMode m;
-
-    IDirectFBSurfacePtr surface(wxDfbGetPrimarySurface());
-    if ( !surface )
-        return m; // invalid
-
-    DFB_CALL( surface->GetSize(surface, &m.w, &m.h) );
-    m.bpp = wxDfbGetSurfaceDepth(surface);
+    wxIDirectFBDisplayLayerPtr layer(wxIDirectFB::Get()->GetDisplayLayer());
+    if ( !layer )
+        return wxVideoMode(); // invalid
 
-    return m;
+    return layer->GetVideoMode();
 }
 
 wxVideoMode wxApp::GetDisplayMode() const
@@ -96,7 +135,7 @@ wxVideoMode wxApp::GetDisplayMode() const
 
 bool wxApp::SetDisplayMode(const wxVideoMode& mode)
 {
-    if ( !DFB_CALL( m_dfb->SetVideoMode(m_dfb, mode.w, mode.h, mode.bpp) ) )
+    if ( !wxIDirectFB::Get()->SetVideoMode(mode.w, mode.h, mode.bpp) )
         return false;
 
     m_videoMode = mode;
@@ -114,7 +153,9 @@ void wxApp::WakeUpIdle()
         wxMutexGuiEnter();
 #endif
 
-    wxEventLoop::GetActive()->WakeUp();
+    wxEventLoopBase * const loop = wxEventLoop::GetActive();
+    if ( loop )
+        loop->WakeUp();
 
 #if wxUSE_THREADS
     if (!wxThread::IsMain())
@@ -130,9 +171,7 @@ bool wxApp::Yield(bool onlyIfNeeded)
         return true; // can't process events from other threads
 #endif // wxUSE_THREADS
 
-    static bool s_inYield = false;
-
-    if ( s_inYield )
+    if ( m_isInsideYield )
     {
         if ( !onlyIfNeeded )
         {
@@ -142,24 +181,27 @@ bool wxApp::Yield(bool onlyIfNeeded)
         return false;
     }
 
-    s_inYield = true;
+    m_isInsideYield = true;
 
+#if wxUSE_LOG
     wxLog::Suspend();
+#endif // wxUSE_LOG
 
-    if ( wxEventLoop::GetActive() )
-    {
-        while (wxEventLoop::GetActive()->Pending())
-            wxEventLoop::GetActive()->Dispatch();
-    }
+    wxEventLoop * const
+        loop = static_cast<wxEventLoop *>(wxEventLoop::GetActive());
+    if ( loop )
+        loop->Yield();
 
     // 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 ( ProcessIdle() ) {}
 
+#if wxUSE_LOG
     wxLog::Resume();
+#endif // wxUSE_LOG
 
-    s_inYield = false;
+    m_isInsideYield = false;
 
     return true;
 }