X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/61ecd22547b600cc595b55055edd3b67479de267..f6342fb5e6524edffa219d5843536ea279bba4df:/wxPython/src/helpers.cpp?ds=inline diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index 07c2808dc4..3e7a8e9c9c 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -297,6 +297,17 @@ void wxPyApp::MacOpenFile(const wxString &fileName) wxPyEndBlockThreads(blocked); } +void wxPyApp::MacOpenURL(const wxString &url) +{ + wxPyBlock_t blocked = wxPyBeginBlockThreads(); + if (wxPyCBH_findCallback(m_myInst, "MacOpenURL")) { + PyObject* s = wx2PyString(url); + wxPyCBH_callCallback(m_myInst, Py_BuildValue("(O)", s)); + Py_DECREF(s); + } + wxPyEndBlockThreads(blocked); +} + void wxPyApp::MacPrintFile(const wxString &fileName) { wxPyBlock_t blocked = wxPyBeginBlockThreads(); @@ -1260,7 +1271,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 +1281,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 +1735,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); @@ -1873,8 +1884,7 @@ wxString* wxString_in_helper(PyObject* source) { target = new wxString(); size_t len = PyUnicode_GET_SIZE(uni); if (len) { - PyUnicode_AsWideChar((PyUnicodeObject*)uni, target->GetWriteBuf(len), len); - target->UngetWriteBuf(len); + PyUnicode_AsWideChar((PyUnicodeObject*)uni, wxStringBuffer(*target, len), len); } if (PyString_Check(source)) @@ -1916,8 +1926,7 @@ wxString Py2wxString(PyObject* source) } size_t len = PyUnicode_GET_SIZE(uni); if (len) { - PyUnicode_AsWideChar((PyUnicodeObject*)uni, target.GetWriteBuf(len), len); - target.UngetWriteBuf(); + PyUnicode_AsWideChar((PyUnicodeObject*)uni, wxStringBuffer(target, len), len); } if (!PyUnicode_Check(source)) @@ -2526,6 +2535,17 @@ bool wxPoint_helper(PyObject* source, wxPoint** obj) +bool wxPosition_helper(PyObject* source, wxPosition** obj) +{ + if (source == Py_None) { + **obj = wxPosition(-1,-1); + return true; + } + return wxPyTwoIntItem_helper(source, obj, wxT("wxPosition")); +} + + + bool wxRealPoint_helper(PyObject* source, wxRealPoint** obj) { if (source == Py_None) { @@ -2729,7 +2749,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; }