]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wincmn.cpp
applied the patch from Dimitri to prevent crashes with (some) interlaced GIFs
[wxWidgets.git] / src / common / wincmn.cpp
index 6ffcaea012b9827bec575611f260bcc6d0c7315c..2641125c24f86cb5226e7f20f8aa33d1e812449a 100644 (file)
 
 #if wxUSE_CONSTRAINTS
     #include "wx/layout.h"
-    #include "wx/sizer.h"
 #endif // wxUSE_CONSTRAINTS
 
+#include "wx/sizer.h"
+
 #if wxUSE_DRAG_AND_DROP
     #include "wx/dnd.h"
 #endif // wxUSE_DRAG_AND_DROP
@@ -151,10 +152,11 @@ void wxWindowBase::InitBase()
     // no constraints whatsoever
     m_constraints = (wxLayoutConstraints *) NULL;
     m_constraintsInvolvedIn = (wxWindowList *) NULL;
+#endif // wxUSE_CONSTRAINTS
+
     m_windowSizer = (wxSizer *) NULL;
     m_containingSizer = (wxSizer *) NULL;
     m_autoLayout = FALSE;
-#endif // wxUSE_CONSTRAINTS
 
 #if wxUSE_DRAG_AND_DROP
     m_dropTarget = (wxDropTarget *)NULL;
@@ -258,14 +260,14 @@ wxWindowBase::~wxWindowBase()
         m_constraints = NULL;
     }
 
+#endif // wxUSE_CONSTRAINTS
+
     if ( m_containingSizer )
         m_containingSizer->Remove((wxWindow*)this);
 
     if ( m_windowSizer )
         delete m_windowSizer;
 
-#endif // wxUSE_CONSTRAINTS
-
 #if wxUSE_DRAG_AND_DROP
     if ( m_dropTarget )
         delete m_dropTarget;
@@ -405,18 +407,18 @@ void wxWindowBase::Centre(int direction)
     wxRect rect = wxGetClientDisplayRect();
     wxSize size (rect.width,rect.height);
 
-#ifndef __WXMGL__ // FIXME - temporary dirty hack!!
-    if (posParent.x >= 0)  // if parent is on the main display
-#endif
+    // NB: in wxMSW, negative position may not neccessary mean "out of screen",
+    //     but it may mean that the window is placed on other than the main
+    //     display. Therefore we only make sure centered window is on the main display
+    //     if the parent is at least partially present here.
+    if (posParent.x + widthParent >= 0)  // if parent is (partially) on the main display
     {
         if (xNew < 0)
             xNew = 0;
         else if (xNew+width > size.x)
             xNew = size.x-width-1;
     }
-#ifndef __WXMGL__ // FIXME - temporary dirty hack!!
-    if (posParent.y >= 0)  // if parent is on the main display
-#endif
+    if (posParent.y + heightParent >= 0)  // if parent is (partially) on the main display
     {
         if (yNew+height > size.y)
             yNew = size.y-height-1;
@@ -1181,10 +1183,11 @@ void wxWindowBase::DeleteRelatedConstraints()
         m_constraintsInvolvedIn = (wxWindowList *) NULL;
     }
 }
+#endif
 
-void wxWindowBase::SetSizer(wxSizer *sizer)
+void wxWindowBase::SetSizer(wxSizer *sizer, bool deleteOld)
 {
-    if (m_windowSizer) delete m_windowSizer;
+    if (m_windowSizer && deleteOld) delete m_windowSizer;
 
     m_windowSizer = sizer;
 }
@@ -1199,6 +1202,7 @@ bool wxWindowBase::Layout()
 
         GetSizer()->SetDimension( 0, 0, w, h );
     }
+#if wxUSE_CONSTRAINTS
     else
     {
         wxLayoutConstraints *constr = GetConstraints();
@@ -1222,11 +1226,12 @@ bool wxWindowBase::Layout()
         DoPhase(2);           // Layout grand children
         SetConstraintSizes(); // Recursively set the real window sizes
     }
+#endif
 
     return TRUE;
 }
 
-
+#if wxUSE_CONSTRAINTS
 // Do a phase of evaluating constraints: the default behaviour. wxSizers may
 // do a similar thing, but also impose their own 'constraints' and order the
 // evaluation differently.
@@ -1432,7 +1437,21 @@ void wxWindowBase::GetClientSizeConstraint(int *w, int *h) const
         GetClientSize(w, h);
 }
 
-void wxWindowBase::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
+void wxWindowBase::GetPositionConstraint(int *x, int *y) const
+{
+    wxLayoutConstraints *constr = GetConstraints();
+    if ( constr )
+    {
+        *x = constr->left.GetValue();
+        *y = constr->top.GetValue();
+    }
+    else
+        GetPosition(x, y);
+}
+
+#endif // wxUSE_CONSTRAINTS
+
+void wxWindowBase::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags) const
 {
     // don't do it for the dialogs/frames - they float independently of their
     // parent
@@ -1448,21 +1467,6 @@ void wxWindowBase::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
     }
 }
 
-
-void wxWindowBase::GetPositionConstraint(int *x, int *y) const
-{
-    wxLayoutConstraints *constr = GetConstraints();
-    if ( constr )
-    {
-        *x = constr->left.GetValue();
-        *y = constr->top.GetValue();
-    }
-    else
-        GetPosition(x, y);
-}
-
-#endif // wxUSE_CONSTRAINTS
-
 // ----------------------------------------------------------------------------
 // do Update UI processing for child controls
 // ----------------------------------------------------------------------------
@@ -1708,10 +1712,7 @@ void wxWindowBase::CaptureMouse()
     wxWindow *winOld = GetCapture();
     if ( winOld )
     {
-       // I think this is correct, but not compatible with some ports
-#if defined(__WXX11__) || defined(__WXMGL__)
-       ((wxWindowBase*) winOld)->DoReleaseMouse();
-#endif
+        ((wxWindowBase*) winOld)->DoReleaseMouse();
        
         // save it on stack
         wxWindowNext *item = new wxWindowNext;
@@ -1734,12 +1735,7 @@ void wxWindowBase::ReleaseMouse()
 
     if ( ms_winCaptureNext )
     {
-       // I think this is correct, but not compatible with some ports
-#if defined(__WXX11__) || defined(__WXMGL__)
         ((wxWindowBase*)ms_winCaptureNext->win)->DoCaptureMouse();
-#else
-        ms_winCaptureNext->win->CaptureMouse();
-#endif
        
         wxWindowNext *item = ms_winCaptureNext;
         ms_winCaptureNext = item->next;
@@ -1752,3 +1748,4 @@ void wxWindowBase::ReleaseMouse()
                GetCapture());
 }
 
+// vi:sts=4:sw=4:et