X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/65dd82cbcef74ea4514a7cc1407695cf9b4dba98..dbaf885e8725529ba66653aabe5f7f20bc1f28db:/utils/wxPython/src/helpers.cpp diff --git a/utils/wxPython/src/helpers.cpp b/utils/wxPython/src/helpers.cpp index d73f04007d..9a32b7fc27 100644 --- a/utils/wxPython/src/helpers.cpp +++ b/utils/wxPython/src/helpers.cpp @@ -10,14 +10,12 @@ // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// - -#ifdef __WXGTK__ -#include -#endif +#include // get the correct definition of NULL #undef DEBUG #include #include "helpers.h" + #ifdef __WXMSW__ #include #undef FindWindow @@ -26,7 +24,18 @@ #undef GetClassInfo #undef GetClassName #endif -#include + +#ifdef __WXGTK__ +#include +#include +#include +//#include +//#include +//#include + +extern GtkWidget *wxRootWindow; + +#endif //--------------------------------------------------------------------------- @@ -74,47 +83,32 @@ wxPyApp::~wxPyApp() { // This one isn't acutally called... See __wxStart() bool wxPyApp::OnInit(void) { - return false; + return FALSE; } int wxPyApp::MainLoop(void) { - int retval = wxApp::MainLoop(); -//# AfterMainLoop(); - wxPythonApp->OnExit(); //# - return retval; -} - - -//# void wxPyApp::AfterMainLoop(void) { -// // more stuff from wxEntry... - -// if (wxPythonApp->GetTopWindow()) { -// // Forcibly delete the window. -// if (wxPythonApp->GetTopWindow()->IsKindOf(CLASSINFO(wxFrame)) || -// wxPythonApp->GetTopWindow()->IsKindOf(CLASSINFO(wxDialog))) { + int retval = 0; -// wxPythonApp->GetTopWindow()->Close(TRUE); -// wxPythonApp->DeletePendingObjects(); -// } -// else { -// delete wxPythonApp->GetTopWindow(); -// wxPythonApp->SetTopWindow(NULL); -// } -// } -// #ifdef __WXGTK__ -// wxPythonApp->DeletePendingObjects(); -// #endif + DeletePendingObjects(); +#ifdef __WXGTK__ + m_initialized = wxTopLevelWindows.GetCount() != 0; +#endif -// wxPythonApp->OnExit(); -// wxApp::CleanUp(); -// // delete wxPythonApp; -// } + if (Initialized()) { + retval = wxApp::MainLoop(); + wxPythonApp->OnExit(); + } + return retval; +} //--------------------------------------------------------------------- -// a few native methods to add to the module //---------------------------------------------------------------------- +int WXDLLEXPORT wxEntryStart( int argc, char** argv ); +int WXDLLEXPORT wxEntryInitGui(); +void WXDLLEXPORT wxEntryCleanup(); + // This is where we pick up the first part of the wxEntry functionality... // The rest is in __wxStart and AfterMainLoop. This function is called when @@ -131,11 +125,7 @@ void __wxPreStart() if (wxTopLevelWindows.Number() > 0) return; -#ifdef __WXMSW__ - wxApp::Initialize(); -#endif -#ifdef __WXGTK__ PyObject* sysargv = PySys_GetObject("argv"); int argc = PyList_Size(sysargv); char** argv = new char*[argc+1]; @@ -144,22 +134,11 @@ void __wxPreStart() argv[x] = PyString_AsString(PyList_GetItem(sysargv, x)); argv[argc] = NULL; - gtk_set_locale(); -#if wxUSE_WCHAR_T - if (!wxOKlibc()) wxConvCurrent = &wxConvLocal; -#else - if (!wxOKlibc()) wxConvCurrent = (wxMBConv*) NULL; -#endif - gtk_init( &argc, &argv ); - wxSetDetectableAutoRepeat( TRUE ); - delete [] argv; - - wxApp::Initialize(); // may return FALSE. Should we check? -#endif - + wxEntryStart(argc, argv); } + #ifdef WXP_WITH_THREAD PyThreadState* wxPyEventThreadState = NULL; #endif @@ -191,8 +170,8 @@ PyObject* __wxStart(PyObject* /* self */, PyObject* args) // This is the next part of the wxEntry functionality... wxPythonApp->argc = 0; wxPythonApp->argv = NULL; - wxPythonApp->OnInitGui(); + wxEntryInitGui(); // Call the Python App's OnInit function arglist = PyTuple_New(0); @@ -207,19 +186,21 @@ PyObject* __wxStart(PyObject* /* self */, PyObject* args) } bResult = PyInt_AS_LONG(result); if (! bResult) { - PyErr_SetString(PyExc_SystemExit, "OnInit returned false, exiting..."); + PyErr_SetString(PyExc_SystemExit, "OnInit returned FALSE, exiting..."); return NULL; } #ifdef __WXGTK__ - wxTheApp->m_initialized = (wxTopLevelWindows.Number() > 0); + wxTheApp->m_initialized = (wxTopLevelWindows.GetCount() > 0); #endif Py_INCREF(Py_None); return Py_None; } - +void __wxCleanup() { + wxEntryCleanup(); +} @@ -382,12 +363,14 @@ void wxPyCallback::EventThunker(wxEvent& event) { wxPyCallbackHelper::wxPyCallbackHelper() { m_self = NULL; m_lastFound = NULL; + m_incRef = FALSE; } wxPyCallbackHelper::~wxPyCallbackHelper() { bool doSave = wxPyRestoreThread(); - Py_XDECREF(m_self); + if (m_incRef) + Py_XDECREF(m_self); wxPySaveThread(doSave); } @@ -401,6 +384,7 @@ wxPyCallbackHelper::wxPyCallbackHelper(const wxPyCallbackHelper& other) { void wxPyCallbackHelper::setSelf(PyObject* self, int incref) { m_self = self; + m_incRef = incref; if (incref) Py_INCREF(m_self); } @@ -450,20 +434,20 @@ PyObject* wxPyCallbackHelper::callCallbackObj(PyObject* argTuple) { // themselves and some special case handling in wxPyCallback::EventThunker. -wxPySelfRef::wxPySelfRef() { +wxPyEvtSelfRef::wxPyEvtSelfRef() { //m_self = Py_None; // **** We don't do normal ref counting to prevent //Py_INCREF(m_self); // circular loops... - m_cloned = false; + m_cloned = FALSE; } -wxPySelfRef::~wxPySelfRef() { +wxPyEvtSelfRef::~wxPyEvtSelfRef() { bool doSave = wxPyRestoreThread(); if (m_cloned) Py_DECREF(m_self); wxPySaveThread(doSave); } -void wxPySelfRef::SetSelf(PyObject* self, bool clone) { +void wxPyEvtSelfRef::SetSelf(PyObject* self, bool clone) { bool doSave = wxPyRestoreThread(); if (m_cloned) Py_DECREF(m_self); @@ -475,7 +459,7 @@ void wxPySelfRef::SetSelf(PyObject* self, bool clone) { wxPySaveThread(doSave); } -PyObject* wxPySelfRef::GetSelf() const { +PyObject* wxPyEvtSelfRef::GetSelf() const { Py_INCREF(m_self); return m_self; } @@ -571,6 +555,25 @@ PyObject* wxPy_ConvertList(wxListBase* list, const char* className) { return pyList; } +//---------------------------------------------------------------------- + +long wxPyGetWinHandle(wxWindow* win) { +#ifdef __WXMSW__ + return (long)win->GetHandle(); +#endif + + // Find and return the actual X-Window. +#ifdef __WXGTK__ + if (win->m_wxwindow) { + GdkWindowPrivate* bwin = (GdkWindowPrivate*)GTK_PIZZA(win->m_wxwindow)->bin_window; + if (bwin) { + return (long)bwin->xwindow; + } + } +#endif + return 0; +} + //---------------------------------------------------------------------- // Some helper functions for typemaps in my_typemaps.i, so they won't be // included in every file...