X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/21f4bf4568fe7f0324b777af14b20440d7f76d3b..1f01991fade3cea8a2caeea87df2afe654592616:/utils/wxPython/src/helpers.cpp diff --git a/utils/wxPython/src/helpers.cpp b/utils/wxPython/src/helpers.cpp index e0840d7b2b..a89b3502e8 100644 --- a/utils/wxPython/src/helpers.cpp +++ b/utils/wxPython/src/helpers.cpp @@ -22,7 +22,7 @@ #include "helpers.h" #ifdef __WXGTK__ -#ifdef USE_GDK_IMLIB +#ifdef wxUSE_GDK_IMLIB #include "gdk_imlib/gdk_imlib.h" #endif #endif @@ -44,6 +44,7 @@ extern HINSTANCE wxhInstance; //---------------------------------------------------------------------- // This gets run when the DLL is loaded. We just need to save a handle. //---------------------------------------------------------------------- + BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to DLL module DWORD fdwReason, // reason for calling function @@ -75,6 +76,8 @@ int wxPyApp::MainLoop(void) { void wxPyApp::AfterMainLoop(void) { // more stuff from wxEntry... + +#ifdef __WXMSW__ if (wxPythonApp->GetTopWindow()) { // Forcibly delete the window. if (wxPythonApp->GetTopWindow()->IsKindOf(CLASSINFO(wxFrame)) || @@ -88,6 +91,10 @@ void wxPyApp::AfterMainLoop(void) { wxPythonApp->SetTopWindow(NULL); } } +#endif +#ifdef __WXGTK__ + wxPythonApp->DeletePendingObjects(); +#endif wxPythonApp->OnExit(); #ifdef __WXMSW__ @@ -105,26 +112,19 @@ void wxPyApp::AfterMainLoop(void) { //---------------------------------------------------------------------- - -// Start the user application, user App's OnInit method is a parameter here -PyObject* __wxStart(PyObject* /* self */, PyObject* args) +// 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 +// wxpc is imported. (Before there is a wxApp object.) +void __wxPreStart() { - PyObject* onInitFunc = NULL; - PyObject* arglist; - PyObject* result; - long bResult; - - if (!PyArg_ParseTuple(args, "O", &onInitFunc)) - return NULL; + // Bail out if there is already windows created. This means that the + // toolkit has already been initialized, as in embedding wxPython in + // a C++ wxWindows app. + if (wxTopLevelWindows.Number() > 0) + return; -// This is where we pick up one part of the wxEntry functionality... -// the rest is in AfterMainLoop. #ifdef __WXMSW__ - wxApp::Initialize((WXHINSTANCE)wxhInstance); - - wxPythonApp->argc = 0; - wxPythonApp->argv = NULL; - wxPythonApp->OnInitGui(); + wxApp::Initialize(); #endif #ifdef __WXGTK__ wxClassInfo::InitializeClasses(); @@ -137,23 +137,47 @@ PyObject* __wxStart(PyObject* /* self */, PyObject* args) argv[x] = PyString_AsString(PyList_GetItem(sysargv, x)); argv[argc] = NULL; + gtk_init( &argc, &argv ); + delete [] argv; - wxPythonApp->argc = argc; - wxPythonApp->argv = argv; - - gtk_init( &wxPythonApp->argc, &wxPythonApp->argv ); - -#ifdef USE_GDK_IMLIB +#ifdef wxUSE_GDK_IMLIB gdk_imlib_init(); gtk_widget_push_visual(gdk_imlib_get_visual()); gtk_widget_push_colormap(gdk_imlib_get_colormap()); #endif wxApp::CommonInit(); - wxTheApp->OnInitGui(); - #endif +} + + + +static char* __nullArgv[1] = { 0 }; + +// Start the user application, user App's OnInit method is a parameter here +PyObject* __wxStart(PyObject* /* self */, PyObject* args) +{ + PyObject* onInitFunc = NULL; + PyObject* arglist; + PyObject* result; + long bResult; + + + if (!PyArg_ParseTuple(args, "O", &onInitFunc)) + return NULL; + + if (wxTopLevelWindows.Number() > 0) { + PyErr_SetString(PyExc_TypeError, "Only 1 wxApp per process!"); + return NULL; + } + + + // This is the next part of the wxEntry functionality... + wxPythonApp->argc = 0; + wxPythonApp->argv = __nullArgv; + wxPythonApp->OnInitGui(); + // Call the Python App's OnInit function arglist = PyTuple_New(0); @@ -233,7 +257,7 @@ PyObject* __wxSetDictionary(PyObject* /* self */, PyObject* args) static PyObject* wxPyConstructObject(void* ptr, char* className) { - char buff[64]; // should be big enough... + char buff[64]; // should always be big enough... char swigptr[64]; sprintf(buff, "_%s_p", className); @@ -267,7 +291,6 @@ void wxPyCallback::EventThunker(wxEvent& event) { tuple = PyTuple_New(1); PyTuple_SET_ITEM(tuple, 0, arg); result = PyEval_CallObject(func, tuple); - Py_DECREF(arg); Py_DECREF(tuple); if (result) { Py_DECREF(result); @@ -305,12 +328,12 @@ void wxPyMenu::MenuCallback(wxMenu& menu, wxCommandEvent& evt) { } // Now call the callback... PyObject* func = ((wxPyMenu*)&menu)->func; - PyObject* args = Py_BuildValue("(OO)", menuobj, evtobj); + PyObject* args = PyTuple_New(2); + PyTuple_SET_ITEM(args, 0, menuobj); + PyTuple_SET_ITEM(args, 1, evtobj); PyObject* res = PyEval_CallObject(func, args); Py_DECREF(args); - Py_DECREF(res); - Py_DECREF(evtobj); - Py_DECREF(menuobj); + Py_XDECREF(res); /* In case res is a NULL pointer */ } @@ -341,7 +364,6 @@ void wxPyTimer::Notify() { - //---------------------------------------------------------------------- //---------------------------------------------------------------------- // Some helper functions for typemaps in my_typemaps.i, so they won't be @@ -511,7 +533,6 @@ wxString* wxString_LIST_helper(PyObject* source) { } -#ifdef __WXMSW__ wxAcceleratorEntry* wxAcceleratorEntry_LIST_helper(PyObject* source) { if (!PyList_Check(source)) { PyErr_SetString(PyExc_TypeError, "Expected a list object."); @@ -551,83 +572,36 @@ wxAcceleratorEntry* wxAcceleratorEntry_LIST_helper(PyObject* source) { return temp; } -#endif - //---------------------------------------------------------------------- -// A WinMain for when wxWindows and Python are linked together in a single -// application, instead of as a dynamic module - - -//#if !defined(WIN_PYD) && defined(WIN32) - -//extern "C" int Py_Main(int argc, char** argv); - -//int APIENTRY WinMain(HANDLE hInstance, HANDLE hPrevInstance, LPSTR m_lpCmdLine, -// int nCmdShow ) -//{ - -// wxpCreateApp(); -// // Initialize wxWindows, but don't start the main loop -// wxEntry(hInstance, hPrevInstance, m_lpCmdLine, nCmdShow, FALSE); -// Py_Initialize(); -// PyObject *argvList = PyList_New(0); - -// char* stderrfilename = "wxpstderr.log"; -// int pyargc = 1; -// char* script = NULL; -// int argc = wxPythonApp->argc; -// char** argv = wxPythonApp->argv; - -// for (int i = 1; i < argc; i++) { -// if (strncmp(argv[i], "wxpstderr=", 10) == 0) -// stderrfilename = argv[i]+10; -// else { -// PyList_Append(argvList, PyString_FromString(argv[i])); -// if (!script) -// script = argv[i]; -// pyargc++; -// } -// } - -// PySys_SetObject("argv", argvList); - -//#if 1 -// char buf[256]; -//// //PyRun_SimpleString("import sys; sys.stdout=open('wxpstdout.log','w')"); -// sprintf(buf, "import sys; sys.stdout=sys.stderr=open('%s','w')", stderrfilename); -// PyRun_SimpleString(buf); -//#endif - -// initwxPythonc(); - -// if (script) { -// FILE *fp = fopen(script, "r"); -// if (fp) { -// PyRun_SimpleFile(fp, script);// This returns after wxpApp constructor -// fclose(fp); -// } -// else { -// char msg[256]; -// sprintf(msg, "Cannot open %s", script); -// wxMessageBox(msg); -// } -// } -// else -// PyRun_SimpleString("import wxpide"); - -// return 0; -//} - - -//#endif - -//---------------------------------------------------------------------- ///////////////////////////////////////////////////////////////////////////// // // $Log$ +// Revision 1.13 1998/11/15 23:03:45 RD +// Removing some ifdef's for wxGTK +// +// Revision 1.12 1998/11/03 09:21:08 RD +// fixed a typo +// +// Revision 1.11 1998/10/20 06:43:58 RD +// New wxTreeCtrl wrappers (untested) +// some changes in helpers +// etc. +// +// Revision 1.10 1998/10/02 06:40:39 RD +// +// Version 0.4 of wxPython for MSW. +// +// Revision 1.9 1998/09/25 13:28:52 VZ +// +// USE_xxx constants renamed to wxUSE_xxx. This is an incompatible change, you +// must recompile everything after upgrading! +// +// Revision 1.8 1998/08/27 21:59:08 RD +// Some chicken-and-egg problems solved for wxPython on wxGTK +// // Revision 1.7 1998/08/27 00:00:26 RD // - more tweaks // - have discovered some problems but not yet discovered solutions...