X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1bf77ee556a5418059139305e9edb05bde9b8a1d..89b674772cc165690533e3226e2f5ab944a27eb3:/src/motif/app.cpp diff --git a/src/motif/app.cpp b/src/motif/app.cpp index 9c202c14b1..3cf1ef5e64 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -13,6 +13,9 @@ #pragma implementation "app.h" #endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + #ifdef __VMS #define XtParent XTPARENT #define XtDisplay XTDISPLAY @@ -26,7 +29,6 @@ #include "wx/intl.h" #include "wx/evtloop.h" #include "wx/hash.h" -#include "wx/hashmap.h" #if wxUSE_THREADS #include "wx/thread.h" @@ -57,8 +59,6 @@ struct wxPerDisplayData Widget m_topLevelWidget; }; -WX_DECLARE_VOIDPTR_HASH_MAP( wxPerDisplayData, wxPerDisplayDataMap ); - static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData, XtPointer ptr); static WXWidget wxCreateTopLevelWidget( WXDisplay* display ); @@ -120,7 +120,7 @@ wxApp::wxApp() argc = 0; argv = NULL; - m_eventLoop = new wxEventLoop; + m_mainLoop = new wxEventLoop; m_mainColormap = (WXColormap) NULL; m_appContext = (WXAppContext) NULL; m_initialDisplay = (WXDisplay*) 0; @@ -129,14 +129,15 @@ wxApp::wxApp() wxApp::~wxApp() { - delete m_eventLoop; + delete m_mainLoop; for( wxPerDisplayDataMap::iterator it = m_perDisplayData->begin(), end = m_perDisplayData->end(); it != end; ++it ) { - delete it->second.m_visualInfo; - XtDestroyWidget( it->second.m_topLevelWidget ); + delete it->second->m_visualInfo; + XtDestroyWidget( it->second->m_topLevelWidget ); + delete it->second; } delete m_perDisplayData; @@ -144,14 +145,6 @@ wxApp::~wxApp() wxApp::SetInstance(NULL); } -bool wxApp::Initialized() -{ - if (GetTopWindow()) - return TRUE; - else - return FALSE; -} - int wxApp::MainLoop() { /* @@ -165,17 +158,11 @@ int wxApp::MainLoop() XDefaultRootWindow(XtDisplay((Widget) wxTheApp->GetTopLevelWidget())), PropertyChangeMask); - m_eventLoop->Run(); + m_mainLoop->Run(); return 0; } -void wxApp::ExitMainLoop() -{ - if( m_eventLoop->IsRunning() ) - m_eventLoop->Exit(); -} - // This should be redefined in a derived class for // handling property change events for XAtom IPC. void wxApp::HandlePropertyChange(WXEvent *event) @@ -255,17 +242,30 @@ WXColormap wxApp::GetMainColormap(WXDisplay* display) return (WXColormap) c; } -wxXVisualInfo* wxApp::GetVisualInfo( WXDisplay* display ) +static inline wxPerDisplayData& GetOrCreatePerDisplayData + ( wxPerDisplayDataMap& m, WXDisplay* display ) { - wxPerDisplayDataMap::iterator it = m_perDisplayData->find( display ); + wxPerDisplayDataMap::iterator it = m.find( display ); + if( it != m.end() && it->second != NULL ) + return *(it->second); + + wxPerDisplayData* nData = new wxPerDisplayData(); + m[display] = nData; + + return *nData; +} - if( it != m_perDisplayData->end() && it->second.m_visualInfo ) - return it->second.m_visualInfo; +wxXVisualInfo* wxApp::GetVisualInfo( WXDisplay* display ) +{ + wxPerDisplayData& data = GetOrCreatePerDisplayData( *m_perDisplayData, + display ); + if( data.m_visualInfo ) + return data.m_visualInfo; wxXVisualInfo* vi = new wxXVisualInfo; wxFillXVisualInfo( vi, (Display*)display ); - (*m_perDisplayData)[display].m_visualInfo = vi; + data.m_visualInfo = vi; return vi; } @@ -298,10 +298,10 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display ) WXWidget wxApp::GetTopLevelWidget() { WXDisplay* display = wxGetDisplay(); - wxPerDisplayDataMap::iterator it = m_perDisplayData->find( display ); - - if( it != m_perDisplayData->end() && it->second.m_topLevelWidget ) - return (WXWidget)it->second.m_topLevelWidget; + wxPerDisplayData& data = GetOrCreatePerDisplayData( *m_perDisplayData, + display ); + if( data.m_topLevelWidget ) + return (WXWidget)data.m_topLevelWidget; WXWidget tlw = wxCreateTopLevelWidget( display ); SetTopLevelWidget( display, tlw ); @@ -311,14 +311,14 @@ WXWidget wxApp::GetTopLevelWidget() void wxApp::SetTopLevelWidget(WXDisplay* display, WXWidget widget) { - (*m_perDisplayData)[display].m_topLevelWidget = (Widget)widget; + (*m_perDisplayData)[display]->m_topLevelWidget = (Widget)widget; } // Yield to other processes bool wxApp::Yield(bool onlyIfNeeded) { - bool s_inYield = FALSE; + static bool s_inYield = FALSE; if ( s_inYield ) {