summaryrefslogtreecommitdiff
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
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)
-rw-r--r--src/gui/setup_video.cpp12
-rw-r--r--src/gui/widgets/window.cpp67
-rw-r--r--src/gui/widgets/window.h9
3 files changed, 84 insertions, 4 deletions
diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp
index ce815001..903196c6 100644
--- a/src/gui/setup_video.cpp
+++ b/src/gui/setup_video.cpp
@@ -444,11 +444,17 @@ void Setup_Video::action(const gcn::ActionEvent &event)
const int width = atoi(mode.substr(0, mode.find("x")).c_str());
const int height = atoi(mode.substr(mode.find("x") + 1).c_str());
+ // TODO: Find out why the drawing area doesn't resize without a restart.
if (width != graphics->getWidth() || height != graphics->getHeight())
{
- // TODO: Find out why the drawing area doesn't resize without a restart.
- new OkDialog(_("Screen resolution changed"),
- _("Restart your client for the change to take effect."));
+ if (width < graphics->getWidth() || height < graphics->getHeight())
+ new OkDialog(_("Screen resolution changed"),
+ _("Restart your client for the change to take effect.")
+ + std::string("\n") +
+ _("Some windows may be moved to fit the lowered resolution."));
+ else
+ new OkDialog(_("Screen resolution changed"),
+ _("Restart your client for the change to take effect."));
}
config.setValue("screenwidth", width);
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);
+}
diff --git a/src/gui/widgets/window.h b/src/gui/widgets/window.h
index 153602ba..b3ef3fdc 100644
--- a/src/gui/widgets/window.h
+++ b/src/gui/widgets/window.h
@@ -269,7 +269,7 @@ class Window : public gcn::Window, gcn::WidgetListener
int defaultWidth, int defaultHeight);
/**
- * Set the default win pos and size tot he current ones.
+ * Set the default win pos and size to the current ones.
*/
void setDefaultSize();
@@ -347,6 +347,13 @@ class Window : public gcn::Window, gcn::WidgetListener
};
/**
+ * Check if the window is off-screen and then move it to be visible
+ * again. This is internally used by loadWindowState
+ * and setVisible(true) members.
+ */
+ void checkIfIsOffScreen(bool partially = true, bool entirely = true);
+
+ /**
* Determines if the mouse is in a resize area and returns appropriate
* resize handles. Also initializes drag offset in case the resize
* grip is used.