X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bdcade0a101893a5030ac2e91dabc79e1388b0a3..06014e4f3684574357a22cf2ea481b2b5a0406c3:/src/motif/app.cpp diff --git a/src/motif/app.cpp b/src/motif/app.cpp index 3cf1ef5e64..30ddd80a6d 100644 --- a/src/motif/app.cpp +++ b/src/motif/app.cpp @@ -38,6 +38,7 @@ #pragma message disable nosimpint #endif #include +#include #include #include #include @@ -53,10 +54,14 @@ 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; }; static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData, @@ -202,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,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 ) @@ -285,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, @@ -295,6 +305,17 @@ 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(); @@ -309,9 +330,30 @@ 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