const bool isHotSensitive;
};
+// wxRendererNative interface version
+struct WXDLLEXPORT wxRendererVersion
+{
+ wxRendererVersion(int version_, int age_) : version(version_), age(age_) { }
+
+ // default copy ctor, assignment operator and dtor are ok
+
+ // the current version and age of wxRendererNative interface: different
+ // versions are incompatible (in both ways) while the ages inside the same
+ // version are upwards compatible, i.e. the version of the renderer must
+ // match the version of the main program exactly while the age may be
+ // highergreater or equal to it
+ //
+ // NB: don't forget to increment age after adding any new virtual function!
+ enum
+ {
+ Current_Version = 1,
+ Current_Age = 5
+ };
+
+
+ // check if the given version is compatible with the current one
+ static bool IsCompatible(const wxRendererVersion& ver)
+ {
+ return ver.version == Current_Version && ver.age >= Current_Age;
+ }
+
+ const int version;
+ const int age;
+};
+
// ----------------------------------------------------------------------------
// wxRendererNative: abstracts drawing methods needed by the native controls
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxRendererNative
{
public:
- virtual ~wxRendererNative() { } // stop GCC warning
-
// drawing functions
// -----------------
//
// return the previous renderer used with Set() or NULL if none
static wxRendererNative *Set(wxRendererNative *renderer);
+
+
+ // miscellaneous stuff
+ // -------------------
+
+ // this function is used for version checking: Load() refuses to load any
+ // DLLs implementing an older or incompatible version; it should be
+ // implemented simply by returning wxRendererVersion::Current_XXX values
+ virtual wxRendererVersion GetVersion() const = 0;
+
+ // virtual dtor for any base class
+ virtual ~wxRendererNative();
};
// ----------------------------------------------------------------------------
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win)
{ return m_rendererNative.GetSplitterParams(win); }
+ virtual wxRendererVersion GetVersion() const
+ { return m_rendererNative.GetVersion(); }
+
protected:
wxRendererNative& m_rendererNative;
return wxSplitterRenderParams(0, 0, 0);
}
+ virtual wxRendererVersion GetVersion() const
+ {
+ return wxRendererVersion(wxRendererVersion::Current_Version,
+ wxRendererVersion::Current_Age);
+ }
+
#if 0 // just for debugging
MyDllRenderer()
{
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
-Project: "renddll"=render_renddll.dsp - Package Owner=<4>
+
+Project: "basedll"=..\..\build\msw\wx_basedll.dsp - Package Owner=<4>
Package=<5>
{{{
###############################################################################
-Project: "render"=render_render.dsp - Package Owner=<4>
+Project: "coredll"=..\..\build\msw\wx_coredll.dsp - Package Owner=<4>
Package=<5>
{{{
###############################################################################
+Project: "renddll"=.\render_renddll.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "render"=.\render_render.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
bool m_initialized;
+ // just to suppress a gcc warning
+ friend class wxRendererPtrDummyFriend;
+
DECLARE_NO_COPY_CLASS(wxRendererPtr)
};
// wxRendererNative implementation
// ============================================================================
+wxRendererNative::~wxRendererNative()
+{
+ // empty but necessary
+}
+
// ----------------------------------------------------------------------------
// Managing the global renderer
// ----------------------------------------------------------------------------
if ( !pfnwxCreateRenderer )
return NULL;
+ // create a renderer object
wxRendererNative *renderer = (*pfnwxCreateRenderer)();
if ( !renderer )
return NULL;
+ // check that its version is compatible with ours
+ wxRendererVersion ver = renderer->GetVersion();
+ if ( !wxRendererVersion::IsCompatible(ver) )
+ {
+ wxLogError(_("Renderer \"%s\" has incompatible version %d.%d and couldn't be loaded."),
+ name.c_str(), ver.version, ver.age);
+ delete renderer;
+
+ return NULL;
+ }
+
+ // finally wrap the renderer in an object which will delete it and unload
+ // the library when it is deleted and return it to the caller
return new wxRendererFromDynLib(dll, renderer);
}
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
+ virtual wxRendererVersion GetVersion() const
+ {
+ return wxRendererVersion(wxRendererVersion::Current_Version,
+ wxRendererVersion::Current_Age);
+ }
+
+
// Cleanup by deleting standard renderer
static void Cleanup();