X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0de6dfa701964fdabfd1f4027e68b4c7c5520107..f8b2997476e15b63f1699b9f7b6f1db2ae6b440c:/src/motif/toplevel.cpp diff --git a/src/motif/toplevel.cpp b/src/motif/toplevel.cpp index b0180f7a8b..7555346227 100644 --- a/src/motif/toplevel.cpp +++ b/src/motif/toplevel.cpp @@ -17,15 +17,22 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(__APPLE__) +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "toplevel.h" #endif +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + #include "wx/toplevel.h" #include "wx/app.h" #ifdef __VMS__ - #pragma message disable nosimpint +#define XtDisplay XTDISPLAY +#define XtParent XTPARENT +#define XtScreen XTSCREEN +#define XtWindow XTWINDOW +#pragma message disable nosimpint #endif #include @@ -60,12 +67,16 @@ static void wxTLWEventHandler( Widget wid, // wxTopLevelWindowMotif implementation // =========================================================================== -wxTopLevelWindowMotif::~wxTopLevelWindowMotif() +void wxTopLevelWindowMotif::PreDestroy() { - wxTopLevelWindows.DeleteObject(this); - - if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL ) +#ifdef __VMS +#pragma message disable codcauunr +#endif + if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL ) wxModelessWindows.DeleteObject(this); +#ifdef __VMS +#pragma message enable codcauunr +#endif m_icons.m_icons.Empty(); @@ -81,21 +92,11 @@ wxTopLevelWindowMotif::~wxTopLevelWindowMotif() wxTLWEventHandler, (XtPointer)this ); } +} - DoDestroy(); - +wxTopLevelWindowMotif::~wxTopLevelWindowMotif() +{ SetMainWidget( (WXWidget)0 ); - - // If this is the last top-level window, exit. - if (wxTheApp && (wxTopLevelWindows.Number() == 0)) - { - wxTheApp->SetTopWindow(NULL); - - if (wxTheApp->GetExitOnFrameDelete()) - { - wxTheApp->ExitMainLoop(); - } - } } void wxTopLevelWindowMotif::Init() @@ -193,6 +194,29 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id, return retval; } +void wxTopLevelWindowMotif::DoGetPosition(int *x, int *y) const +{ + Widget top = (Widget) GetTopWidget(); + Window parent_window = XtWindow((Widget) top), + next_parent = XtWindow((Widget) top), + root = RootWindowOfScreen(XtScreen((Widget) top)); + + // search for the parent that is child of ROOT, because the WM may + // reparent twice and notify only the next parent (like FVWM) + while (next_parent != root) { + Window *theChildren; unsigned int n; + parent_window = next_parent; + XQueryTree(XtDisplay((Widget) top), parent_window, &root, + &next_parent, &theChildren, &n); + XFree(theChildren); // not needed + } + int xx, yy; unsigned int dummy; + XGetGeometry(XtDisplay((Widget) top), parent_window, &root, + &xx, &yy, &dummy, &dummy, &dummy, &dummy); + if (x) *x = xx; + if (y) *y = yy; +} + void wxTopLevelWindowMotif::Raise() { Widget top = (Widget) GetTopWidget(); @@ -249,7 +273,7 @@ WXWidget wxTopLevelWindowMotif::GetShellWidget() const } bool wxTopLevelWindowMotif::ShowFullScreen( bool show, - long style = wxFULLSCREEN_ALL ) + long style ) { // TODO, see wxGTK return FALSE; @@ -271,7 +295,7 @@ void wxTopLevelWindowMotif::Restore() NULL ); } -void wxTopLevelWindowMotif::Iconize( bool iconize = TRUE ) +void wxTopLevelWindowMotif::Iconize( bool iconize ) { Widget shell = GetShell( this ); if( !shell ) return; @@ -299,7 +323,7 @@ bool wxTopLevelWindowMotif::IsIconized() const return iconic; } -void wxTopLevelWindowMotif::Maximize( bool maximize = TRUE ) +void wxTopLevelWindowMotif::Maximize( bool maximize ) { Show( TRUE ); @@ -312,6 +336,32 @@ bool wxTopLevelWindowMotif::IsMaximized() const return FALSE; } +void wxTopLevelWindowMotif::SetSizeHints( int minW, int minH, + int maxW, int maxH, + int incW, int incH ) +{ + wxTopLevelWindowBase::SetSizeHints( minW, minH, maxW, maxH, incW, incH ); + + int count = 0; + Arg args[6]; + + if( minW > -1 ) { XtSetArg( args[count], XmNminWidth, minW ); ++count; } + if( minH > -1 ) { XtSetArg( args[count], XmNminHeight, minH ); ++count; } + if( maxW > -1 ) { XtSetArg( args[count], XmNmaxWidth, maxW ); ++count; } + if( maxH > -1 ) { XtSetArg( args[count], XmNmaxHeight, maxH ); ++count; } + if( incW > -1 ) { XtSetArg( args[count], XmNwidthInc, incW ); ++count; } + if( incH > -1 ) { XtSetArg( args[count], XmNheightInc, incH ); ++count; } + + XtSetValues( (Widget)GetShellWidget(), args, count ); +} + +bool wxTopLevelWindowMotif::SetShape( const wxRegion& region ) +{ + return wxDoSetShape( (Display*)GetXDisplay(), + XtWindow( (Widget)GetShellWidget() ), + region ); +} + // --------------------------------------------------------------------------- // Callback definition // ---------------------------------------------------------------------------