From 8292b80eac900ec5dd75d184063b7b35934e800a Mon Sep 17 00:00:00 2001 From: Thorbjørn Lindeijer Date: Sat, 21 Jan 2012 12:30:36 +0100 Subject: Allow resizing of the game in windowed mode Window positions are semi-smartly corrected as a result of the resize. Not supported when using OpenGL on Windows for now. Reviewed-by: Yohann Ferreira Conflicts: src/client.cpp src/client.h src/game.cpp src/gui/gui.cpp src/gui/widgets/window.cpp --- src/gui/widgets/window.cpp | 78 +++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 46 deletions(-) (limited to 'src/gui/widgets/window.cpp') diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp index 3858b0d81..6e6918694 100644 --- a/src/gui/widgets/window.cpp +++ b/src/gui/widgets/window.cpp @@ -433,7 +433,7 @@ void Window::setVisible(bool visible, bool forceSticky) // Check if the window is off screen... if (visible) - checkIfIsOffScreen(); + ensureOnScreen(); if (isStickyButtonLock()) gcn::Window::setVisible(visible); @@ -713,7 +713,7 @@ void Window::loadWindowState() } // Check if the window is off screen... - checkIfIsOffScreen(); + ensureOnScreen(); if (viewport) { @@ -848,6 +848,22 @@ void Window::resetToDefaultSize() saveWindowState(); } +void Window::adjustPositionAfterResize(int oldScreenWidth, int oldScreenHeight) +{ + gcn::Rectangle dimension = getDimension(); + + // If window was aligned to the right or bottom, keep it there + const int rightMargin = oldScreenWidth - (getX() + getWidth()); + const int bottomMargin = oldScreenHeight - (getY() + getHeight()); + if (getX() > 0 && getX() > rightMargin) + dimension.x = mainGraphics->mWidth - rightMargin - getWidth(); + if (getY() > 0 && getY() > bottomMargin) + dimension.y = mainGraphics->mHeight - bottomMargin - getHeight(); + + setDimension(dimension); + ensureOnScreen(); +} + int Window::getResizeHandles(gcn::MouseEvent &event) { if ((mStickyButtonLock && mSticky) || event.getX() < 0 || event.getY() < 0) @@ -972,57 +988,27 @@ void Window::centerHorisontally() setLocationHorisontallyRelativeTo(getParent()); } -void Window::checkIfIsOffScreen(bool partially, bool entirely) +void Window::ensureOnScreen() { - // Move the window onto screen if it has become off screen - // For instance, because of resolution change... - - // First of all, don't deal when a window hasn't got - // any size initialized yet... + // Skip when a window hasn't got any size initialized yet if (getWidth() == 0 && getHeight() == 0) return; - // Made partially the default behaviour - if (!partially && !entirely) - partially = true; - - // Keep guichan window inside screen (supports resizing any side) - - gcn::Rectangle winDimension = getDimension(); - - if (winDimension.x < 0) - { - winDimension.width += winDimension.x; - winDimension.x = 0; - } - if (winDimension.y < 0) - { - winDimension.height += winDimension.y; - winDimension.y = 0; - } - - // Look if the window is partially off-screen limits... - if (partially) - { - if (winDimension.x + winDimension.width > mainGraphics->mWidth) - winDimension.x = mainGraphics->mWidth - winDimension.width; - - if (winDimension.y + winDimension.height > mainGraphics->mHeight) - winDimension.y = mainGraphics->mHeight - winDimension.height; + gcn::Rectangle dimension = getDimension(); - setDimension(winDimension); - return; - } + // Check the left and bottom screen boundaries + if (dimension.x + dimension.width > mainGraphics->mWidth) + dimension.x = mainGraphics->mWidth - dimension.width; + if (dimension.y + dimension.height > mainGraphics->mHeight) + dimension.y = mainGraphics->mHeight - dimension.height; - if (entirely) - { - if (winDimension.x > mainGraphics->mWidth) - winDimension.x = mainGraphics->mWidth - winDimension.width; + // But never allow the windows to disappear in to the right and top + if (dimension.x < 0) + dimension.x = 0; + if (dimension.y < 0) + dimension.y = 0; - if (winDimension.y > mainGraphics->mHeight) - winDimension.y = mainGraphics->mHeight - winDimension.height; - } - setDimension(winDimension); + setDimension(dimension); } gcn::Rectangle Window::getWindowArea() -- cgit v1.2.3-60-g2f50