summaryrefslogtreecommitdiff
path: root/src/PowderToySDL.cpp
diff options
context:
space:
mode:
authormmbob <mmbob+github@outlook.com>2013-04-22 17:04:43 (GMT)
committer mmbob <mmbob+github@outlook.com>2013-04-22 17:04:43 (GMT)
commit63050715ee54f1e8c39f69557d6d012bd6316d6b (patch)
treeb93f142720a13c801f59e0959d515c89052aa8a1 /src/PowderToySDL.cpp
parentada7c7bb11e99ea31cc4b417de9892b71ec8525c (diff)
downloadpowder-63050715ee54f1e8c39f69557d6d012bd6316d6b.zip
powder-63050715ee54f1e8c39f69557d6d012bd6316d6b.tar.gz
Replace __ImageBase. Save + load window position.
Instead of using the __ImageBase global variable, use the GetModuleHandle(NULL) function to get the exe's HMODULE/HINSTANCE. Save the window position when the game is closed and restore it when it is opened. Defaults to being centered on the desktop.
Diffstat (limited to 'src/PowderToySDL.cpp')
-rw-r--r--src/PowderToySDL.cpp98
1 files changed, 92 insertions, 6 deletions
diff --git a/src/PowderToySDL.cpp b/src/PowderToySDL.cpp
index c57b3b9..d5d0949 100644
--- a/src/PowderToySDL.cpp
+++ b/src/PowderToySDL.cpp
@@ -53,10 +53,6 @@ Atom XA_CLIPBOARD, XA_TARGETS;
char *clipboardText = NULL;
-#ifdef WIN
-extern "C" IMAGE_DOS_HEADER __ImageBase;
-#endif
-
int desktopWidth = 1280, desktopHeight = 1024;
SDL_Surface * sdl_scrn;
@@ -276,8 +272,11 @@ int SDLOpen()
exit(-1);
}
HWND WindowHandle = SysInfo.window;
- HICON hIconSmall = (HICON)LoadImage(reinterpret_cast<HMODULE>(&__ImageBase), MAKEINTRESOURCE(101), IMAGE_ICON, 16, 16, LR_SHARED);
- HICON hIconBig = (HICON)LoadImage(reinterpret_cast<HMODULE>(&__ImageBase), MAKEINTRESOURCE(101), IMAGE_ICON, 32, 32, LR_SHARED);
+
+ // Use GetModuleHandle to get the Exe HMODULE/HINSTANCE
+ HMODULE hModExe = GetModuleHandle(NULL);
+ HICON hIconSmall = (HICON)LoadImage(hModExe, MAKEINTRESOURCE(101), IMAGE_ICON, 16, 16, LR_SHARED);
+ HICON hIconBig = (HICON)LoadImage(hModExe, MAKEINTRESOURCE(101), IMAGE_ICON, 32, 32, LR_SHARED);
SendMessage(WindowHandle, WM_SETICON, ICON_SMALL, (LPARAM)hIconSmall);
SendMessage(WindowHandle, WM_SETICON, ICON_BIG, (LPARAM)hIconBig);
#elif defined(LIN)
@@ -543,6 +542,83 @@ int GetModifiers()
return SDL_GetModState();
}
+#ifdef WIN
+
+// Returns true if the loaded position was set
+// Returns false if something went wrong: SDL_GetWMInfo failed or the loaded position was invalid
+bool LoadWindowPosition()
+{
+ SDL_SysWMinfo sysInfo;
+ SDL_VERSION(&sysInfo.version);
+ if (SDL_GetWMInfo(&sysInfo) > 0)
+ {
+ RECT rcWindow;
+ GetWindowRect(sysInfo.window, &rcWindow);
+
+ int windowW = rcWindow.right - rcWindow.left - 1;
+ int windowH = rcWindow.bottom - rcWindow.top - 1;
+
+ int windowX = Client::Ref().GetPrefInteger("WindowX", INT_MAX);
+ int windowY = Client::Ref().GetPrefInteger("WindowY", INT_MAX);
+
+ bool setDefaultPos = true;
+
+ if (windowX != INT_MAX && windowY != INT_MAX)
+ {
+ POINT windowPoints[] = {
+ {windowX, windowY}, // Top-left
+ {windowX + windowW, windowY + windowH} // Bottom-right
+ };
+
+ MONITORINFO monitor;
+ monitor.cbSize = sizeof(monitor);
+ if (GetMonitorInfo(MonitorFromPoint(windowPoints[0], MONITOR_DEFAULTTOPRIMARY), &monitor) != 0)
+ {
+ // Only use the saved window position if it lies inside the visible screen
+ if (PtInRect(&monitor.rcMonitor, windowPoints[0]) && PtInRect(&monitor.rcMonitor, windowPoints[1]))
+ {
+ SetWindowPos(sysInfo.window, 0, windowX, windowY, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
+
+ setDefaultPos = false;
+ }
+ }
+ }
+
+ if (setDefaultPos)
+ {
+ // Center the window on the primary desktop by default
+ SetWindowPos(sysInfo.window, 0, (desktopWidth - windowW) / 2, (desktopHeight - windowH) / 2, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
+ }
+
+ // True if we didn't use the default, i.e. the position was valid
+ return !setDefaultPos;
+ }
+
+ return false;
+}
+
+// Returns true if the window position was saved
+bool SaveWindowPosition()
+{
+ SDL_SysWMinfo sysInfo;
+ SDL_VERSION(&sysInfo.version);
+ if (SDL_GetWMInfo(&sysInfo) > 0)
+ {
+ WINDOWPLACEMENT placement;
+ placement.length = sizeof(placement);
+ GetWindowPlacement(sysInfo.window, &placement);
+
+ Client::Ref().SetPref("WindowX", placement.rcNormalPosition.left);
+ Client::Ref().SetPref("WindowY", placement.rcNormalPosition.top);
+
+ return true;
+ }
+
+ return false;
+}
+
+#endif
+
int main(int argc, char * argv[])
{
currentWidth = XRES+BARSIZE;
@@ -603,6 +679,12 @@ int main(int argc, char * argv[])
int sdlStatus = SDLOpen();
sdl_scrn = SDLSetScreen(tempScale, tempFullscreen);
+
+#ifdef WIN
+ // Must be after SDLSetScreen to account for scale
+ LoadWindowPosition();
+#endif
+
#ifdef OGLI
SDL_GL_SetAttribute (SDL_GL_DOUBLEBUFFER, 1);
//glScaled(2.0f, 2.0f, 1.0f);
@@ -734,6 +816,10 @@ int main(int argc, char * argv[])
EngineProcess();
+#ifdef WIN
+ SaveWindowPosition();
+#endif
+
ui::Engine::Ref().CloseWindow();
delete gameController;
delete ui::Engine::Ref().g;