]> git.saurik.com Git - wxWidgets.git/blobdiff - src/dfb/app.cpp
Fixed wxAtomicInc/Dec() to not use asm/atomic.h header on Linux - it's kernel interna...
[wxWidgets.git] / src / dfb / app.cpp
index 2cac31028be7194d4b18dab6b947e248b8d87038..9fac9fec8673f619727125dd11b80884264b1aa6 100644 (file)
 
 IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)
 
-BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)
-    EVT_IDLE(wxAppBase::OnIdle)
-END_EVENT_TABLE()
-
 wxApp::wxApp()
 {
 }
@@ -45,9 +41,60 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
     if ( !wxAppBase::Initialize(argc, argv) )
         return false;
 
+    // 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 ( 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;
 
+#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;
 
@@ -105,7 +152,7 @@ void wxApp::WakeUpIdle()
         wxMutexGuiEnter();
 #endif
 
-    wxEventLoop * const loop = wxEventLoop::GetActive();
+    wxEventLoopBase * const loop = wxEventLoop::GetActive();
     if ( loop )
         loop->WakeUp();
 
@@ -137,9 +184,12 @@ bool wxApp::Yield(bool onlyIfNeeded)
 
     s_inYield = true;
 
+#if wxUSE_LOG
     wxLog::Suspend();
+#endif // wxUSE_LOG
 
-    wxEventLoop * const loop = wxEventLoop::GetActive();
+    wxEventLoop * const
+        loop = wx_static_cast(wxEventLoop *, wxEventLoop::GetActive());
     if ( loop )
         loop->Yield();
 
@@ -148,7 +198,9 @@ bool wxApp::Yield(bool onlyIfNeeded)
     // OnUpdateUI() which is a nice (and desired) side effect)
     while ( ProcessIdle() ) {}
 
+#if wxUSE_LOG
     wxLog::Resume();
+#endif // wxUSE_LOG
 
     s_inYield = false;