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
This commit is contained in:
Mattia Barbon
2004-05-22 18:01:33 +00:00
parent f9c3d39b21
commit 5a2e3d8c47
5 changed files with 60 additions and 16 deletions

View 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);

View 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>
@@ -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

View 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;

View 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;

View 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)