X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce102f9d50827062a1fe28085537a69d7cda9697..9004ba6af33705cf7cc44e7fd0fe464c878fda2d:/wxPython/src/helpers.cpp diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index f411f31ee8..aa4ebd2986 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -28,7 +28,9 @@ #include #include #include -#define GetXWindow(wxwin) GDK_WINDOW_XWINDOW(GTK_PIZZA((wxwin)->m_wxwindow)->bin_window) +#define GetXWindow(wxwin) (wxwin)->m_wxwindow ? \ + GDK_WINDOW_XWINDOW(GTK_PIZZA((wxwin)->m_wxwindow)->bin_window) : \ + GDK_WINDOW_XWINDOW((wxwin)->m_widget->window) #include #endif @@ -422,7 +424,7 @@ void wxPyApp::_BootstrapApp() // On wxGTK the locale will be changed to match the system settings, but // Python needs to have LC_NUMERIC set to "C" in order for the floating // point conversions and such to work right. -#ifdef __WXGTK__ +#if defined(__WXGTK__) && PYTHON_API_VERSION <= 1012 setlocale(LC_NUMERIC, "C"); #endif @@ -633,7 +635,7 @@ PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args) PyDict_SetItemString(wxPython_dict, "USE_UNICODE", PyInt_FromLong(wxUSE_UNICODE)); PyDict_SetItemString(wxPython_dict, "__WXDEBUG__", PyInt_FromLong(wxdebug)); - + // Make a tuple of strings that gives more info about the platform. PyObject* PlatInfo = PyList_New(0); PyObject* obj; @@ -647,7 +649,7 @@ PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args) #if wxUSE_UNICODE _AddInfoString("unicode"); #else - _AddInfoString("ascii"); + _AddInfoString("ansi"); #endif #ifdef __WXGTK__ #ifdef __WXGTK20__ @@ -1086,11 +1088,12 @@ void wxPySaveThreadState(PyThreadState* tstate) { if (info.tstate != tstate) wxLogMessage("*** tstate mismatch!???"); #endif - // info.tstate = tstate; *** DO NOT update existing ones??? + info.tstate = tstate; // allow for transient tstates // Normally it will never change, but apparently COM callbacks // (i.e. ActiveX controls) will (incorrectly IMHO) use a transient // tstate which will then be garbage the next time we try to use // it... + wxPyTMutex->Unlock(); return; } @@ -1385,8 +1388,8 @@ PyObject* wxPyCBInputStream::getMethod(PyObject* py, char* name) { size_t wxPyCBInputStream::GetSize() const { wxPyCBInputStream* self = (wxPyCBInputStream*)this; // cast off const if (m_seek && m_tell) { - off_t temp = self->OnSysTell(); - off_t ret = self->OnSysSeek(0, wxFromEnd); + wxFileOffset temp = self->OnSysTell(); + wxFileOffset ret = self->OnSysSeek(0, wxFromEnd); self->OnSysSeek(temp, wxFromStart); return ret; } @@ -1426,10 +1429,10 @@ size_t wxPyCBInputStream::OnSysWrite(const void *buffer, size_t bufsize) { return 0; } -off_t wxPyCBInputStream::OnSysSeek(off_t off, wxSeekMode mode) { +wxFileOffset wxPyCBInputStream::OnSysSeek(wxFileOffset off, wxSeekMode mode) { bool blocked = wxPyBeginBlockThreads(); -#ifdef _LARGE_FILES - // off_t is a 64-bit value... +#if defined( __WINCE__) || defined(_LARGE_FILES) || wxHAS_HUGE_FILES + // wxFileOffset is a 64-bit value... PyObject* arglist = Py_BuildValue("(Li)", off, mode); #else PyObject* arglist = Py_BuildValue("(ii)", off, mode); @@ -1442,14 +1445,14 @@ off_t wxPyCBInputStream::OnSysSeek(off_t off, wxSeekMode mode) { } -off_t wxPyCBInputStream::OnSysTell() const { +wxFileOffset wxPyCBInputStream::OnSysTell() const { bool blocked = wxPyBeginBlockThreads(); PyObject* arglist = Py_BuildValue("()"); PyObject* result = PyEval_CallObject(m_tell, arglist); Py_DECREF(arglist); - off_t o = 0; + wxFileOffset o = 0; if (result != NULL) { -#ifdef _LARGE_FILES +#if defined( __WINCE__) || defined(_LARGE_FILES) || wxHAS_HUGE_FILES if (PyLong_Check(result)) o = PyLong_AsLongLong(result); else @@ -1908,12 +1911,18 @@ wxString* wxString_in_helper(PyObject* source) { if (PyString_Check(source)) Py_DECREF(uni); #else - char* tmpPtr; int tmpSize; - if (PyString_AsStringAndSize(source, &tmpPtr, &tmpSize) == -1) { - PyErr_SetString(PyExc_TypeError, "Unable to convert string"); - return NULL; + // Convert to a string object if it isn't already, then to wxString + PyObject* str = source; + if (!PyString_Check(source)) { + str = PyObject_Str(source); + if (PyErr_Occurred()) return NULL; } + char* tmpPtr; int tmpSize; + PyString_AsStringAndSize(str, &tmpPtr, &tmpSize); target = new wxString(tmpPtr, tmpSize); + + if (!PyString_Check(source)) + Py_DECREF(str); #endif // wxUSE_UNICODE return target;