+//---------------------------------------------------------------------------
+// These Event classes can be derived from in Python and passed through the
+// event system without loosing anything. They do this by keeping a reference
+// to themselves and some special case handling in wxPyCallback::EventThunker.
+
+
+class wxPyEvtSelfRef {
+public:
+ wxPyEvtSelfRef();
+ ~wxPyEvtSelfRef();
+
+ void SetSelf(PyObject* self, bool clone=FALSE);
+ PyObject* GetSelf() const;
+
+protected:
+ PyObject* m_self;
+ bool m_cloned;
+};
+
+
+class wxPyEvent : public wxEvent, public wxPyEvtSelfRef {
+ DECLARE_ABSTRACT_CLASS(wxPyEvent)
+public:
+ wxPyEvent(int id=0);
+ wxPyEvent(const wxPyEvent& evt);
+ ~wxPyEvent();
+
+ virtual wxEvent* Clone() const { return new wxPyEvent(*this); }
+};
+
+
+class wxPyCommandEvent : public wxCommandEvent, public wxPyEvtSelfRef {
+ DECLARE_ABSTRACT_CLASS(wxPyCommandEvent)
+public:
+ wxPyCommandEvent(wxEventType commandType = wxEVT_NULL, int id=0);
+ wxPyCommandEvent(const wxPyCommandEvent& evt);
+ ~wxPyCommandEvent();
+
+ virtual wxEvent* Clone() const { return new wxPyCommandEvent(*this); }
+};
+
+
+
+//----------------------------------------------------------------------
+// Forward decalre a few things used in the exported API
+class wxPyClientData;
+class wxPyUserData;
+class wxPyOORClientData;
+class wxPyCBInputStream;
+
+void wxPyClientData_dtor(wxPyClientData* self);
+void wxPyUserData_dtor(wxPyUserData* self);
+void wxPyOORClientData_dtor(wxPyOORClientData* self);
+wxPyCBInputStream* wxPyCBInputStream_create(PyObject *py, bool block);
+
+
+//---------------------------------------------------------------------------
+// Export a C API in a struct. Other modules will be able to load this from
+// the wxc module and will then have safe access to these functions, even if
+// in another shared library.
+
+class wxPyCallbackHelper;
+
+
+// Make SunCC happy and make typedef's for these that are extern "C"
+typedef void (*p_SWIG_MakePtr_t)(char*, void*, char*);
+typedef char* (*p_SWIG_GetPtr_t)(char*, void**, char*);
+typedef char* (*p_SWIG_GetPtrObj_t)(PyObject*, void**, char*);
+typedef void (*p_SWIG_RegisterMapping_t)(char*, char*, void *(*cast)(void *));
+typedef void (*p_SWIG_addvarlink_t)(PyObject*, char*, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p));
+typedef PyObject* (*p_SWIG_newvarlink_t)(void);
+
+
+struct wxPyCoreAPI {
+
+ p_SWIG_MakePtr_t p_SWIG_MakePtr;
+ p_SWIG_GetPtr_t p_SWIG_GetPtr;
+ p_SWIG_GetPtrObj_t p_SWIG_GetPtrObj;
+ p_SWIG_RegisterMapping_t p_SWIG_RegisterMapping;
+ p_SWIG_addvarlink_t p_SWIG_addvarlink;
+ p_SWIG_newvarlink_t p_SWIG_newvarlink;
+
+ PyThreadState* (*p_wxPyBeginAllowThreads)();
+ void (*p_wxPyEndAllowThreads)(PyThreadState* state);
+ void (*p_wxPyBeginBlockThreads)();
+ void (*p_wxPyEndBlockThreads)();
+
+ PyObject* (*p_wxPyConstructObject)(void *, const wxString&, int);
+ PyObject* (*p_wxPy_ConvertList)(wxListBase* list, const char* className);
+
+ wxString* (*p_wxString_in_helper)(PyObject* source);
+ wxString (*p_Py2wxString)(PyObject* source);
+ PyObject* (*p_wx2PyString)(const wxString& src);
+
+ byte* (*p_byte_LIST_helper)(PyObject* source);
+ int* (*p_int_LIST_helper)(PyObject* source);
+ long* (*p_long_LIST_helper)(PyObject* source);
+ char** (*p_string_LIST_helper)(PyObject* source);
+ wxPoint* (*p_wxPoint_LIST_helper)(PyObject* source, int* npoints);
+ wxBitmap** (*p_wxBitmap_LIST_helper)(PyObject* source);
+ wxString* (*p_wxString_LIST_helper)(PyObject* source);
+ wxAcceleratorEntry* (*p_wxAcceleratorEntry_LIST_helper)(PyObject* source);
+
+ bool (*p_wxSize_helper)(PyObject* source, wxSize** obj);
+ bool (*p_wxPoint_helper)(PyObject* source, wxPoint** obj);
+ bool (*p_wxRealPoint_helper)(PyObject* source, wxRealPoint** obj);
+ bool (*p_wxRect_helper)(PyObject* source, wxRect** obj);
+ bool (*p_wxColour_helper)(PyObject* source, wxColour** obj);
+ bool (*p_wxPoint2DDouble_helper)(PyObject* source, wxPoint2DDouble** obj);
+
+ void (*p_wxPyCBH_setCallbackInfo)(wxPyCallbackHelper& cbh, PyObject* self, PyObject* klass, int incref);
+ bool (*p_wxPyCBH_findCallback)(const wxPyCallbackHelper& cbh, const char* name);
+ int (*p_wxPyCBH_callCallback)(const wxPyCallbackHelper& cbh, PyObject* argTuple);
+ PyObject* (*p_wxPyCBH_callCallbackObj)(const wxPyCallbackHelper& cbh, PyObject* argTuple);
+ void (*p_wxPyCBH_delete)(wxPyCallbackHelper* cbh);
+
+ PyObject* (*p_wxPyClassExists)(const wxString& className);
+ PyObject* (*p_wxPyMake_wxObject)(wxObject* source, bool checkEvtHandler);
+ PyObject* (*p_wxPyMake_wxSizer)(wxSizer* source);
+ void (*p_wxPyPtrTypeMap_Add)(const char* commonName, const char* ptrName);
+ PyObject* (*p_wxArrayString2PyList_helper)(const wxArrayString& arr);
+ PyObject* (*p_wxArrayInt2PyList_helper)(const wxArrayInt& arr);
+
+ void (*p_wxPyClientData_dtor)(wxPyClientData*);
+ void (*p_wxPyUserData_dtor)(wxPyUserData*);
+ void (*p_wxPyOORClientData_dtor)(wxPyOORClientData*);
+
+ wxPyCBInputStream* (*p_wxPyCBInputStream_create)(PyObject *py, bool block);
+
+};
+
+#ifdef wxPyUSE_EXPORT
+// Notice that this is static, not extern. This is by design, each module
+// needs one, but doesn't have to use it.
+static wxPyCoreAPI* wxPyCoreAPIPtr = NULL;
+#endif
+
+
+//---------------------------------------------------------------------------
+
+
+class wxPyUserData : public wxObject {
+public:
+ wxPyUserData(PyObject* obj) {
+ m_obj = obj;
+ Py_INCREF(m_obj);
+ }
+
+ ~wxPyUserData() {
+#ifdef wxPyUSE_EXPORT
+ wxPyCoreAPIPtr->p_wxPyUserData_dtor(this);
+#else
+ wxPyUserData_dtor(this);
+#endif
+ }
+ PyObject* m_obj;
+};
+
+
+class wxPyClientData : public wxClientData {
+public:
+ wxPyClientData(PyObject* obj) {
+ m_obj = obj;
+ Py_INCREF(m_obj);
+ }
+
+ ~wxPyClientData() {
+#ifdef wxPyUSE_EXPORT
+ wxPyCoreAPIPtr->p_wxPyClientData_dtor(this);
+#else
+ wxPyClientData_dtor(this);
+#endif
+ }
+ PyObject* m_obj;
+};