X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b3c861501a451503b31c075ccb59d16b0ae01e99..cbbb1f548962b30c43849e29fd64eceb4d8720e8:/src/dfb/app.cpp diff --git a/src/dfb/app.cpp b/src/dfb/app.cpp index 31bdf0f350..0cc0506b3f 100644 --- a/src/dfb/app.cpp +++ b/src/dfb/app.cpp @@ -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 @@ -27,10 +29,6 @@ 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; @@ -109,57 +148,9 @@ bool wxApp::SetDisplayMode(const wxVideoMode& mode) void wxApp::WakeUpIdle() { -#if wxUSE_THREADS - if (!wxThread::IsMain()) - wxMutexGuiEnter(); -#endif - - wxEventLoop::GetActive()->WakeUp(); - -#if wxUSE_THREADS - if (!wxThread::IsMain()) - wxMutexGuiLeave(); -#endif -} - - -bool wxApp::Yield(bool onlyIfNeeded) -{ -#if wxUSE_THREADS - if ( !wxThread::IsMain() ) - return true; // can't process events from other threads -#endif // wxUSE_THREADS - - static bool s_inYield = false; - - if ( s_inYield ) - { - if ( !onlyIfNeeded ) - { - wxFAIL_MSG( wxT("wxYield called recursively" ) ); - } - - return false; - } - - s_inYield = true; - - wxLog::Suspend(); - - if ( wxEventLoop::GetActive() ) - { - while (wxEventLoop::GetActive()->Pending()) - wxEventLoop::GetActive()->Dispatch(); - } - - // 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() ) {} - - wxLog::Resume(); - - s_inYield = false; - - return true; + // we don't need a mutex here, since we use the wxConsoleEventLoop + // and wxConsoleEventLoop::WakeUp() is thread-safe + wxEventLoopBase * const loop = wxEventLoop::GetActive(); + if ( loop ) + loop->WakeUp(); }