#include "wx/wxPython/wxPython_int.h"
#include "wx/wxPython/pyistream.h"
#include "wx/wxPython/swigver.h"
+#include "wx/wxPython/twoitem.h"
#ifdef __WXMSW__
#include <wx/msw/private.h>
#ifdef __WXDEBUG__
-void wxPyApp::OnAssert(const wxChar *file,
- int line,
- const wxChar *cond,
- const wxChar *msg) {
-
+void wxPyApp::OnAssertFailure(const wxChar *file,
+ int line,
+ const wxChar *func,
+ const wxChar *cond,
+ const wxChar *msg)
+{
// if we're not fully initialized then just log the error
if (! m_startupComplete) {
wxString buf;
buf.Alloc(4096);
buf.Printf(wxT("%s(%d): assert \"%s\" failed"),
file, line, cond);
- if (msg != NULL) {
- buf += wxT(": ");
- buf += msg;
- }
+ if ( func && *func )
+ buf << wxT(" in ") << func << wxT("()");
+ if (msg != NULL)
+ buf << wxT(": ") << msg;
+
wxLogDebug(buf);
return;
}
if (m_assertMode & wxPYAPP_ASSERT_EXCEPTION) {
wxString buf;
buf.Alloc(4096);
- buf.Printf(wxT("C++ assertion \"%s\" failed in %s(%d)"), cond, file, line);
- if (msg != NULL) {
- buf += wxT(": ");
- buf += msg;
- }
+ buf.Printf(wxT("C++ assertion \"%s\" failed at %s(%d)"), cond, file, line);
+ if ( func && *func )
+ buf << wxT(" in ") << func << wxT("()");
+ if (msg != NULL)
+ buf << wxT(": ") << msg;
+
// set the exception
wxPyBlock_t blocked = wxPyBeginBlockThreads();
buf.Alloc(4096);
buf.Printf(wxT("%s(%d): assert \"%s\" failed"),
file, line, cond);
- if (msg != NULL) {
- buf += wxT(": ");
- buf += msg;
- }
+ if ( func && *func )
+ buf << wxT(" in ") << func << wxT("()");
+ if (msg != NULL)
+ buf << wxT(": ") << msg;
wxLogDebug(buf);
}
// do the normal wx assert dialog?
if (m_assertMode & wxPYAPP_ASSERT_DIALOG)
- wxApp::OnAssert(file, line, cond, msg);
+ wxApp::OnAssertFailure(file, line, func, cond, msg);
}
}
#endif
// wxSystemOptions::SetOption(wxT("mac.textcontrol-use-mlte"), 1);
- // The stock objects were all NULL when they were loaded into
- // SWIG generated proxies, so re-init those now...
- wxPy_ReinitStockObjects(3);
-
wxPyEndBlockThreads(blocked);
haveInitialized = true;
}
// It's now ok to generate exceptions for assertion errors.
wxPythonApp->SetStartupComplete(true);
- // Call the Python wxApp's OnInit function
+
+ // Call the Python wxApp's OnPreInit and OnInit functions
blocked = wxPyBeginBlockThreads();
+ if (wxPyCBH_findCallback(m_myInst, "OnPreInit")) {
+ PyObject* method = m_myInst.GetLastFound();
+ PyObject* argTuple = PyTuple_New(0);
+ retval = PyEval_CallObject(method, argTuple);
+ m_myInst.clearRecursionGuard(method);
+ Py_DECREF(argTuple);
+ Py_DECREF(method);
+ if (retval == NULL)
+ goto error;
+ }
if (wxPyCBH_findCallback(m_myInst, "OnInit")) {
PyObject* method = m_myInst.GetLastFound();
// Ensure that the build options in the DLL (or whatever) match this build
wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "wxPython");
- // Init the stock objects to a non-NULL value so SWIG doesn't create them as None
- wxPy_ReinitStockObjects(1);
-
wxInitAllImageHandlers();
}
-//---------------------------------------------------------------------------
-
-// The stock objects are no longer created when the wx._core_ module is
-// imported, but only after the app object has been created. The
-// wxPy_ReinitStockObjects function will be called 3 times to pass the stock
-// objects though various stages of evolution:
-//
-// pass 1: Set all the pointers to a non-NULL value so the Python proxy
-// object will be created (otherwise SWIG will just use None.)
-//
-// pass 2: After the module has been imported and the python proxys have
-// been created, then set the __class__ to be _wxPyUnbornObject so
-// it will catch any access to the object and will raise an exception.
-//
-// pass 3: Finally, from BootstrapApp patch things up so the stock objects
-// can be used.
-
-
-PyObject* __wxPyFixStockObjects(PyObject* /* self */, PyObject* args)
-{
- wxPy_ReinitStockObjects(2);
- RETURN_NONE();
-}
-
-
-static void rsoPass2(const char* name)
-{
- static PyObject* unbornObjectClass = NULL;
- PyObject* obj;
-
- if (unbornObjectClass == NULL) {
- unbornObjectClass = PyDict_GetItemString(wxPython_dict, "_wxPyUnbornObject");
- Py_INCREF(unbornObjectClass);
- }
-
- // Find the object instance
- obj = PyDict_GetItemString(wxPython_dict, (char*)dropwx(name));
- wxCHECK_RET(obj != NULL, wxT("Unable to find stock object"));
- wxCHECK_RET(wxPySwigInstance_Check(obj), wxT("Not a swig instance"));
-
- // Change its class
- PyObject_SetAttrString(obj, "__class__", unbornObjectClass);
-
-}
-
-static void rsoPass3(const char* name, const char* classname, void* ptr)
-{
- PyObject* obj;
- PyObject* classobj;
- PyObject* ptrobj;
-
- // Find the object instance
- obj = PyDict_GetItemString(wxPython_dict, (char*)dropwx(name));
- wxCHECK_RET(obj != NULL, wxT("Unable to find stock object"));
- wxCHECK_RET(wxPySwigInstance_Check(obj), wxT("Not a swig instance"));
-
- // Find the class object and put it back in the instance
- classobj = PyDict_GetItemString(wxPython_dict, (char*)dropwx(classname));
- wxCHECK_RET(classobj != NULL, wxT("Unable to find stock class object"));
- PyObject_SetAttrString(obj, "__class__", classobj);
-
- // Rebuild the .this swigified pointer with the new value of the C++ pointer
- ptrobj = wxPyMakeSwigPtr(ptr, wxString(classname, *wxConvCurrent));
- PyObject_SetAttrString(obj, "this", ptrobj);
- Py_DECREF(ptrobj);
-}
-
-
-
-void wxPy_ReinitStockObjects(int pass)
-{
-
- // If there is already an App object then wxPython is probably embedded in
- // a wx C++ application, so there is no need to do all this.
- static bool embedded = false;
- if ((pass == 1 || pass == 2) && wxTheApp) {
- embedded = true;
- return;
- }
- if (pass == 3 && embedded)
- return;
-
-
-#define REINITOBJ(name, classname) \
- if (pass == 1) { name = (classname*)0xC0C0C0C0; } \
- else if (pass == 2) { rsoPass2(#name); } \
- else if (pass == 3) { rsoPass3(#name, #classname, (void*)name); }
-
-
-#define REINITOBJ2(name, classname) \
- if (pass == 1) { } \
- else if (pass == 2) { rsoPass2(#name); } \
- else if (pass == 3) { rsoPass3(#name, #classname, (void*)&name); }
-
-
- REINITOBJ(wxNORMAL_FONT, wxFont);
- REINITOBJ(wxSMALL_FONT, wxFont);
- REINITOBJ(wxITALIC_FONT, wxFont);
- REINITOBJ(wxSWISS_FONT, wxFont);
-
- REINITOBJ(wxRED_PEN, wxPen);
- REINITOBJ(wxCYAN_PEN, wxPen);
- REINITOBJ(wxGREEN_PEN, wxPen);
- REINITOBJ(wxBLACK_PEN, wxPen);
- REINITOBJ(wxWHITE_PEN, wxPen);
- REINITOBJ(wxTRANSPARENT_PEN, wxPen);
- REINITOBJ(wxBLACK_DASHED_PEN, wxPen);
- REINITOBJ(wxGREY_PEN, wxPen);
- REINITOBJ(wxMEDIUM_GREY_PEN, wxPen);
- REINITOBJ(wxLIGHT_GREY_PEN, wxPen);
-
- REINITOBJ(wxBLUE_BRUSH, wxBrush);
- REINITOBJ(wxGREEN_BRUSH, wxBrush);
- REINITOBJ(wxWHITE_BRUSH, wxBrush);
- REINITOBJ(wxBLACK_BRUSH, wxBrush);
- REINITOBJ(wxTRANSPARENT_BRUSH, wxBrush);
- REINITOBJ(wxCYAN_BRUSH, wxBrush);
- REINITOBJ(wxRED_BRUSH, wxBrush);
- REINITOBJ(wxGREY_BRUSH, wxBrush);
- REINITOBJ(wxMEDIUM_GREY_BRUSH, wxBrush);
- REINITOBJ(wxLIGHT_GREY_BRUSH, wxBrush);
-
- REINITOBJ(wxBLACK, wxColour);
- REINITOBJ(wxWHITE, wxColour);
- REINITOBJ(wxRED, wxColour);
- REINITOBJ(wxBLUE, wxColour);
- REINITOBJ(wxGREEN, wxColour);
- REINITOBJ(wxCYAN, wxColour);
- REINITOBJ(wxLIGHT_GREY, wxColour);
-
- REINITOBJ(wxSTANDARD_CURSOR, wxCursor);
- REINITOBJ(wxHOURGLASS_CURSOR, wxCursor);
- REINITOBJ(wxCROSS_CURSOR, wxCursor);
-
- REINITOBJ2(wxNullBitmap, wxBitmap);
- REINITOBJ2(wxNullIcon, wxIcon);
- REINITOBJ2(wxNullCursor, wxCursor);
- REINITOBJ2(wxNullPen, wxPen);
- REINITOBJ2(wxNullBrush, wxBrush);
- REINITOBJ2(wxNullPalette, wxPalette);
- REINITOBJ2(wxNullFont, wxFont);
- REINITOBJ2(wxNullColour, wxColour);
-
- REINITOBJ(wxTheFontList, wxFontList);
- REINITOBJ(wxThePenList, wxPenList);
- REINITOBJ(wxTheBrushList, wxBrushList);
- REINITOBJ(wxTheColourDatabase, wxColourDatabase);
-
-
- REINITOBJ2(wxDefaultValidator, wxValidator);
- REINITOBJ2(wxNullImage, wxImage);
- REINITOBJ2(wxNullAcceleratorTable, wxAcceleratorTable);
-
-#undef REINITOBJ
-#undef REINITOBJ2
-}
-
//---------------------------------------------------------------------------
// Check for existence of a wxApp, setting an exception if there isn't one.
// }
-bool wxPyCallbackHelper::findCallback(const char* name) const {
+bool wxPyCallbackHelper::findCallback(const char* name, bool setGuard) const {
wxPyCallbackHelper* self = (wxPyCallbackHelper*)this; // cast away const
PyObject *method, *klass;
PyObject* nameo = PyString_FromString(name);
// ...then we'll save a pointer to the method so callCallback can
// call it. But first, set a recursion guard in case the
// overridden method wants to call the base class version.
- setRecursionGuard(method);
+ if (setGuard)
+ setRecursionGuard(method);
self->m_lastFound = method;
}
else {
cbh.setSelf(self, klass, incref);
}
-bool wxPyCBH_findCallback(const wxPyCallbackHelper& cbh, const char* name) {
- return cbh.findCallback(name);
+bool wxPyCBH_findCallback(const wxPyCallbackHelper& cbh, const char* name, bool setGuard) {
+ return cbh.findCallback(name, setGuard);
}
int wxPyCBH_callCallback(const wxPyCallbackHelper& cbh, PyObject* argTuple) {
str = PyObject_Str(source);
if (PyErr_Occurred()) return NULL;
}
- char* tmpPtr; int tmpSize;
+ char* tmpPtr; Py_ssize_t tmpSize;
PyString_AsStringAndSize(str, &tmpPtr, &tmpSize);
target = new wxString(tmpPtr, tmpSize);
str = PyObject_Str(source);
if (PyErr_Occurred()) return wxEmptyString; // TODO: should we PyErr_Clear?
}
- char* tmpPtr; int tmpSize;
+ char* tmpPtr; Py_ssize_t tmpSize;
PyString_AsStringAndSize(str, &tmpPtr, &tmpSize);
target = wxString(tmpPtr, tmpSize);