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:
@@ -76,10 +76,13 @@ public:
|
|||||||
// Motif-specific
|
// Motif-specific
|
||||||
WXAppContext GetAppContext() const { return m_appContext; }
|
WXAppContext GetAppContext() const { return m_appContext; }
|
||||||
WXWidget GetTopLevelWidget();
|
WXWidget GetTopLevelWidget();
|
||||||
|
WXWidget GetTopLevelRealizedWidget();
|
||||||
WXColormap GetMainColormap(WXDisplay* display);
|
WXColormap GetMainColormap(WXDisplay* display);
|
||||||
WXDisplay* GetInitialDisplay() const { return m_initialDisplay; }
|
WXDisplay* GetInitialDisplay() const { return m_initialDisplay; }
|
||||||
|
|
||||||
void SetTopLevelWidget(WXDisplay* display, WXWidget widget);
|
void SetTopLevelWidget(WXDisplay* display, WXWidget widget);
|
||||||
|
void SetTopLevelRealizedWidget(WXDisplay* display,
|
||||||
|
WXWidget widget);
|
||||||
|
|
||||||
// This handler is called when a property change event occurs
|
// This handler is called when a property change event occurs
|
||||||
virtual void HandlePropertyChange(WXEvent *event);
|
virtual void HandlePropertyChange(WXEvent *event);
|
||||||
|
@@ -38,6 +38,7 @@
|
|||||||
#pragma message disable nosimpint
|
#pragma message disable nosimpint
|
||||||
#endif
|
#endif
|
||||||
#include <Xm/Xm.h>
|
#include <Xm/Xm.h>
|
||||||
|
#include <Xm/Label.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
#include <X11/Xresource.h>
|
#include <X11/Xresource.h>
|
||||||
@@ -53,10 +54,14 @@
|
|||||||
struct wxPerDisplayData
|
struct wxPerDisplayData
|
||||||
{
|
{
|
||||||
wxPerDisplayData()
|
wxPerDisplayData()
|
||||||
{ m_visualInfo = NULL; m_topLevelWidget = NULL; }
|
{
|
||||||
|
m_visualInfo = NULL;
|
||||||
|
m_topLevelWidget = NULL;
|
||||||
|
m_topLevelRealizedWidget = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
wxXVisualInfo* m_visualInfo;
|
wxXVisualInfo* m_visualInfo;
|
||||||
Widget m_topLevelWidget;
|
Widget m_topLevelWidget, m_topLevelRealizedWidget;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData,
|
static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData,
|
||||||
@@ -274,8 +279,12 @@ static void wxTLWidgetDestroyCallback(Widget w, XtPointer clientData,
|
|||||||
XtPointer ptr)
|
XtPointer ptr)
|
||||||
{
|
{
|
||||||
if( wxTheApp )
|
if( wxTheApp )
|
||||||
|
{
|
||||||
wxTheApp->SetTopLevelWidget( (WXDisplay*)XtDisplay(w),
|
wxTheApp->SetTopLevelWidget( (WXDisplay*)XtDisplay(w),
|
||||||
(WXWidget)NULL );
|
(WXWidget)NULL );
|
||||||
|
wxTheApp->SetTopLevelRealizedWidget( (WXDisplay*)XtDisplay(w),
|
||||||
|
(WXWidget)NULL );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WXWidget wxCreateTopLevelWidget( WXDisplay* display )
|
WXWidget wxCreateTopLevelWidget( WXDisplay* display )
|
||||||
@@ -285,8 +294,9 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display )
|
|||||||
applicationShellWidgetClass,
|
applicationShellWidgetClass,
|
||||||
(Display*)display,
|
(Display*)display,
|
||||||
NULL, 0 );
|
NULL, 0 );
|
||||||
XtSetMappedWhenManaged( tlw, False );
|
XtVaSetValues( tlw,
|
||||||
XtRealizeWidget( tlw );
|
XmNoverrideRedirect, True,
|
||||||
|
NULL );
|
||||||
|
|
||||||
XtAddCallback( tlw, XmNdestroyCallback,
|
XtAddCallback( tlw, XmNdestroyCallback,
|
||||||
(XtCallbackProc)wxTLWidgetDestroyCallback,
|
(XtCallbackProc)wxTLWidgetDestroyCallback,
|
||||||
@@ -295,6 +305,17 @@ WXWidget wxCreateTopLevelWidget( WXDisplay* display )
|
|||||||
return (WXWidget)tlw;
|
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()
|
WXWidget wxApp::GetTopLevelWidget()
|
||||||
{
|
{
|
||||||
WXDisplay* display = wxGetDisplay();
|
WXDisplay* display = wxGetDisplay();
|
||||||
@@ -309,9 +330,30 @@ WXWidget wxApp::GetTopLevelWidget()
|
|||||||
return tlw;
|
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)
|
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
|
// Yield to other processes
|
||||||
|
@@ -283,7 +283,7 @@ bool wxClipboard::AddData( wxDataObject *data )
|
|||||||
m_data.Append( data );
|
m_data.Append( data );
|
||||||
|
|
||||||
Display* xdisplay = wxGlobalDisplay();
|
Display* xdisplay = wxGlobalDisplay();
|
||||||
Widget xwidget = (Widget)wxTheApp->GetTopLevelWidget();
|
Widget xwidget = (Widget)wxTheApp->GetTopLevelRealizedWidget();
|
||||||
Window xwindow = XtWindow( xwidget );
|
Window xwindow = XtWindow( xwidget );
|
||||||
wxXmString label( wxTheApp->GetAppName() );
|
wxXmString label( wxTheApp->GetAppName() );
|
||||||
Time timestamp = XtLastTimestampProcessed( xdisplay );
|
Time timestamp = XtLastTimestampProcessed( xdisplay );
|
||||||
@@ -333,7 +333,7 @@ void wxClipboard::Close()
|
|||||||
bool wxClipboard::IsSupported(const wxDataFormat& format)
|
bool wxClipboard::IsSupported(const wxDataFormat& format)
|
||||||
{
|
{
|
||||||
Display* xdisplay = wxGlobalDisplay();
|
Display* xdisplay = wxGlobalDisplay();
|
||||||
Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelWidget() );
|
Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelRealizedWidget() );
|
||||||
bool isSupported = false;
|
bool isSupported = false;
|
||||||
int retval, count;
|
int retval, count;
|
||||||
unsigned long max_name_length;
|
unsigned long max_name_length;
|
||||||
@@ -393,7 +393,7 @@ bool wxClipboard::GetData( wxDataObject& data )
|
|||||||
wxCHECK_MSG( m_open, false, "clipboard not open" );
|
wxCHECK_MSG( m_open, false, "clipboard not open" );
|
||||||
|
|
||||||
Display* xdisplay = wxGlobalDisplay();
|
Display* xdisplay = wxGlobalDisplay();
|
||||||
Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelWidget() );
|
Window xwindow = XtWindow( (Widget)wxTheApp->GetTopLevelRealizedWidget() );
|
||||||
Time timestamp = XtLastTimestampProcessed( xdisplay );
|
Time timestamp = XtLastTimestampProcessed( xdisplay );
|
||||||
|
|
||||||
wxDataFormat chosenFormat;
|
wxDataFormat chosenFormat;
|
||||||
|
@@ -291,8 +291,8 @@ void wxDialog::SetTitle(const wxString& title)
|
|||||||
|
|
||||||
bool wxDialog::Show( bool show )
|
bool wxDialog::Show( bool show )
|
||||||
{
|
{
|
||||||
if( !wxTopLevelWindowMotif::Show( show ) )
|
if( !wxWindowBase::Show( show ) )
|
||||||
return FALSE;
|
return false;
|
||||||
|
|
||||||
m_isShown = show;
|
m_isShown = show;
|
||||||
|
|
||||||
|
@@ -430,8 +430,8 @@ void wxFrame::DoSetSize(int x, int y, int width, int height, int WXUNUSED(sizeFl
|
|||||||
|
|
||||||
bool wxFrame::Show( bool show )
|
bool wxFrame::Show( bool show )
|
||||||
{
|
{
|
||||||
if( !wxTopLevelWindowMotif::Show( show ) )
|
if( !wxWindowBase::Show( show ) )
|
||||||
return FALSE;
|
return false;
|
||||||
|
|
||||||
m_isShown = show;
|
m_isShown = show;
|
||||||
|
|
||||||
@@ -442,15 +442,14 @@ bool wxFrame::Show( bool show )
|
|||||||
SetVisibleStatus(show);
|
SetVisibleStatus(show);
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
XtMapWidget (shell);
|
XtPopup(shell, XtGrabNone);
|
||||||
XRaiseWindow (XtDisplay(shell), XtWindow(shell));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
XtUnmapWidget(shell);
|
XtPopdown(shell);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxFrame::SetTitle(const wxString& title)
|
void wxFrame::SetTitle(const wxString& title)
|
||||||
|
Reference in New Issue
Block a user