From 0d6f9504aef08d44d8b20df4419f4db9150ef073 Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Thu, 27 Aug 1998 21:59:51 +0000 Subject: [PATCH] Some chicken-and-egg problems solved for wxPython on wxGTK git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@639 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- utils/wxPython/src/Setup.in | 14 ++++--- utils/wxPython/src/gtk/wxp.cpp | 6 +-- utils/wxPython/src/gtk/wxp.py | 5 +-- utils/wxPython/src/helpers.cpp | 72 +++++++++++++++++++++++----------- utils/wxPython/src/helpers.h | 4 ++ utils/wxPython/src/wxp.i | 4 ++ utils/wxPython/tests/test4.py | 15 ++++--- 7 files changed, 79 insertions(+), 41 deletions(-) diff --git a/utils/wxPython/src/Setup.in b/utils/wxPython/src/Setup.in index 935dea032b..d9c764c3d3 100644 --- a/utils/wxPython/src/Setup.in +++ b/utils/wxPython/src/Setup.in @@ -16,7 +16,13 @@ srcdir=$(GENCODEDIR) # value to use the C++ driver to link with instead of the default # C driver. For example: #MY_LDSHARED=$(CCC) -shared -MY_LINKCC=$(CCC) --verbose + +# Same as above, but for statically linking Python and wxPython together, +# in other words, if you comment out the *shared* above. If this is the +# case then you should ensure that the main() function is Python's, not +# wxWindows'. You can rebuild $(WXWIN)/src/gtk/app.cpp with NOMAIN defined +# to force this... +MY_LINKCC=$(CCC) ## Pick one of these, or set your own. This is where the @@ -31,12 +37,8 @@ wxpc wxp.cpp helpers.cpp windows.cpp events.cpp misc.cpp gdi.cpp \ # CFLAGS -I. -I$(WXWIN)/include -I/usr/local/lib/glib/include -I$(WXWIN)/src \ -I/usr/X/include -DSWIG_GLOBAL -D__WXGTK__ \ + -D__WXDEBUG__ \ # LFLAGS -L$(WXWIN)/lib/solaris2.6 -L/usr/X/lib \ -L/usr/local/lib/gcc-lib/sparc-sun-solaris2.6/2.8.1 \ -lwx_gtk -lgtk -lgdk -lglib -lXext -lX11 -lstdc++ -lgcc - - - - - diff --git a/utils/wxPython/src/gtk/wxp.cpp b/utils/wxPython/src/gtk/wxp.cpp index b67af6ddfe..a3ac64da1f 100644 --- a/utils/wxPython/src/gtk/wxp.cpp +++ b/utils/wxPython/src/gtk/wxp.cpp @@ -33,9 +33,8 @@ * and things like that. * * $Log$ - * Revision 1.3 1998/08/27 00:00:54 RD - * - more tweaks - * - have discovered some problems but not yet discovered solutions... + * Revision 1.4 1998/08/27 21:59:29 RD + * Some chicken-and-egg problems solved for wxPython on wxGTK * ************************************************************************/ @@ -1673,6 +1672,7 @@ SWIGEXPORT(void,initwxpc)() { SWIG_addvarlink(SWIG_globals,"wxPyDefaultSize",_wrap_wxPyDefaultSize_get, _wrap_wxPyDefaultSize_set); + __wxPreStart(); // initialize the GUI toolkit, if needed. // wxPyWindows = new wxHashTable(wxKEY_INTEGER, 100); diff --git a/utils/wxPython/src/gtk/wxp.py b/utils/wxPython/src/gtk/wxp.py index d579b4663c..b503c6f4b2 100644 --- a/utils/wxPython/src/gtk/wxp.py +++ b/utils/wxPython/src/gtk/wxp.py @@ -1372,9 +1372,8 @@ class wxApp(wxPyApp): #---------------------------------------------------------------------------- # # $Log$ -# Revision 1.3 1998/08/27 00:00:56 RD -# - more tweaks -# - have discovered some problems but not yet discovered solutions... +# Revision 1.4 1998/08/27 21:59:31 RD +# Some chicken-and-egg problems solved for wxPython on wxGTK # # Revision 1.2 1998/08/18 19:48:12 RD # more wxGTK compatibility things. diff --git a/utils/wxPython/src/helpers.cpp b/utils/wxPython/src/helpers.cpp index e0840d7b2b..6649ed56c8 100644 --- a/utils/wxPython/src/helpers.cpp +++ b/utils/wxPython/src/helpers.cpp @@ -75,6 +75,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 +90,10 @@ void wxPyApp::AfterMainLoop(void) { wxPythonApp->SetTopWindow(NULL); } } +#endif +#ifdef __WXGTK__ + wxPythonApp->DeletePendingObjects(); +#endif wxPythonApp->OnExit(); #ifdef __WXMSW__ @@ -105,26 +111,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. Thi 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(); #endif #ifdef __WXGTK__ wxClassInfo::InitializeClasses(); @@ -137,11 +136,8 @@ PyObject* __wxStart(PyObject* /* self */, PyObject* args) argv[x] = PyString_AsString(PyList_GetItem(sysargv, x)); argv[argc] = NULL; - - wxPythonApp->argc = argc; - wxPythonApp->argv = argv; - - gtk_init( &wxPythonApp->argc, &wxPythonApp->argv ); + gtk_init( &argc, &argv ); + delete [] argv; #ifdef USE_GDK_IMLIB gdk_imlib_init(); @@ -150,10 +146,37 @@ PyObject* __wxStart(PyObject* /* self */, PyObject* args) #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); @@ -628,6 +651,9 @@ wxAcceleratorEntry* wxAcceleratorEntry_LIST_helper(PyObject* source) { ///////////////////////////////////////////////////////////////////////////// // // $Log$ +// 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... diff --git a/utils/wxPython/src/helpers.h b/utils/wxPython/src/helpers.h index fedb01c3c3..3114aa5622 100644 --- a/utils/wxPython/src/helpers.h +++ b/utils/wxPython/src/helpers.h @@ -30,6 +30,7 @@ extern wxPyApp *wxPythonApp; //---------------------------------------------------------------------- +void __wxPreStart(); PyObject* __wxStart(PyObject*, PyObject* args); extern PyObject* wxPython_dict; @@ -102,6 +103,9 @@ private: ///////////////////////////////////////////////////////////////////////////// // // $Log$ +// Revision 1.4 1998/08/27 21:59:09 RD +// Some chicken-and-egg problems solved for wxPython on wxGTK +// // Revision 1.3 1998/08/16 04:31:09 RD // More wxGTK work. // diff --git a/utils/wxPython/src/wxp.i b/utils/wxPython/src/wxp.i index 530211888a..b997b0c89b 100644 --- a/utils/wxPython/src/wxp.i +++ b/utils/wxPython/src/wxp.i @@ -112,6 +112,7 @@ extern "C" SWIGEXPORT(void,initcmndlgsc)(); %init %{ + __wxPreStart(); // initialize the GUI toolkit, if needed. // wxPyWindows = new wxHashTable(wxKEY_INTEGER, 100); @@ -139,6 +140,9 @@ extern "C" SWIGEXPORT(void,initcmndlgsc)(); ///////////////////////////////////////////////////////////////////////////// // // $Log$ +// Revision 1.6 1998/08/27 21:59:10 RD +// Some chicken-and-egg problems solved for wxPython on wxGTK +// // Revision 1.5 1998/08/27 00:00:28 RD // - more tweaks // - have discovered some problems but not yet discovered solutions... diff --git a/utils/wxPython/tests/test4.py b/utils/wxPython/tests/test4.py index 3ab3cf4934..8ea37c3c73 100644 --- a/utils/wxPython/tests/test4.py +++ b/utils/wxPython/tests/test4.py @@ -507,11 +507,6 @@ class MyApp(wxApp): def main(): app = MyApp(0) - import wxPython.gdi - reload(wxPython.gdi) - print wxPython.gdi.wxBLUE - print wxPython.gdi.wxBLUE.this - app.MainLoop() @@ -521,16 +516,21 @@ def t(): # for focused testing... -def t2(): +def main2(): class T2App(wxApp): def OnInit(self): frame = TestLayoutConstraints(NULL) frame.Show(true) self.SetTopWindow(frame) + return true app = T2App(0) app.MainLoop() +def t2(): + import pdb + pdb.run('main2()') + if __name__ == '__main__': @@ -540,6 +540,9 @@ if __name__ == '__main__': #---------------------------------------------------------------------------- # # $Log$ +# Revision 1.4 1998/08/27 21:59:51 RD +# Some chicken-and-egg problems solved for wxPython on wxGTK +# # Revision 1.3 1998/08/27 00:01:17 RD # - more tweaks # - have discovered some problems but not yet discovered solutions... -- 2.47.2