/////////////////////////////////////////////////////////////////////////////
-// Name: motif/toplevel.cpp
+// Name: src/motif/toplevel.cpp
// Purpose: wxTopLevelWindow Motif implementation
// Author: Mattia Barbon
// Modified by:
// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(__APPLE__)
- #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 <Xm/Xm.h>
// wxTopLevelWindowMotif implementation
// ===========================================================================
-wxTopLevelWindowMotif::~wxTopLevelWindowMotif()
+void wxTopLevelWindowMotif::PreDestroy()
{
- wxTopLevelWindows.DeleteObject(this);
-
- if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
- wxModelessWindows.DeleteObject(this);
+ wxModelessWindows.DeleteObject(this);
m_icons.m_icons.Empty();
XtRemoveEventHandler( (Widget)GetClientWidget(),
ButtonPressMask | ButtonReleaseMask |
PointerMotionMask | KeyPressMask,
- FALSE,
+ False,
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()
{
- m_isShown = FALSE;
+ m_isShown = false;
}
bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
if ( parent )
parent->AddChild(this);
-
+
wxTopLevelWindows.Append(this);
m_windowId = ( id > -1 ) ? id : NewControlId();
- bool retval = DoCreate( parent, id, title, pos, size, style, name );
+ bool retval = XmDoCreateTLW( parent, id, title, pos, size, style, name );
- if( !retval ) return FALSE;
+ if( !retval ) return false;
// Intercept CLOSE messages from the window manager
Widget shell = (Widget)GetShellWidget();
// Modified Steve Hammes for Motif 2.0
#if (XmREVISION > 1 || XmVERSION > 1)
XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW,
- (XtCallbackProc)wxCloseTLWCallback,
+ (XtCallbackProc)wxCloseTLWCallback,
(XtPointer)this );
#elif XmREVISION == 1
XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW,
if( XmIsMotifWMRunning( shell ) )
{
int decor = 0 ;
+ if( !(m_windowStyle & wxNO_BORDER) )
+ decor |= MWM_DECOR_BORDER;
if( m_windowStyle & wxRESIZE_BORDER )
decor |= MWM_DECOR_RESIZEH;
if( m_windowStyle & wxSYSTEM_MENU )
// no-decorations case.
if( ( m_windowStyle & wxCAPTION ) != wxCAPTION )
XtVaSetValues( shell,
- XmNoverrideRedirect, TRUE,
+ XmNoverrideRedirect, True,
NULL );
}
XtAddEventHandler( (Widget)GetClientWidget(),
- ButtonPressMask | ButtonReleaseMask |
+ ButtonPressMask | ButtonReleaseMask |
PointerMotionMask | KeyPressMask,
- FALSE,
+ False,
wxTLWEventHandler,
(XtPointer)this );
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();
return (WXWidget) GetShell( this );
}
-bool wxTopLevelWindowMotif::ShowFullScreen( bool show,
- long style )
+bool wxTopLevelWindowMotif::ShowFullScreen( bool WXUNUSED(show),
+ long WXUNUSED(style) )
{
// TODO, see wxGTK
- return FALSE;
+ return false;
}
bool wxTopLevelWindowMotif::IsFullScreen() const
{
// TODO, see wxGTK
- return FALSE;
+ return false;
}
void wxTopLevelWindowMotif::Restore()
if( shell )
XtVaSetValues( shell,
- XmNiconic, FALSE,
+ XmNiconic, False,
NULL );
}
if( !shell ) return;
if( !iconize )
- Show( TRUE );
+ Show( true );
XtVaSetValues( shell,
XmNiconic, (Boolean)iconize,
Widget shell = GetShell( this );
if( !shell )
- return FALSE;
+ return false;
Boolean iconic;
XtVaGetValues( shell,
XmNiconic, &iconic,
NULL );
- return iconic;
+ return (iconic == True);
}
void wxTopLevelWindowMotif::Maximize( bool maximize )
{
- Show( TRUE );
+ Show( true );
if( maximize )
Restore();
bool wxTopLevelWindowMotif::IsMaximized() const
{
- return FALSE;
+ return false;
+}
+
+void wxTopLevelWindowMotif::DoSetSizeHints( int minW, int minH,
+ int maxW, int maxH,
+ int incW, int incH )
+{
+ wxTopLevelWindowBase::DoSetSizeHints( 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 );
}
// ---------------------------------------------------------------------------
else
{
// An attempt to implement OnCharHook by calling OnCharHook first;
- // if this returns TRUE, set continueToDispatch to False
+ // if this returns true, set continueToDispatch to False
// (don't continue processing).
// Otherwise set it to True and call OnChar.
wxKeyEvent keyEvent( wxEVT_CHAR );