X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/61ecd22547b600cc595b55055edd3b67479de267..88f67c2242209b8a752b515fdec30fd6ef858a18:/wxPython/src/helpers.cpp diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index 07c2808dc4..af74e074f3 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -1260,7 +1260,7 @@ wxPyCBInputStream::wxPyCBInputStream(const wxPyCBInputStream& other) wxPyCBInputStream::~wxPyCBInputStream() { - wxPyBlock_t blocked; + wxPyBlock_t blocked = wxPyBlock_t_default; if (m_block) blocked = wxPyBeginBlockThreads(); Py_XDECREF(m_read); Py_XDECREF(m_seek); @@ -1270,7 +1270,7 @@ wxPyCBInputStream::~wxPyCBInputStream() { wxPyCBInputStream* wxPyCBInputStream::create(PyObject *py, bool block) { - wxPyBlock_t blocked; + wxPyBlock_t blocked = wxPyBlock_t_default; if (block) blocked = wxPyBeginBlockThreads(); PyObject* read = getMethod(py, "read"); @@ -1724,7 +1724,7 @@ PyObject* wxPyCBH_callCallbackObj(const wxPyCallbackHelper& cbh, PyObject* argTu void wxPyCBH_delete(wxPyCallbackHelper* cbh) { - if (cbh->m_incRef) { + if (cbh->m_incRef && Py_IsInitialized()) { wxPyBlock_t blocked = wxPyBeginBlockThreads(); Py_XDECREF(cbh->m_self); Py_XDECREF(cbh->m_class); @@ -2729,7 +2729,52 @@ bool wxPoint2D_helper(PyObject* source, wxPoint2D** obj) { return true; } error: - PyErr_SetString(PyExc_TypeError, "Expected a 2-tuple of floats or a wxPoint2D object."); + PyErr_SetString(PyExc_TypeError, "Expected a 2-tuple of floats or a wx.Point2D object."); + return false; +} + + + +bool wxRect2D_helper(PyObject* source, wxRect2D** obj) { + + if (source == Py_None) { + **obj = wxRect2D(-1,-1,-1,-1); + return true; + } + + // If source is an object instance then it may already be the right type + if (wxPySwigInstance_Check(source)) { + wxRect2D* ptr; + if (! wxPyConvertSwigPtr(source, (void **)&ptr, wxT("wxRect2D"))) + goto error; + *obj = ptr; + return true; + } + // otherwise a length-4 sequence of floats is expected + if (PySequence_Check(source) && PySequence_Length(source) == 4) { + PyObject* o1 = PySequence_GetItem(source, 0); + PyObject* o2 = PySequence_GetItem(source, 1); + PyObject* o3 = PySequence_GetItem(source, 2); + PyObject* o4 = PySequence_GetItem(source, 3); + // This should really check for floats, not numbers -- but that would break code. + if (!PyNumber_Check(o1) || !PyNumber_Check(o2) || + !PyNumber_Check(o3) || !PyNumber_Check(o4)) { + Py_DECREF(o1); + Py_DECREF(o2); + Py_DECREF(o3); + Py_DECREF(o4); + goto error; + } + **obj = wxRect2D(PyFloat_AsDouble(o1), PyFloat_AsDouble(o2), + PyFloat_AsDouble(o3), PyFloat_AsDouble(o4)); + Py_DECREF(o1); + Py_DECREF(o2); + Py_DECREF(o3); + Py_DECREF(o4); + return true; + } + error: + PyErr_SetString(PyExc_TypeError, "Expected a 4-tuple of floats or a wx.Rect2D object."); return false; }