]> git.saurik.com Git - wxWidgets.git/commitdiff
Do not realize the top level shell that acts as a parent
authorMattia Barbon <mbarbon@cpan.org>
Sat, 22 May 2004 18:01:33 +0000 (18:01 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Sat, 22 May 2004 18:01:33 +0000 (18:01 +0000)
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
src/motif/app.cpp
src/motif/clipbrd.cpp
src/motif/dialog.cpp
src/motif/frame.cpp

index 65dbc0c1b8d675714d8934fbe2d5cd2a95724b5e..1007941b480931e8bf796228a13fce74301af0a1 100644 (file)
@@ -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);
index 3cf1ef5e64a54a17badda39a60dd49e8f026323f..4ff6242196d5f921b8d76553ed6bf42062d377f2 100644 (file)
@@ -38,6 +38,7 @@
 #pragma message disable nosimpint
 #endif
 #include <Xm/Xm.h>
+#include <Xm/Label.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Xresource.h>
 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
index 2f8d636d09bda60f0ba5966ecaa2becc1a643b3f..4af95a45ad40e73fbfca02cd8345d6c7477e67cb 100644 (file)
@@ -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;
index 28922a01dd74b943fa52d08a05bed13c6e937c64..55d0b2fbef99f9ad42b28fb9b4868893d5d9f09f 100644 (file)
@@ -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;
 
index 7b325f41da6f8e4c12d93e87c6500e3d0318187c..ed2bc3ca87f2097182d543586a57dd428cfe4e26 100644 (file)
@@ -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)