X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d7ae4a62645d369fbd6b8b5f3f0e12ee86536da1..74a3342702bf3a76a845f65f4510fd8612d3d802:/src/dfb/app.cpp diff --git a/src/dfb/app.cpp b/src/dfb/app.cpp index 5f7a8004eb..ad9144d250 100644 --- a/src/dfb/app.cpp +++ b/src/dfb/app.cpp @@ -19,6 +19,7 @@ #include "wx/app.h" #include "wx/evtloop.h" +#include "wx/thread.h" #include "wx/dfb/private.h" #include "wx/private/fontmgr.h" @@ -28,10 +29,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler) -BEGIN_EVENT_TABLE(wxApp, wxEvtHandler) - EVT_IDLE(wxAppBase::OnIdle) -END_EVENT_TABLE() - wxApp::wxApp() { } @@ -45,9 +42,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 +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()) @@ -135,20 +185,23 @@ bool wxApp::Yield(bool onlyIfNeeded) s_inYield = 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::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;