From 5a2e3d8c47db7f95d504ecd45f58b96c56572dd1 Mon Sep 17 00:00:00 2001 From: Mattia Barbon Date: Sat, 22 May 2004 18:01:33 +0000 Subject: [PATCH] Do not realize the top level shell that acts as a parent for top level windows. Add a realized child for the shell for functions requiring it (clipboard at the moment). Use XtPopup to show top level widgets, as per Motif guidelines. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27397 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/motif/app.h | 3 +++ src/motif/app.cpp | 52 ++++++++++++++++++++++++++++++++++++++---- src/motif/clipbrd.cpp | 6 ++--- src/motif/dialog.cpp | 4 ++-- src/motif/frame.cpp | 11 ++++----- 5 files changed, 60 insertions(+), 16 deletions(-) diff --git a/include/wx/motif/app.h b/include/wx/motif/app.h index 65dbc0c1b8..1007941b48 100644 --- a/include/wx/motif/app.h +++ b/include/wx/motif/app.h @@ -76,10 +76,13 @@ public: // Motif-specific WXAppContext GetAppContext() const { return m_appContext; } WXWidget GetTopLevelWidget(); + WXWidget GetTopLevelRealizedWidget(); WXColormap GetMainColormap(WXDisplay* display); WXDisplay* GetInitialDisplay() const { return m_initialDisplay; } void SetTopLevelWidget(WXDisplay* display, WXWidget widget); + void SetTopLevelRealizedWidget(WXDisplay* display, + WXWidget widget); // This handler is called when a property change event occurs virtual void HandlePropertyChange(WXEvent *event); diff --git a/src/motif/app.cpp b/src/motif/app.cpp index 3cf1ef5e64..4ff6242196 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, @@ -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 diff --git a/src/motif/clipbrd.cpp b/src/motif/clipbrd.cpp index 2f8d636d09..4af95a45ad 100644 --- a/src/motif/clipbrd.cpp +++ b/src/motif/clipbrd.cpp @@ -283,7 +283,7 @@ bool wxClipboard::AddData( wxDataObject *data ) m_data.Append( data ); Display* xdisplay = wxGlobalDisplay(); - Widget xwidget = (Widget)wxTheApp->GetTopLevelWidget(); + Widget xwidget = (Widget)wxTheApp->GetTopLevelRealizedWidget(); Window xwindow = XtWindow( xwidget ); wxXmString label( wxTheApp->GetAppName() ); Time timestamp = XtLastTimestampProcessed( xdisplay ); @@ -333,7 +333,7 @@ void wxClipboard::Close() bool wxClipboard::IsSupported(const wxDataFormat& format) { Display* xdisplay = wxGlobalDisplay(); - Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelWidget() ); + Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelRealizedWidget() ); bool isSupported = false; int retval, count; unsigned long max_name_length; @@ -393,7 +393,7 @@ bool wxClipboard::GetData( wxDataObject& data ) wxCHECK_MSG( m_open, false, "clipboard not open" ); Display* xdisplay = wxGlobalDisplay(); - Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelWidget() ); + Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelRealizedWidget() ); Time timestamp = XtLastTimestampProcessed( xdisplay ); wxDataFormat chosenFormat; diff --git a/src/motif/dialog.cpp b/src/motif/dialog.cpp index 28922a01dd..55d0b2fbef 100644 --- a/src/motif/dialog.cpp +++ b/src/motif/dialog.cpp @@ -291,8 +291,8 @@ void wxDialog::SetTitle(const wxString& title) bool wxDialog::Show( bool show ) { - if( !wxTopLevelWindowMotif::Show( show ) ) - return FALSE; + if( !wxWindowBase::Show( show ) ) + return false; m_isShown = show; diff --git a/src/motif/frame.cpp b/src/motif/frame.cpp index 7b325f41da..ed2bc3ca87 100644 --- a/src/motif/frame.cpp +++ b/src/motif/frame.cpp @@ -430,8 +430,8 @@ void wxFrame::DoSetSize(int x, int y, int width, int height, int WXUNUSED(sizeFl bool wxFrame::Show( bool show ) { - if( !wxTopLevelWindowMotif::Show( show ) ) - return FALSE; + if( !wxWindowBase::Show( show ) ) + return false; m_isShown = show; @@ -442,15 +442,14 @@ bool wxFrame::Show( bool show ) SetVisibleStatus(show); if (show) { - XtMapWidget (shell); - XRaiseWindow (XtDisplay(shell), XtWindow(shell)); + XtPopup(shell, XtGrabNone); } else { - XtUnmapWidget(shell); + XtPopdown(shell); } - return TRUE; + return true; } void wxFrame::SetTitle(const wxString& title) -- 2.45.2