X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/955a919785b76a1826e6b8d55f696a0dfb62a318..f8405d6e6fc2a361d9710dfdaea0b158952803aa:/src/motif/app.cpp?ds=sidebyside diff --git a/src/motif/app.cpp b/src/motif/app.cpp index e5381193b1..30ddd80a6d 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -9,10 +9,13 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #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" @@ -36,6 +38,7 @@ #pragma message disable nosimpint #endif #include +#include #include #include #include @@ -51,14 +54,16 @@ struct wxPerDisplayData { wxPerDisplayData() - { m_visualInfo = NULL; m_topLevelWidget = NULL; } + { + m_visualInfo = NULL; + m_topLevelWidget = NULL; + m_topLevelRealizedWidget = NULL; + } wxXVisualInfo* m_visualInfo; - Widget m_topLevelWidget; + Widget m_topLevelWidget, m_topLevelRealizedWidget; }; -WX_DECLARE_VOIDPTR_HASH_MAP( wxPerDisplayData, wxPerDisplayDataMap ); - static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData, XtPointer ptr); static WXWidget wxCreateTopLevelWidget( WXDisplay* display ); @@ -120,7 +125,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,27 +134,20 @@ 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; - wxTheApp = NULL; -} - -bool wxApp::Initialized() -{ - if (GetTopWindow()) - return TRUE; - else - return FALSE; + wxApp::SetInstance(NULL); } int wxApp::MainLoop() @@ -165,36 +163,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(); -} - -// Is a message/event pending? -bool wxApp::Pending() -{ - return m_eventLoop->Pending(); -#if 0 - XFlush(XtDisplay( (Widget) wxTheApp->GetTopLevelWidget() )); - - // Fix by Doug from STI, to prevent a stall if non-X event - // is found. - return ((XtAppPending( (XtAppContext) GetAppContext() ) & XtIMXEvent) != 0) ; -#endif -} - -// Dispatch a message. -void wxApp::Dispatch() -{ - m_eventLoop->Dispatch(); -} - // This should be redefined in a derived class for // handling property change events for XAtom IPC. void wxApp::HandlePropertyChange(WXEvent *event) @@ -234,7 +207,7 @@ bool wxApp::OnInitGui() // if you don't log to stderr, nothing will be shown... delete wxLog::SetActiveTarget(new wxLogStderr); wxString className(wxTheApp->GetClassName()); - wxLogError(_("wxWindows could not open display for '%s': exiting."), + wxLogError(_("wxWidgets could not open display for '%s': exiting."), className.c_str()); exit(-1); } @@ -274,17 +247,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; } @@ -293,8 +279,12 @@ static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData, XtPointer ptr) { if( wxTheApp ) + { wxTheApp->SetTopLevelWidget( (WXDisplay*)XtDisplay(w), (WXWidget)NULL ); + wxTheApp->SetTopLevelRealizedWidget( (WXDisplay*)XtDisplay(w), + (WXWidget)NULL ); + } } WXWidget wxCreateTopLevelWidget( WXDisplay* display ) @@ -304,8 +294,9 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display ) applicationShellWidgetClass, (Display*)display, NULL, 0 ); - XtSetMappedWhenManaged( tlw, False ); - XtRealizeWidget( tlw ); + XtVaSetValues( tlw, + XmNoverrideRedirect, True, + NULL ); XtAddCallback( tlw, XmNdestroyCallback, (XtCallbackProc)wxTLWidgetDestroyCallback, @@ -314,13 +305,24 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display ) return (WXWidget)tlw; } +WXWidget wxCreateTopLevelRealizedWidget( WXDisplay* display ) +{ + Widget rTlw = XtVaCreateWidget( "dummy_widget", xmLabelWidgetClass, + (Widget)wxTheApp->GetTopLevelWidget(), + NULL); + XtSetMappedWhenManaged( rTlw, False ); + XtRealizeWidget( rTlw ); + + return (WXWidget)rTlw; +} + 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 ); @@ -328,16 +330,37 @@ WXWidget wxApp::GetTopLevelWidget() return tlw; } +WXWidget wxApp::GetTopLevelRealizedWidget() +{ + WXDisplay* display = wxGetDisplay(); + wxPerDisplayDataMap::iterator it = m_perDisplayData->find( display ); + + if( it != m_perDisplayData->end() && it->second->m_topLevelRealizedWidget ) + return (WXWidget)it->second->m_topLevelRealizedWidget; + + WXWidget rTlw = wxCreateTopLevelRealizedWidget( display ); + SetTopLevelRealizedWidget( display, rTlw ); + + return rTlw; +} + void wxApp::SetTopLevelWidget(WXDisplay* display, WXWidget widget) { - (*m_perDisplayData)[display].m_topLevelWidget = (Widget)widget; + GetOrCreatePerDisplayData( *m_perDisplayData, display ) + .m_topLevelWidget = (Widget)widget; +} + +void wxApp::SetTopLevelRealizedWidget(WXDisplay* display, WXWidget widget) +{ + GetOrCreatePerDisplayData( *m_perDisplayData, display ) + .m_topLevelRealizedWidget = (Widget)widget; } // Yield to other processes bool wxApp::Yield(bool onlyIfNeeded) { - bool s_inYield = FALSE; + static bool s_inYield = FALSE; if ( s_inYield ) {