]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/app.cpp
corrected preproc condition
[wxWidgets.git] / src / motif / app.cpp
index d17e8fc734efeba00f42164bdd69c844bd6230f5..3cf1ef5e64a54a17badda39a60dd49e8f026323f 100644 (file)
@@ -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 );
@@ -135,8 +135,9 @@ wxApp::~wxApp()
                                        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;
@@ -241,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);
 
-    if( it != m_perDisplayData->end() && it->second.m_visualInfo )
-        return it->second.m_visualInfo;
+    wxPerDisplayData* nData = new wxPerDisplayData();
+    m[display] = nData;
+
+    return *nData;
+}
+
+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;
 }
@@ -284,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 );
@@ -297,7 +311,7 @@ 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