]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/toplevel.cpp
setting clipping correctly
[wxWidgets.git] / src / motif / toplevel.cpp
index 6d1b385573c2aa5829bf09bce1951da83c748b77..5ce626267a154272eb6d91a5e12e5fd20a786a48 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        motif/toplevel.cpp
+// Name:        src/motif/toplevel.cpp
 // Purpose:     wxTopLevelWindow Motif implementation
 // Author:      Mattia Barbon
 // Modified by:
 // Purpose:     wxTopLevelWindow Motif implementation
 // Author:      Mattia Barbon
 // Modified by:
 // headers
 // ----------------------------------------------------------------------------
 
 // 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/toplevel.h"
-#include "wx/app.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+#endif
 
 #ifdef __VMS__
 #define XtDisplay XTDISPLAY
 
 #ifdef __VMS__
 #define XtDisplay XTDISPLAY
@@ -64,12 +66,9 @@ static void wxTLWEventHandler( Widget wid,
 // wxTopLevelWindowMotif implementation
 // ===========================================================================
 
 // 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();
 
 
     m_icons.m_icons.Empty();
 
@@ -81,30 +80,20 @@ wxTopLevelWindowMotif::~wxTopLevelWindowMotif()
         XtRemoveEventHandler( (Widget)GetClientWidget(),
                               ButtonPressMask | ButtonReleaseMask |
                               PointerMotionMask | KeyPressMask,
         XtRemoveEventHandler( (Widget)GetClientWidget(),
                               ButtonPressMask | ButtonReleaseMask |
                               PointerMotionMask | KeyPressMask,
-                              FALSE,
+                              False,
                               wxTLWEventHandler,
                               (XtPointer)this );
     }
                               wxTLWEventHandler,
                               (XtPointer)this );
     }
+}
 
 
-    DoDestroy();
-
+wxTopLevelWindowMotif::~wxTopLevelWindowMotif()
+{
     SetMainWidget( (WXWidget)0 );
     SetMainWidget( (WXWidget)0 );
-
-    // If this is the last top-level window, exit.
-    if (wxTheApp && (wxTopLevelWindows.GetCount() == 0))
-    {
-        wxTheApp->SetTopWindow(NULL);
-
-        if (wxTheApp->GetExitOnFrameDelete())
-        {
-            wxTheApp->ExitMainLoop();
-        }
-    }
 }
 
 void wxTopLevelWindowMotif::Init()
 {
 }
 
 void wxTopLevelWindowMotif::Init()
 {
-    m_isShown = FALSE;
+    m_isShown = false;
 }
 
 bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
 }
 
 bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
@@ -119,14 +108,14 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
 
     if ( parent )
         parent->AddChild(this);
 
     if ( parent )
         parent->AddChild(this);
-    
+
     wxTopLevelWindows.Append(this);
 
     m_windowId = ( id > -1 ) ? id : NewControlId();
 
     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();
 
     // Intercept CLOSE messages from the window manager
     Widget shell = (Widget)GetShellWidget();
@@ -143,7 +132,7 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
     // Modified Steve Hammes for Motif 2.0
 #if (XmREVISION > 1 || XmVERSION > 1)
     XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW,
     // 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,
                              (XtPointer)this );
 #elif XmREVISION == 1
     XmAddWMProtocolCallback( shell, WM_DELETE_WINDOW,
@@ -158,6 +147,8 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
     if( XmIsMotifWMRunning( shell ) )
     {
         int decor = 0 ;
     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 )
         if( m_windowStyle & wxRESIZE_BORDER )
             decor |= MWM_DECOR_RESIZEH;
         if( m_windowStyle & wxSYSTEM_MENU )
@@ -166,7 +157,7 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
             ( m_windowStyle & wxTINY_CAPTION_HORIZ ) ||
             ( m_windowStyle & wxTINY_CAPTION_VERT ) )
             decor |= MWM_DECOR_TITLE;
             ( m_windowStyle & wxTINY_CAPTION_HORIZ ) ||
             ( m_windowStyle & wxTINY_CAPTION_VERT ) )
             decor |= MWM_DECOR_TITLE;
-        if( m_windowStyle & wxTHICK_FRAME )
+        if( m_windowStyle & wxRESIZE_BORDER )
             decor |= MWM_DECOR_BORDER;
         if( m_windowStyle & wxMINIMIZE_BOX )
             decor |= MWM_DECOR_MINIMIZE;
             decor |= MWM_DECOR_BORDER;
         if( m_windowStyle & wxMINIMIZE_BOX )
             decor |= MWM_DECOR_MINIMIZE;
