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

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