summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/windowmanager-sdl.cc
diff options
context:
space:
mode:
authorAdam Borowski <kilobyte@angband.pl>2010-11-09 16:16:05 +0100
committerAdam Borowski <kilobyte@angband.pl>2010-11-09 16:16:05 +0100
commitebfb02749fc10bd0ed8c358fcf06cd4dde1707c3 (patch)
tree86efdb906a91acff26f618ceac046be7dbcc0567 /crawl-ref/source/windowmanager-sdl.cc
parentf7717330f1e10f18464a68edc1b595dd6a6b9527 (diff)
parent7a7d45293c51c7604d15147f7d5d4358162743f9 (diff)
downloadcrawl-ref-ebfb02749fc10bd0ed8c358fcf06cd4dde1707c3.tar.gz
crawl-ref-ebfb02749fc10bd0ed8c358fcf06cd4dde1707c3.zip
Merge branch 'master' into unicode
Diffstat (limited to 'crawl-ref/source/windowmanager-sdl.cc')
-rw-r--r--crawl-ref/source/windowmanager-sdl.cc58
1 files changed, 58 insertions, 0 deletions
diff --git a/crawl-ref/source/windowmanager-sdl.cc b/crawl-ref/source/windowmanager-sdl.cc
index 1c6dbabf25..55d7bc94ea 100644
--- a/crawl-ref/source/windowmanager-sdl.cc
+++ b/crawl-ref/source/windowmanager-sdl.cc
@@ -11,6 +11,7 @@
#include "cio.h"
#include "files.h"
#include "glwrapper.h"
+#include "libutil.h"
#include "options.h"
#include "syscalls.h"
#include "windowmanager.h"
@@ -247,6 +248,7 @@ int SDLWrapper::init(coord_def *m_windowsz)
video_info = SDL_GetVideoInfo();
_desktop_width = video_info->current_w;
+ _desktop_height = video_info->current_h;
SDL_EnableUNICODE(true);
@@ -292,6 +294,10 @@ int SDLWrapper::init(coord_def *m_windowsz)
y = (y > 0) ? y : video_info->current_h + y;
m_windowsz->x = std::max(800, x);
m_windowsz->y = std::max(480, y);
+
+#ifdef TARGET_OS_WINDOWS
+ set_window_placement(m_windowsz);
+#endif
}
m_context = SDL_SetVideoMode(m_windowsz->x, m_windowsz->y, 0, flags);
@@ -319,6 +325,11 @@ int SDLWrapper::desktop_width() const
return (_desktop_width);
}
+int SDLWrapper::desktop_height() const
+{
+ return (_desktop_height);
+}
+
void SDLWrapper::set_window_title(const char *title)
{
SDL_WM_SetCaption(title, CRAWL);
@@ -337,6 +348,53 @@ bool SDLWrapper::set_window_icon(const char* icon_name)
return (true);
}
+#ifdef TARGET_OS_WINDOWS
+void SDLWrapper::set_window_placement(coord_def *m_windowsz)
+{
+ // We move the window if it overlaps the taskbar.
+ const int title_bar = 29;
+ int delta_x = (wm->desktop_width() - m_windowsz->x) / 2;
+ int delta_y = (wm->desktop_height() - m_windowsz->y) / 2;
+ taskbar_pos tpos = get_taskbar_pos();
+ int tsize = get_taskbar_size();
+
+ if (tpos == TASKBAR_TOP)
+ tsize += title_bar; // Title bar
+ else
+ tsize += 3; // Window border
+
+ int overlap = tsize - (tpos & TASKBAR_H ? delta_y : delta_x);
+
+ if (overlap > 0)
+ {
+ char env_str[50];
+ int x = delta_x;
+ int y = delta_y;
+
+ if (tpos & TASKBAR_H)
+ y += tpos == TASKBAR_TOP ? overlap : -overlap;
+ else
+ x += tpos == TASKBAR_LEFT ? overlap : -overlap;
+
+ x = std::max(x, 0);
+ y = std::max(y, title_bar);
+ tsize += 6;
+ m_windowsz->x = std::min(m_windowsz->x, wm->desktop_width()
+ - (tpos & TASKBAR_V ? tsize : 0));
+ m_windowsz->y = std::min(m_windowsz->y, wm->desktop_height()
+ - (tpos & TASKBAR_H ? tsize : 0)
+ - (tpos & TASKBAR_BOTTOM ? title_bar : 0));
+ sprintf(env_str, "SDL_VIDEO_WINDOW_POS=%d,%d", x, y);
+ putenv(env_str);
+ }
+ else
+ {
+ putenv("SDL_VIDEO_WINDOW_POS=center");
+ putenv("SDL_VIDEO_CENTERED=1");
+ }
+}
+#endif
+
void SDLWrapper::resize(coord_def &m_windowsz)
{
glmanager->reset_view_for_resize(m_windowsz);