summaryrefslogtreecommitdiff
path: root/src/gui/widgets/window.cpp
diff options
context:
space:
mode:
authorBertram <bertram@cegetel.net>2009-07-30 23:28:18 +0200
committerBertram <bertram@cegetel.net>2009-07-30 23:28:18 +0200
commit3ff2538f8dda2f16e2a536ffc1d994374260d6f2 (patch)
treee4399e3206a76d8c2c4dc1af1fb5dddeafca14be /src/gui/widgets/window.cpp
parentab6b8095d0bfe87c548776e640043b9b2bc46639 (diff)
downloadMana-3ff2538f8dda2f16e2a536ffc1d994374260d6f2.tar.gz
Mana-3ff2538f8dda2f16e2a536ffc1d994374260d6f2.tar.bz2
Mana-3ff2538f8dda2f16e2a536ffc1d994374260d6f2.tar.xz
Mana-3ff2538f8dda2f16e2a536ffc1d994374260d6f2.zip
Fixed windows loss when changing to a lowered resolution. (Mantis 776)
Diffstat (limited to 'src/gui/widgets/window.cpp')
-rw-r--r--src/gui/widgets/window.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp
index 19d80671..1ee84a6f 100644
--- a/src/gui/widgets/window.cpp
+++ b/src/gui/widgets/window.cpp
@@ -306,6 +306,10 @@ void Window::setVisible(bool visible)
void Window::setVisible(bool visible, bool forceSticky)
{
+ // Check if the window is off screen...
+ if (visible)
+ checkIfIsOffScreen();
+
gcn::Window::setVisible((!forceSticky && isSticky()) || visible);
}
@@ -526,6 +530,9 @@ void Window::loadWindowState()
{
setSize(mDefaultWidth, mDefaultHeight);
}
+
+ // Check if the window is off screen...
+ checkIfIsOffScreen();
}
void Window::saveWindowState()
@@ -739,3 +746,63 @@ void Window::center()
{
setLocationRelativeTo(getParent());
}
+
+void Window::checkIfIsOffScreen(bool partially, bool entirely)
+{
+ // 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...
+ 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 > graphics->getWidth())
+ {
+ winDimension.x = graphics->getWidth() - winDimension.width;
+ }
+
+ if (winDimension.y + winDimension.height > graphics->getHeight())
+ {
+ winDimension.y = graphics->getHeight() - winDimension.height;
+ }
+ setDimension(winDimension);
+ return;
+ }
+
+ if (entirely)
+ {
+ if (winDimension.x > graphics->getWidth())
+ {
+ winDimension.x = graphics->getWidth() - winDimension.width;
+ }
+
+ if (winDimension.y > graphics->getHeight())
+ {
+ winDimension.y = graphics->getHeight() - winDimension.height;
+ }
+ }
+ setDimension(winDimension);
+}