aboutsummaryrefslogtreecommitdiff
path: root/backends/platform
diff options
context:
space:
mode:
authorLittleboy2011-06-26 19:51:52 -0400
committerLittleboy2011-06-26 20:13:35 -0400
commit7983b1cce3fb5831f7437ea689b951ac7cd9c5a3 (patch)
tree67594162f38f4303ed568118a6f488c97fc6cf43 /backends/platform
parentf065b612a61c781285a5c3ad4c4473f4261607be (diff)
downloadscummvm-rg350-7983b1cce3fb5831f7437ea689b951ac7cd9c5a3.tar.gz
scummvm-rg350-7983b1cce3fb5831f7437ea689b951ac7cd9c5a3.tar.bz2
scummvm-rg350-7983b1cce3fb5831f7437ea689b951ac7cd9c5a3.zip
BACKENDS: Add special Win32 path to set SDL window icon
We bypass SDL_WM_SetIcon and setup the window icon using the embedded icon, with the default path as a fallback. This allows us to use an antialised icon with alpha transparency (which the default included icon doesn't have) on Windows XP and later
Diffstat (limited to 'backends/platform')
-rw-r--r--backends/platform/sdl/win32/win32.cpp24
-rw-r--r--backends/platform/sdl/win32/win32.h1
2 files changed, 25 insertions, 0 deletions
diff --git a/backends/platform/sdl/win32/win32.cpp b/backends/platform/sdl/win32/win32.cpp
index 814f1955fe..420ed2465b 100644
--- a/backends/platform/sdl/win32/win32.cpp
+++ b/backends/platform/sdl/win32/win32.cpp
@@ -34,6 +34,8 @@
#undef ARRAYSIZE // winnt.h defines ARRAYSIZE, but we want our own one...
#include <shellapi.h>
+#include <SDL_syswm.h> // For setting the icon
+
#include "backends/platform/sdl/win32/win32.h"
#include "backends/fs/windows/windows-fs-factory.h"
#include "backends/taskbar/win32/win32-taskbar.h"
@@ -137,6 +139,28 @@ bool OSystem_Win32::displayLogFile() {
return false;
}
+void OSystem_Win32::setupIcon() {
+ HMODULE handle = GetModuleHandle(NULL);
+ HICON ico = LoadIcon(handle, MAKEINTRESOURCE(1001 /* IDI_ICON */));
+ if (ico) {
+ SDL_SysWMinfo wminfo;
+ SDL_VERSION(&wminfo.version);
+ if (SDL_GetWMInfo(&wminfo)) {
+ // Replace the handle to the icon associated with the window class by our custom icon
+ SetClassLongPtr(wminfo.window, GCLP_HICON, (ULONG_PTR)ico);
+
+ // Since there wasn't any default icon, we can't use the return value from SetClassLong
+ // to check for errors (it would be 0 in both cases: error or no previous value for the
+ // icon handle). Instead we check for the last-error code value.
+ if (GetLastError() == ERROR_SUCCESS)
+ return;
+ }
+ }
+
+ // If no icon has been set, fallback to default path
+ OSystem_SDL::setupIcon();
+}
+
Common::String OSystem_Win32::getDefaultConfigFileName() {
char configFile[MAXPATHLEN];
diff --git a/backends/platform/sdl/win32/win32.h b/backends/platform/sdl/win32/win32.h
index ef7b6af3f1..cc2fc51d36 100644
--- a/backends/platform/sdl/win32/win32.h
+++ b/backends/platform/sdl/win32/win32.h
@@ -46,6 +46,7 @@ protected:
*/
Common::String _logFilePath;
+ virtual void setupIcon();
virtual Common::String getDefaultConfigFileName();
virtual Common::WriteStream *createLogFile();
};