@@ -183,20 +174,43 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
         // no-decorations case.
         if( ( m_windowStyle & wxCAPTION ) != wxCAPTION )
             XtVaSetValues( shell,
         // no-decorations case.
         if( ( m_windowStyle & wxCAPTION ) != wxCAPTION )
             XtVaSetValues( shell,
-                           XmNoverrideRedirect, TRUE,
+                           XmNoverrideRedirect, True,
                            NULL );
     }
 
     XtAddEventHandler( (Widget)GetClientWidget(),
                            NULL );
     }
 
     XtAddEventHandler( (Widget)GetClientWidget(),
-                       ButtonPressMask | ButtonReleaseMask | 
+                       ButtonPressMask | ButtonReleaseMask |
                        PointerMotionMask | KeyPressMask,
                        PointerMotionMask | KeyPressMask,
-                       FALSE,
+                       False,
                        wxTLWEventHandler,
                        (XtPointer)this );
 
     return retval;
 }
 
                        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();
 void wxTopLevelWindowMotif::Raise()
 {
     Widget top = (Widget) GetTopWidget();
@@ -252,17 +266,17 @@ WXWidget wxTopLevelWindowMotif::GetShellWidget() const
     return (WXWidget) GetShell( this );
 }
 
     return (WXWidget) GetShell( this );
 }
 
-bool wxTopLevelWindowMotif::ShowFullScreen( bool show,
-                                            long style )
+bool wxTopLevelWindowMotif::ShowFullScreen( bool WXUNUSED(show),
+                                            long WXUNUSED(style) )
 {
     // TODO, see wxGTK
 {
     // TODO, see wxGTK
-    return FALSE;
+    return false;
 }
 
 bool wxTopLevelWindowMotif::IsFullScreen() const
 {
     // TODO, see wxGTK
 }
 
 bool wxTopLevelWindowMotif::IsFullScreen() const
 {
     // TODO, see wxGTK
-    return FALSE;
+    return false;
 }
 
 void wxTopLevelWindowMotif::Restore()
 }
 
 void wxTopLevelWindowMotif::Restore()
@@ -271,7 +285,7 @@ void wxTopLevelWindowMotif::Restore()
 
     if( shell )
         XtVaSetValues( shell,
 
     if( shell )
         XtVaSetValues( shell,
-                       XmNiconic, FALSE,
+                       XmNiconic, False,
                        NULL );
 }
 
                        NULL );
 }
 
@@ -281,7 +295,7 @@ void wxTopLevelWindowMotif::Iconize( bool iconize )
     if( !shell ) return;
 
     if( !iconize )
     if( !shell ) return;
 
     if( !iconize )
-        Show( TRUE );
+        Show( true );
 
     XtVaSetValues( shell,
                    XmNiconic, (Boolean)iconize,
 
     XtVaSetValues( shell,
                    XmNiconic, (Boolean)iconize,
@@ -293,19 +307,19 @@ bool wxTopLevelWindowMotif::IsIconized() const
     Widget shell = GetShell( this );
 
     if( !shell )
     Widget shell = GetShell( this );
 
     if( !shell )
-        return FALSE;
+        return false;
 
     Boolean iconic;
     XtVaGetValues( shell,
                    XmNiconic, &iconic,
                    NULL );
 
 
     Boolean iconic;
     XtVaGetValues( shell,
                    XmNiconic, &iconic,
                    NULL );
 
-    return iconic;
+    return (iconic == True);
 }
 
 void wxTopLevelWindowMotif::Maximize( bool maximize )
 {
 }
 
 void wxTopLevelWindowMotif::Maximize( bool maximize )
 {
-    Show( TRUE );
+    Show( true );
 
     if( maximize )
         Restore();
 
     if( maximize )
         Restore();
@@ -313,7 +327,33 @@ void wxTopLevelWindowMotif::Maximize( bool maximize )
 
 bool wxTopLevelWindowMotif::IsMaximized() const
 {
 
 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 );
 }
 
 // ---------------------------------------------------------------------------
 }
 
 // ---------------------------------------------------------------------------
@@ -353,7 +393,7 @@ void wxTLWEventHandler( Widget wid,
         else
         {
             // An attempt to implement OnCharHook by calling OnCharHook first;
         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 );
             // (don't continue processing).
             // Otherwise set it to True and call OnChar.
             wxKeyEvent keyEvent( wxEVT_CHAR );
@@ -386,4 +426,3 @@ void wxTLWEventHandler( Widget wid,
 
     *continueToDispatch = True;
 }
 
     *continueToDispatch = True;
 }
-