From: Vadim Zeitlin Date: Wed, 6 Aug 2003 18:14:44 +0000 (+0000) Subject: added Load() and Set() methods X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/9f2be1259350586411e21c84024967408eef6280 added Load() and Set() methods git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22648 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/renderer.h b/include/wx/renderer.h index fb831c39b5..ba5cb2611a 100644 --- a/include/wx/renderer.h +++ b/include/wx/renderer.h @@ -144,6 +144,22 @@ public: // return the default (native) implementation for this platform static wxRendererNative& GetDefault(); + + + // changing the global renderer + // ---------------------------- + +#if wxUSE_DYNLIB_CLASS + // load the renderer from the specified DLL, the returned pointer must be + // deleted by caller if not NULL when it is not used any more + static wxRendererNative *Load(const wxString& name); +#endif // wxUSE_DYNLIB_CLASS + + // set the renderer to use, passing NULL reverts to using the default + // renderer + // + // return the previous renderer used with Set() or NULL if none + static wxRendererNative *Set(wxRendererNative *renderer); }; // ---------------------------------------------------------------------------- diff --git a/src/common/rendcmn.cpp b/src/common/rendcmn.cpp index 96a0c68318..77bfdde516 100644 --- a/src/common/rendcmn.cpp +++ b/src/common/rendcmn.cpp @@ -32,6 +32,10 @@ #include "wx/ptr_scpd.h" +#if wxUSE_DYNLIB_CLASS + #include "wx/dynlib.h" +#endif // wxUSE_DYNLIB_CLASS + // ---------------------------------------------------------------------------- // wxRendererPtr: auto pointer holding the global renderer // ---------------------------------------------------------------------------- @@ -42,8 +46,6 @@ wxDEFINE_SCOPED_PTR(wxRendererNative, wxRendererPtrBase); class wxRendererPtr : public wxRendererPtrBase { public: - wxRendererPtr() : wxRendererPtrBase(NULL) { m_initialized = false; } - // return true if we have a renderer, false otherwise bool IsOk() { @@ -58,7 +60,17 @@ public: return get() != NULL; } + // return the global and unique wxRendererPtr + static wxRendererPtr& Get() + { + static wxRendererPtr s_renderer; + + return s_renderer; + } + private: + wxRendererPtr() : wxRendererPtrBase(NULL) { m_initialized = false; } + void DoInit() { wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; @@ -74,15 +86,97 @@ private: DECLARE_NO_COPY_CLASS(wxRendererPtr) }; +#if wxUSE_DYNLIB_CLASS + +// ---------------------------------------------------------------------------- +// wxRendererFromDynLib: represents a renderer dynamically loaded from a DLL +// ---------------------------------------------------------------------------- + +class wxRendererFromDynLib : public wxDelegateRendererNative +{ +public: + // create the object wrapping the given renderer created from this DLL + // + // we take ownership of the pointer and will delete it (and also unload the + // DLL) when we're deleted + wxRendererFromDynLib(wxDynamicLibrary& dll, wxRendererNative *renderer) + : wxDelegateRendererNative(*renderer), + m_renderer(renderer), + m_dllHandle(dll.Detach()) + { + } + + virtual ~wxRendererFromDynLib() + { + delete m_renderer; + wxDynamicLibrary::Unload(m_dllHandle); + } + +private: + wxRendererNative *m_renderer; + wxDllType m_dllHandle; +}; + +#endif // wxUSE_DYNLIB_CLASS + // ============================================================================ // wxRendererNative implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// Managing the global renderer +// ---------------------------------------------------------------------------- + /* static */ wxRendererNative& wxRendererNative::Get() { - static wxRendererPtr s_renderer; + wxRendererPtr& renderer = wxRendererPtr::Get(); - return s_renderer.IsOk() ? *s_renderer.get() : GetDefault(); + return renderer.IsOk() ? *renderer.get() : GetDefault(); } +/* static */ +wxRendererNative *wxRendererNative::Set(wxRendererNative *rendererNew) +{ + wxRendererPtr& renderer = wxRendererPtr::Get(); + + wxRendererNative *rendererOld = renderer.release(); + + renderer.reset(rendererNew); + + return rendererOld; +} + + +// ---------------------------------------------------------------------------- +// Dynamic renderers loading +// ---------------------------------------------------------------------------- + +#if wxUSE_DYNLIB_CLASS + +/* static */ +wxRendererNative *wxRendererNative::Load(const wxString& name) +{ + wxString fullname = wxDynamicLibrary::CanonicalizePluginName(name); + + wxDynamicLibrary dll(fullname); + if ( !dll.IsLoaded() ) + return NULL; + + // each theme DLL must export a wxCreateRenderer() function with this + // signature + typedef wxRendererNative *(*wxCreateRenderer_t)(); + + wxDYNLIB_FUNCTION(wxCreateRenderer_t, wxCreateRenderer, dll); + if ( !pfnwxCreateRenderer ) + return NULL; + + wxRendererNative *renderer = (*pfnwxCreateRenderer)(); + if ( !renderer ) + return NULL; + + return new wxRendererFromDynLib(dll, renderer); +} + +#endif // wxUSE_DYNLIB_CLASS +