+ if ( !(dir & wxBOTH) )
+ dir |= wxBOTH; // if neither is specified, center in both directions
+
+ // the new window rect candidate
+ wxRect rect = GetRect().CentreIn(rectParent, dir & ~wxCENTRE_ON_SCREEN);
+
+ // we don't want to place the window off screen if Centre() is called as
+ // this is (almost?) never wanted and it would be very difficult to prevent
+ // it from happening from the user code if we didn't check for it here
+ if ( !rectDisplay.Contains(rect.GetTopLeft()) )
+ {
+ // move the window just enough to make the corner visible
+ int dx = rectDisplay.GetLeft() - rect.GetLeft();
+ int dy = rectDisplay.GetTop() - rect.GetTop();
+ rect.Offset(dx > 0 ? dx : 0, dy > 0 ? dy : 0);
+ }
+
+ if ( !rectDisplay.Contains(rect.GetBottomRight()) )
+ {
+ // do the same for this corner too
+ int dx = rectDisplay.GetRight() - rect.GetRight();
+ int dy = rectDisplay.GetBottom() - rect.GetBottom();
+ rect.Offset(dx < 0 ? dx : 0, dy < 0 ? dy : 0);
+ }
+
+ // the window top left and bottom right corner are both visible now and
+ // although the window might still be not entirely on screen (with 2
+ // staggered displays for example) we wouldn't be able to improve the
+ // layout much in such case, so we stop here
+
+ // -1 could be valid coordinate here if there are several displays
+ SetSize(rect, wxSIZE_ALLOW_MINUS_ONE);