X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3eb1aad7ec1331a5331f03a1913156fdbed9fcc4..0063a4dce6b65152b94e80c9f55c402198cef047:/wxPython/src/helpers.cpp diff --git a/wxPython/src/helpers.cpp b/wxPython/src/helpers.cpp index 0c2e631e36..c01fa664a4 100644 --- a/wxPython/src/helpers.cpp +++ b/wxPython/src/helpers.cpp @@ -23,9 +23,18 @@ #endif #ifdef __WXGTK__ +#include +#include #include #include #include +#define GetXWindow(wxwin) GDK_WINDOW_XWINDOW((wxwin)->m_widget->window) +#include +#endif + +#ifdef __WXX11__ +#include "wx/x11/privx.h" +#define GetXWindow(wxwin) ((Window)(wxwin)->GetHandle()) #endif #ifdef __WXMAC__ @@ -390,15 +399,28 @@ void wxPyApp::_BootstrapApp() } wxPyEndBlockThreads(blocked); + // Initialize wxWidgets result = wxEntryStart(argc, argv); delete [] argv; blocked = wxPyBeginBlockThreads(); if (! result) { - PyErr_SetString(PyExc_SystemError, "wxEntryStart failed!"); + PyErr_SetString(PyExc_SystemError, + "wxEntryStart failed, unable to initialize wxWidgets!" +#ifdef __WXGTK__ + " (Is DISPLAY set properly?)" +#endif + ); goto error; } + // 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__ + setlocale(LC_NUMERIC, "C"); +#endif + // The stock objects were all NULL when they were loaded into // SWIG generated proxies, so re-init those now... wxPy_ReinitStockObjects(3); @@ -429,7 +451,6 @@ void wxPyApp::_BootstrapApp() result = True; } - if (! result) { PyErr_SetString(PyExc_SystemExit, "OnInit returned False, exiting..."); } @@ -490,8 +511,8 @@ inline const char* dropwx(const char* name) { //---------------------------------------------------------------------- -// This function is called when the wxc module is imported to do some initial -// setup. (Before there is a wxApp object.) The rest happens in +// This function is called when the wx._core_ module is imported to do some +// initial setup. (Before there is a wxApp object.) The rest happens in // wxPyApp::_BootstrapApp void __wxPyPreStart(PyObject* moduleDict) { @@ -515,6 +536,8 @@ void __wxPyPreStart(PyObject* moduleDict) // Init the stock objects to a non-NULL value so SWIG doesn't create them as None wxPy_ReinitStockObjects(1); + + wxInitAllImageHandlers(); } @@ -535,7 +558,7 @@ void __wxPyCleanup() { } -// Save a reference to the dictionary of the wx.core module, and inject +// Save a reference to the dictionary of the wx._core module, and inject // a few more things into it. PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args) { @@ -553,7 +576,7 @@ PyObject* __wxPySetDictionary(PyObject* /* self */, PyObject* args) PyDict_SetItemString(wxPython_dict, "__wxPyPtrTypeMap", wxPyPtrTypeMap); // Create an exception object to use for wxASSERTions - wxPyAssertionError = PyErr_NewException("wx.core.PyAssertionError", + wxPyAssertionError = PyErr_NewException("wx._core.PyAssertionError", PyExc_AssertionError, NULL); PyDict_SetItemString(wxPython_dict, "PyAssertionError", wxPyAssertionError); @@ -642,20 +665,20 @@ bool wxPySwigInstance_Check(PyObject* obj) { //--------------------------------------------------------------------------- -// The stock objects are no longer created when the wxc module is imported, -// but only after the app object has been created. The +// The stock objects are no longer created when the wx._core_ module is +// imported, but only after the app object has been created. The // wxPy_ReinitStockObjects function will be called 3 times to pass the stock // objects though various stages of evolution: // // pass 1: Set all the pointers to a non-NULL value so the Python proxy -// object will be created (otherwise it will just use None.) +// object will be created (otherwise SWIG will just use None.) // // pass 2: After the module has been imported and the python proxys have // been created, then set the __class__ to be _wxPyUnbornObject so // it will catch any access to the object and will raise an exception. // -// pass 3: Finally, from OnInit patch things up so the stock objects can -// be used. +// pass 3: Finally, from BootstrapApp patch things up so the stock objects +// can be used. PyObject* __wxPyFixStockObjects(PyObject* /* self */, PyObject* args) @@ -712,6 +735,17 @@ static void rsoPass3(const char* name, const char* classname, void* ptr) void wxPy_ReinitStockObjects(int pass) { + // If there is already an App object then wxPython is probably embedded in + // a wx C++ application, so there is no need to do all this. + static bool embedded = false; + if ((pass == 1 || pass == 2) && wxTheApp) { + embedded = true; + return; + } + if (pass == 3 && embedded) + return; + + #define REINITOBJ(name, classname) \ if (pass == 1) { name = (classname*)0xC0C0C0C0; } \ else if (pass == 2) { rsoPass2(#name); } \ @@ -722,17 +756,7 @@ void wxPy_ReinitStockObjects(int pass) if (pass == 1) { } \ else if (pass == 2) { rsoPass2(#name); } \ else if (pass == 3) { rsoPass3(#name, #classname, (void*)&name); } - - // If there is already an App object then wxPython is probably embedded in - // a wx C++ application, so there is no need to do all this. - static bool embedded = false; - if ((pass == 1 || pass == 2) && wxTheApp) { - embedded = true; - return; - } - if (pass == 3 && embedded) - return; - + REINITOBJ(wxNORMAL_FONT, wxFont); REINITOBJ(wxSMALL_FONT, wxFont); @@ -1805,22 +1829,13 @@ long wxPyGetWinHandle(wxWindow* win) { return (long)win->GetHandle(); #endif - // Find and return the actual X-Window. -#ifdef __WXGTK__ - if (win->m_wxwindow) { -#ifdef __WXGTK20__ - return (long) GDK_WINDOW_XWINDOW(GTK_PIZZA(win->m_wxwindow)->bin_window); -#else - GdkWindowPrivate* bwin = (GdkWindowPrivate*)GTK_PIZZA(win->m_wxwindow)->bin_window; - if (bwin) { - return (long)bwin->xwindow; - } +#if defined(__WXGTK__) || defined(__WXX11) + return (long)GetXWindow(win); #endif - } -#endif - + #ifdef __WXMAC__ - return (long)MAC_WXHWND(win->MacGetRootWindow()); + //return (long)MAC_WXHWND(win->MacGetTopLevelWindowRef()); + return (long)win->GetHandle(); #endif return 0;