// This file is part of the "Irrlicht Engine".\r
// For conditions of distribution and use, see copyright notice in irrlicht.h\r
\r
-#include "IrrCompileConfig.h"\r
\r
#ifdef _IRR_COMPILE_WITH_WINDOWS_DEVICE_\r
\r
\r
#include "CIrrDeviceWin32.h"\r
#include "IEventReceiver.h"\r
-#include "irrList.h"\r
#include "os.h"\r
\r
#include "CTimer.h"\r
#include "IGUISpriteBank.h"\r
#include <winuser.h>\r
#include "SExposedVideoData.h"\r
+\r
#if defined(_IRR_COMPILE_WITH_JOYSTICK_EVENTS_)\r
#include <mmsystem.h>\r
#include <regstr.h>\r
#ifdef _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_\r
#define DIRECTINPUT_VERSION 0x0800\r
#include <dinput.h>\r
-#ifdef _MSC_VER\r
-#pragma comment(lib, "dinput8.lib")\r
-#pragma comment(lib, "dxguid.lib")\r
-#endif\r
-#else\r
-#ifdef _MSC_VER\r
-#pragma comment(lib, "winmm.lib")\r
-#endif\r
#endif\r
#endif\r
\r
for(joystick = 0; joystick < joystickInfo.size(); ++joystick)\r
{\r
char logString[256];\r
- (void)sprintf(logString, "Found joystick %d, %d axes, %d buttons '%s'",\r
+ snprintf_irr(logString, sizeof(logString), "Found joystick %d, %d axes, %d buttons '%s'",\r
joystick, joystickInfo[joystick].Axes,\r
joystickInfo[joystick].Buttons, joystickInfo[joystick].Name.c_str());\r
os::Printer::log(logString, ELL_INFORMATION);\r
}\r
} // end namespace irr\r
\r
-// Get the codepage from the locale language id\r
-// Based on the table from http://www.science.co.il/Language/Locale-Codes.asp?s=decimal\r
-static unsigned int LocaleIdToCodepage(unsigned int lcid)\r
-{\r
- switch ( lcid )\r
- {\r
- case 1098: // Telugu\r
- case 1095: // Gujarati\r
- case 1094: // Punjabi\r
- case 1103: // Sanskrit\r
- case 1111: // Konkani\r
- case 1114: // Syriac\r
- case 1099: // Kannada\r
- case 1102: // Marathi\r
- case 1125: // Divehi\r
- case 1067: // Armenian\r
- case 1081: // Hindi\r
- case 1079: // Georgian\r
- case 1097: // Tamil\r
- return 0;\r
- case 1054: // Thai\r
- return 874;\r
- case 1041: // Japanese\r
- return 932;\r
- case 2052: // Chinese (PRC)\r
- case 4100: // Chinese (Singapore)\r
- return 936;\r
- case 1042: // Korean\r
- return 949;\r
- case 5124: // Chinese (Macau S.A.R.)\r
- case 3076: // Chinese (Hong Kong S.A.R.)\r
- case 1028: // Chinese (Taiwan)\r
- return 950;\r
- case 1048: // Romanian\r
- case 1060: // Slovenian\r
- case 1038: // Hungarian\r
- case 1051: // Slovak\r
- case 1045: // Polish\r
- case 1052: // Albanian\r
- case 2074: // Serbian (Latin)\r
- case 1050: // Croatian\r
- case 1029: // Czech\r
- return 1250;\r
- case 1104: // Mongolian (Cyrillic)\r
- case 1071: // FYRO Macedonian\r
- case 2115: // Uzbek (Cyrillic)\r
- case 1058: // Ukrainian\r
- case 2092: // Azeri (Cyrillic)\r
- case 1092: // Tatar\r
- case 1087: // Kazakh\r
- case 1059: // Belarusian\r
- case 1088: // Kyrgyz (Cyrillic)\r
- case 1026: // Bulgarian\r
- case 3098: // Serbian (Cyrillic)\r
- case 1049: // Russian\r
- return 1251;\r
- case 8201: // English (Jamaica)\r
- case 3084: // French (Canada)\r
- case 1036: // French (France)\r
- case 5132: // French (Luxembourg)\r
- case 5129: // English (New Zealand)\r
- case 6153: // English (Ireland)\r
- case 1043: // Dutch (Netherlands)\r
- case 9225: // English (Caribbean)\r
- case 4108: // French (Switzerland)\r
- case 4105: // English (Canada)\r
- case 1110: // Galician\r
- case 10249: // English (Belize)\r
- case 3079: // German (Austria)\r
- case 6156: // French (Monaco)\r
- case 12297: // English (Zimbabwe)\r
- case 1069: // Basque\r
- case 2067: // Dutch (Belgium)\r
- case 2060: // French (Belgium)\r
- case 1035: // Finnish\r
- case 1080: // Faroese\r
- case 1031: // German (Germany)\r
- case 3081: // English (Australia)\r
- case 1033: // English (United States)\r
- case 2057: // English (United Kingdom)\r
- case 1027: // Catalan\r
- case 11273: // English (Trinidad)\r
- case 7177: // English (South Africa)\r
- case 1030: // Danish\r
- case 13321: // English (Philippines)\r
- case 15370: // Spanish (Paraguay)\r
- case 9226: // Spanish (Colombia)\r
- case 5130: // Spanish (Costa Rica)\r
- case 7178: // Spanish (Dominican Republic)\r
- case 12298: // Spanish (Ecuador)\r
- case 17418: // Spanish (El Salvador)\r
- case 4106: // Spanish (Guatemala)\r
- case 18442: // Spanish (Honduras)\r
- case 3082: // Spanish (International Sort)\r
- case 13322: // Spanish (Chile)\r
- case 19466: // Spanish (Nicaragua)\r
- case 2058: // Spanish (Mexico)\r
- case 10250: // Spanish (Peru)\r
- case 20490: // Spanish (Puerto Rico)\r
- case 1034: // Spanish (Traditional Sort)\r
- case 14346: // Spanish (Uruguay)\r
- case 8202: // Spanish (Venezuela)\r
- case 1089: // Swahili\r
- case 1053: // Swedish\r
- case 2077: // Swedish (Finland)\r
- case 5127: // German (Liechtenstein)\r
- case 1078: // Afrikaans\r
- case 6154: // Spanish (Panama)\r
- case 4103: // German (Luxembourg)\r
- case 16394: // Spanish (Bolivia)\r
- case 2055: // German (Switzerland)\r
- case 1039: // Icelandic\r
- case 1057: // Indonesian\r
- case 1040: // Italian (Italy)\r
- case 2064: // Italian (Switzerland)\r
- case 2068: // Norwegian (Nynorsk)\r
- case 11274: // Spanish (Argentina)\r
- case 1046: // Portuguese (Brazil)\r
- case 1044: // Norwegian (Bokmal)\r
- case 1086: // Malay (Malaysia)\r
- case 2110: // Malay (Brunei Darussalam)\r
- case 2070: // Portuguese (Portugal)\r
- return 1252;\r
- case 1032: // Greek\r
- return 1253;\r
- case 1091: // Uzbek (Latin)\r
- case 1068: // Azeri (Latin)\r
- case 1055: // Turkish\r
- return 1254;\r
- case 1037: // Hebrew\r
- return 1255;\r
- case 5121: // Arabic (Algeria)\r
- case 15361: // Arabic (Bahrain)\r
- case 9217: // Arabic (Yemen)\r
- case 3073: // Arabic (Egypt)\r
- case 2049: // Arabic (Iraq)\r
- case 11265: // Arabic (Jordan)\r
- case 13313: // Arabic (Kuwait)\r
- case 12289: // Arabic (Lebanon)\r
- case 4097: // Arabic (Libya)\r
- case 6145: // Arabic (Morocco)\r
- case 8193: // Arabic (Oman)\r
- case 16385: // Arabic (Qatar)\r
- case 1025: // Arabic (Saudi Arabia)\r
- case 10241: // Arabic (Syria)\r
- case 14337: // Arabic (U.A.E.)\r
- case 1065: // Farsi\r
- case 1056: // Urdu\r
- case 7169: // Arabic (Tunisia)\r
- return 1256;\r
- case 1061: // Estonian\r
- case 1062: // Latvian\r
- case 1063: // Lithuanian\r
- return 1257;\r
- case 1066: // Vietnamese\r
- return 1258;\r
- }\r
- return 65001; // utf-8\r
-}\r
-\r
namespace\r
{\r
struct SEnvMapper\r
irr::core::array<SEnvMapper> EnvMap;\r
\r
HKL KEYBOARD_INPUT_HKL=0;\r
- unsigned int KEYBOARD_INPUT_CODEPAGE = 1252;\r
}\r
\r
irr::CIrrDeviceWin32* getDeviceFromHWnd(HWND hWnd)\r
\r
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
- #ifndef WM_MOUSEWHEEL\r
- #define WM_MOUSEWHEEL 0x020A\r
- #endif\r
#ifndef WHEEL_DELTA\r
#define WHEEL_DELTA 120\r
#endif\r
// middle and extra buttons\r
if (wParam & MK_MBUTTON)\r
event.MouseInput.ButtonStates |= irr::EMBSM_MIDDLE;\r
-#if(_WIN32_WINNT >= 0x0500)\r
if (wParam & MK_XBUTTON1)\r
event.MouseInput.ButtonStates |= irr::EMBSM_EXTRA1;\r
if (wParam & MK_XBUTTON2)\r
event.MouseInput.ButtonStates |= irr::EMBSM_EXTRA2;\r
-#endif\r
event.MouseInput.Wheel = 0.f;\r
\r
// wheel\r
event.KeyInput.Key = (irr::EKEY_CODE)wParam;\r
event.KeyInput.PressedDown = (message==WM_KEYDOWN || message == WM_SYSKEYDOWN);\r
\r
- const UINT MY_MAPVK_VSC_TO_VK_EX = 3; // MAPVK_VSC_TO_VK_EX should be in SDK according to MSDN, but isn't in mine.\r
if ( event.KeyInput.Key == irr::KEY_SHIFT )\r
{\r
- // this will fail on systems before windows NT/2000/XP, not sure _what_ will return there instead.\r
- event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((lParam>>16) & 255), MY_MAPVK_VSC_TO_VK_EX );\r
+ event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((lParam>>16) & 255), MAPVK_VSC_TO_VK_EX );\r
}\r
if ( event.KeyInput.Key == irr::KEY_CONTROL )\r
{\r
- event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((lParam>>16) & 255), MY_MAPVK_VSC_TO_VK_EX );\r
+ event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((lParam>>16) & 255), MAPVK_VSC_TO_VK_EX );\r
// some keyboards will just return LEFT for both - left and right keys. So also check extend bit.\r
if (lParam & 0x1000000)\r
event.KeyInput.Key = irr::KEY_RCONTROL;\r
}\r
if ( event.KeyInput.Key == irr::KEY_MENU )\r
{\r
- event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((lParam>>16) & 255), MY_MAPVK_VSC_TO_VK_EX );\r
+ event.KeyInput.Key = (irr::EKEY_CODE)MapVirtualKey( ((lParam>>16) & 255), MAPVK_VSC_TO_VK_EX );\r
if (lParam & 0x1000000)\r
event.KeyInput.Key = irr::KEY_RMENU;\r
}\r
event.KeyInput.Shift = ((allKeys[VK_SHIFT] & 0x80)!=0);\r
event.KeyInput.Control = ((allKeys[VK_CONTROL] & 0x80)!=0);\r
\r
- // Handle unicode and deadkeys in a way that works since Windows 95 and nt4.0\r
- // Using ToUnicode instead would be shorter, but would to my knowledge not run on 95 and 98.\r
- WORD keyChars[2];\r
+ // Handle unicode and deadkeys\r
+ WCHAR keyChars[2];\r
UINT scanCode = HIWORD(lParam);\r
- int conversionResult = ToAsciiEx(static_cast<UINT>(wParam),scanCode,allKeys,keyChars,0,KEYBOARD_INPUT_HKL);\r
+ int conversionResult = ToUnicodeEx(static_cast<UINT>(wParam),scanCode,allKeys,keyChars,2,0,KEYBOARD_INPUT_HKL);\r
if (conversionResult == 1)\r
- {\r
- WORD unicodeChar;\r
- MultiByteToWideChar(\r
- KEYBOARD_INPUT_CODEPAGE,\r
- MB_PRECOMPOSED, // default\r
- (LPCSTR)keyChars,\r
- sizeof(keyChars),\r
- (WCHAR*)&unicodeChar,\r
- 1 );\r
- event.KeyInput.Char = unicodeChar;\r
- }\r
+ event.KeyInput.Char = keyChars[0];\r
else\r
event.KeyInput.Char = 0;\r
\r
dev->postEventFromUser(event);\r
\r
if (message == WM_SYSKEYDOWN || message == WM_SYSKEYUP)\r
- return DefWindowProc(hWnd, message, wParam, lParam);\r
+ return DefWindowProcW(hWnd, message, wParam, lParam);\r
else\r
return 0;\r
}\r
\r
break;\r
\r
- case WM_ACTIVATE:\r
- // we need to take care for screen changes, e.g. Alt-Tab\r
- dev = getDeviceFromHWnd(hWnd);\r
- if (dev && dev->isFullscreen())\r
- {\r
- if ((wParam&0xFF)==WA_INACTIVE)\r
- {\r
- // If losing focus we minimize the app to show other one\r
- ShowWindow(hWnd,SW_MINIMIZE);\r
- // and switch back to default resolution\r
- dev->switchToFullScreen(true);\r
- }\r
- else\r
- {\r
- // Otherwise we retore the fullscreen Irrlicht app\r
- SetForegroundWindow(hWnd);\r
- ShowWindow(hWnd, SW_RESTORE);\r
- // and set the fullscreen resolution again\r
- dev->switchToFullScreen();\r
- }\r
- }\r
- break;\r
-\r
case WM_USER:\r
event.EventType = irr::EET_USER_EVENT;\r
event.UserEvent.UserData1 = static_cast<size_t>(wParam);\r
case WM_INPUTLANGCHANGE:\r
// get the new codepage used for keyboard input\r
KEYBOARD_INPUT_HKL = GetKeyboardLayout(0);\r
- KEYBOARD_INPUT_CODEPAGE = LocaleIdToCodepage( LOWORD(KEYBOARD_INPUT_HKL) );\r
return 0;\r
}\r
- return DefWindowProc(hWnd, message, wParam, lParam);\r
+ return DefWindowProcW(hWnd, message, wParam, lParam);\r
}\r
\r
\r
\r
//! constructor\r
CIrrDeviceWin32::CIrrDeviceWin32(const SIrrlichtCreationParameters& params)\r
-: CIrrDeviceStub(params), HWnd(0), ChangedToFullScreen(false), Resized(false),\r
- ExternalWindow(false), Win32CursorControl(0), JoyControl(0)\r
+: CIrrDeviceStub(params), HWnd(0), Resized(false),\r
+ ExternalWindow(false), Win32CursorControl(0), JoyControl(0),\r
+ WindowMaximized(params.WindowMaximized)\r
{\r
#ifdef _DEBUG\r
setDebugName("CIrrDeviceWin32");\r
// get handle to exe file\r
HINSTANCE hInstance = GetModuleHandle(0);\r
\r
- // Store original desktop mode.\r
-\r
- memset(&DesktopMode, 0, sizeof(DesktopMode));\r
- DesktopMode.dmSize = sizeof(DesktopMode);\r
-\r
- EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &DesktopMode);\r
-\r
// create the window if we need to and we do not use the null device\r
if (!CreationParams.WindowId && CreationParams.DriverType != video::EDT_NULL)\r
{\r
- const fschar_t* ClassName = __TEXT("CIrrDeviceWin32");\r
+ const wchar_t* ClassName = L"CIrrDeviceWin32";\r
\r
// Register Class\r
- WNDCLASSEX wcex;\r
- wcex.cbSize = sizeof(WNDCLASSEX);\r
+ WNDCLASSEXW wcex;\r
+ wcex.cbSize = sizeof(WNDCLASSEXW);\r
wcex.style = CS_HREDRAW | CS_VREDRAW;\r
wcex.lpfnWndProc = WndProc;\r
wcex.cbClsExtra = 0;\r
wcex.hIconSm = 0;\r
\r
// if there is an icon, load it\r
- wcex.hIcon = (HICON)LoadImage(hInstance, __TEXT("irrlicht.ico"), IMAGE_ICON, 0,0, LR_LOADFROMFILE | LR_DEFAULTSIZE);\r
+ wcex.hIcon = (HICON)LoadImageW(hInstance, L"irrlicht.ico", IMAGE_ICON, 0,0, LR_LOADFROMFILE | LR_DEFAULTSIZE);\r
\r
- RegisterClassEx(&wcex);\r
+ RegisterClassExW(&wcex);\r
\r
// calculate client size\r
\r
clientSize.right = CreationParams.WindowSize.Width;\r
clientSize.bottom = CreationParams.WindowSize.Height;\r
\r
- DWORD style = getWindowStyle(CreationParams.Fullscreen, CreationParams.WindowResizable);\r
+ DWORD style = getWindowStyle(CreationParams.Fullscreen, CreationParams.WindowResizable > 0 ? true : false);\r
AdjustWindowRect(&clientSize, style, FALSE);\r
\r
const s32 realWidth = clientSize.right - clientSize.left;\r
}\r
\r
// create window\r
- HWnd = CreateWindow( ClassName, __TEXT(""), style, windowLeft, windowTop,\r
+ HWnd = CreateWindowW( ClassName, L"", style, windowLeft, windowTop,\r
realWidth, realHeight, NULL, NULL, hInstance, NULL);\r
if (!HWnd)\r
{\r
SetForegroundWindow(HWnd);\r
}\r
\r
- // get the codepage used for keyboard input\r
KEYBOARD_INPUT_HKL = GetKeyboardLayout(0);\r
- KEYBOARD_INPUT_CODEPAGE = LocaleIdToCodepage( LOWORD(KEYBOARD_INPUT_HKL) );\r
\r
// inform driver about the window size etc.\r
resizeIfNecessary();\r
+\r
+ if (params.WindowMaximized)\r
+ maximizeWindow();\r
}\r
\r
\r
break;\r
}\r
}\r
-\r
- switchToFullScreen(true);\r
}\r
\r
\r
os::Printer::log("OpenGL-ES2 driver was not compiled in.", ELL_ERROR);\r
#endif\r
break;\r
- case EDT_WEBGL1:\r
+ case video::EDT_WEBGL1:\r
os::Printer::log("WebGL1 driver not supported on Win32 device.", ELL_ERROR);\r
break;\r
- case video::EDT_SOFTWARE:\r
-#ifdef _IRR_COMPILE_WITH_SOFTWARE_\r
- switchToFullScreen();\r
-\r
- VideoDriver = video::createSoftwareDriver(CreationParams.WindowSize, CreationParams.Fullscreen, FileSystem, this);\r
-#else\r
- os::Printer::log("Software driver was not compiled in.", ELL_ERROR);\r
-#endif\r
- break;\r
- case video::EDT_BURNINGSVIDEO:\r
-#ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_\r
- switchToFullScreen();\r
-\r
- VideoDriver = video::createBurningVideoDriver(CreationParams, FileSystem, this);\r
-#else\r
- os::Printer::log("Burning's Video driver was not compiled in.", ELL_ERROR);\r
-#endif\r
- break;\r
case video::EDT_NULL:\r
VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize);\r
break;\r
\r
if (r.right < 2 || r.bottom < 2)\r
{\r
- sprintf(tmp, "Ignoring resize operation to (%ld %ld)", r.right, r.bottom);\r
+ snprintf_irr(tmp, sizeof(tmp), "Ignoring resize operation to (%ld %ld)", r.right, r.bottom);\r
os::Printer::log(tmp);\r
}\r
else\r
{\r
- sprintf(tmp, "Resizing window (%ld %ld)", r.right, r.bottom);\r
+ snprintf_irr(tmp, sizeof(tmp), "Resizing window (%ld %ld)", r.right, r.bottom);\r
os::Printer::log(tmp);\r
\r
getVideoDriver()->OnResize(irr::core::dimension2du((u32)r.right, (u32)r.bottom));\r
}\r
\r
\r
-//! presents a surface in the client area\r
-bool CIrrDeviceWin32::present(video::IImage* image, void* windowId, core::rect<s32>* src)\r
-{\r
- HWND hwnd = HWnd;\r
- if ( windowId )\r
- hwnd = reinterpret_cast<HWND>(windowId);\r
-\r
- HDC dc = GetDC(hwnd);\r
-\r
- if ( dc )\r
- {\r
- RECT rect;\r
- GetClientRect(hwnd, &rect);\r
- const void* memory = (const void *)image->getData();\r
-\r
- BITMAPV4HEADER bi;\r
- ZeroMemory (&bi, sizeof(bi));\r
- bi.bV4Size = sizeof(BITMAPINFOHEADER);\r
- bi.bV4BitCount = (WORD)image->getBitsPerPixel();\r
- bi.bV4Planes = 1;\r
- bi.bV4Width = image->getDimension().Width;\r
- bi.bV4Height = -((s32)image->getDimension().Height);\r
- bi.bV4V4Compression = BI_BITFIELDS;\r
- bi.bV4AlphaMask = image->getAlphaMask();\r
- bi.bV4RedMask = image->getRedMask();\r
- bi.bV4GreenMask = image->getGreenMask();\r
- bi.bV4BlueMask = image->getBlueMask();\r
-\r
- if ( src )\r
- {\r
- StretchDIBits(dc, 0,0, rect.right, rect.bottom,\r
- src->UpperLeftCorner.X, src->UpperLeftCorner.Y,\r
- src->getWidth(), src->getHeight(),\r
- memory, (const BITMAPINFO*)(&bi), DIB_RGB_COLORS, SRCCOPY);\r
- }\r
- else\r
- {\r
- StretchDIBits(dc, 0,0, rect.right, rect.bottom,\r
- 0, 0, image->getDimension().Width, image->getDimension().Height,\r
- memory, (const BITMAPINFO*)(&bi), DIB_RGB_COLORS, SRCCOPY);\r
- }\r
-\r
- ReleaseDC(hwnd, dc);\r
- }\r
- return true;\r
-}\r
-\r
-\r
//! notifies the device that it should close itself\r
void CIrrDeviceWin32::closeDevice()\r
{\r
PostQuitMessage(0);\r
PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);\r
DestroyWindow(HWnd);\r
- const fschar_t* ClassName = __TEXT("CIrrDeviceWin32");\r
+ const wchar_t* ClassName = L"CIrrDeviceWin32";\r
HINSTANCE hInstance = GetModuleHandle(0);\r
- UnregisterClass(ClassName, hInstance);\r
+ UnregisterClassW(ClassName, hInstance);\r
}\r
Close=true;\r
}\r
}\r
\r
\r
+//! returns last state from maximizeWindow() and restoreWindow()\r
+bool CIrrDeviceWin32::isWindowMaximized() const\r
+{\r
+ return WindowMaximized;\r
+}\r
+\r
+\r
//! switches to fullscreen\r
-bool CIrrDeviceWin32::switchToFullScreen(bool reset)\r
+bool CIrrDeviceWin32::switchToFullScreen()\r
{\r
if (!CreationParams.Fullscreen)\r
return true;\r
\r
- if (reset)\r
- {\r
- if (ChangedToFullScreen)\r
- {\r
- return (ChangeDisplaySettings(&DesktopMode,0)==DISP_CHANGE_SUCCESSFUL);\r
- }\r
- else\r
- return true;\r
- }\r
-\r
- // use default values from current setting\r
+ // No border, title bar, etc. is already set up through getWindowStyle()\r
+ // We only set the window size to match the monitor.\r
\r
- DEVMODE dm;\r
- memset(&dm, 0, sizeof(dm));\r
- dm.dmSize = sizeof(dm);\r
-\r
- EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm);\r
- dm.dmPelsWidth = CreationParams.WindowSize.Width;\r
- dm.dmPelsHeight = CreationParams.WindowSize.Height;\r
- dm.dmBitsPerPel = CreationParams.Bits;\r
- dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;\r
-\r
- LONG res = ChangeDisplaySettings(&dm, CDS_FULLSCREEN);\r
- if (res != DISP_CHANGE_SUCCESSFUL)\r
- { // try again without forcing display frequency\r
- dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;\r
- res = ChangeDisplaySettings(&dm, CDS_FULLSCREEN);\r
+ MONITORINFO mi;\r
+ mi.cbSize = sizeof(mi);\r
+ if (GetMonitorInfo(MonitorFromWindow(HWnd,MONITOR_DEFAULTTOPRIMARY),&mi))\r
+ {\r
+ UINT flags = SWP_NOCOPYBITS|SWP_NOOWNERZORDER|SWP_FRAMECHANGED;\r
+ SetWindowPos(HWnd, HWND_TOP, mi.rcMonitor.left, mi.rcMonitor.top,\r
+ mi.rcMonitor.right - mi.rcMonitor.left,\r
+ mi.rcMonitor.bottom - mi.rcMonitor.top, flags);\r
}\r
-\r
- bool ret = false;\r
- switch(res)\r
+ else\r
{\r
- case DISP_CHANGE_SUCCESSFUL:\r
- ChangedToFullScreen = true;\r
- ret = true;\r
- break;\r
- case DISP_CHANGE_RESTART:\r
- os::Printer::log("Switch to fullscreen: The computer must be restarted in order for the graphics mode to work.", ELL_ERROR);\r
- break;\r
- case DISP_CHANGE_BADFLAGS:\r
- os::Printer::log("Switch to fullscreen: An invalid set of flags was passed in.", ELL_ERROR);\r
- break;\r
- case DISP_CHANGE_BADPARAM:\r
- os::Printer::log("Switch to fullscreen: An invalid parameter was passed in. This can include an invalid flag or combination of flags.", ELL_ERROR);\r
- break;\r
- case DISP_CHANGE_FAILED:\r
- os::Printer::log("Switch to fullscreen: The display driver failed the specified graphics mode.", ELL_ERROR);\r
- break;\r
- case DISP_CHANGE_BADMODE:\r
- os::Printer::log("Switch to fullscreen: The graphics mode is not supported.", ELL_ERROR);\r
- break;\r
- default:\r
- os::Printer::log("An unknown error occurred while changing to fullscreen.", ELL_ERROR);\r
- break;\r
+ CreationParams.Fullscreen = false;\r
}\r
- return ret;\r
+\r
+ return CreationParams.Fullscreen;\r
}\r
\r
\r
return Win32CursorControl;\r
}\r
\r
-\r
-//! \return Returns a pointer to a list with all video modes supported\r
-//! by the gfx adapter.\r
-video::IVideoModeList* CIrrDeviceWin32::getVideoModeList()\r
-{\r
- if (!VideoModeList->getVideoModeCount())\r
- {\r
- // enumerate video modes.\r
- DWORD i=0;\r
- DEVMODE mode;\r
- memset(&mode, 0, sizeof(mode));\r
- mode.dmSize = sizeof(mode);\r
-\r
- while (EnumDisplaySettings(NULL, i, &mode))\r
- {\r
- VideoModeList->addMode(core::dimension2d<u32>(mode.dmPelsWidth, mode.dmPelsHeight),\r
- mode.dmBitsPerPel);\r
-\r
- ++i;\r
- }\r
-\r
- if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &mode))\r
- VideoModeList->setDesktop(mode.dmBitsPerPel, core::dimension2d<u32>(mode.dmPelsWidth, mode.dmPelsHeight));\r
- }\r
-\r
- return VideoModeList;\r
-}\r
-\r
-typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);\r
-// Needed for old windows apis\r
-// depending on the SDK version and compilers some defines might be available\r
-// or not\r
-#ifndef PRODUCT_ULTIMATE\r
-#define PRODUCT_ULTIMATE 0x00000001\r
-#define PRODUCT_HOME_BASIC 0x00000002\r
-#define PRODUCT_HOME_PREMIUM 0x00000003\r
-#define PRODUCT_ENTERPRISE 0x00000004\r
-#define PRODUCT_HOME_BASIC_N 0x00000005\r
-#define PRODUCT_BUSINESS 0x00000006\r
-#define PRODUCT_STARTER 0x0000000B\r
-#endif\r
-#ifndef PRODUCT_ULTIMATE_N\r
-#define PRODUCT_BUSINESS_N 0x00000010\r
-#define PRODUCT_HOME_PREMIUM_N 0x0000001A\r
-#define PRODUCT_ENTERPRISE_N 0x0000001B\r
-#define PRODUCT_ULTIMATE_N 0x0000001C\r
-#endif\r
-#ifndef PRODUCT_STARTER_N\r
-#define PRODUCT_STARTER_N 0x0000002F\r
-#endif\r
-#ifndef PRODUCT_PROFESSIONAL\r
-#define PRODUCT_PROFESSIONAL 0x00000030\r
-#define PRODUCT_PROFESSIONAL_N 0x00000031\r
-#endif\r
-#ifndef PRODUCT_ULTIMATE_E\r
-#define PRODUCT_STARTER_E 0x00000042\r
-#define PRODUCT_HOME_BASIC_E 0x00000043\r
-#define PRODUCT_HOME_PREMIUM_E 0x00000044\r
-#define PRODUCT_PROFESSIONAL_E 0x00000045\r
-#define PRODUCT_ENTERPRISE_E 0x00000046\r
-#define PRODUCT_ULTIMATE_E 0x00000047\r
-#endif\r
-\r
void CIrrDeviceWin32::getWindowsVersion(core::stringc& out)\r
{\r
- OSVERSIONINFOEX osvi;\r
- PGPI pGPI;\r
- BOOL bOsVersionInfoEx;\r
-\r
- ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));\r
- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\r
+ OSVERSIONINFO osvi;\r
\r
- bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);\r
- if (!bOsVersionInfoEx)\r
- {\r
- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\r
- if (! GetVersionEx((OSVERSIONINFO *) &osvi))\r
- return;\r
- }\r
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFO));\r
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\r
+ GetVersionEx(&osvi);\r
\r
- switch (osvi.dwPlatformId)\r
- {\r
- case VER_PLATFORM_WIN32_NT:\r
- if (osvi.dwMajorVersion <= 4)\r
- out.append("Microsoft Windows NT ");\r
- else\r
- if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)\r
- out.append("Microsoft Windows 2000 ");\r
- else\r
- if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1)\r
- out.append("Microsoft Windows XP ");\r
- else\r
- if (osvi.dwMajorVersion == 6 )\r
- {\r
- if (osvi.dwMinorVersion == 0)\r
- {\r
- if (osvi.wProductType == VER_NT_WORKSTATION)\r
- out.append("Microsoft Windows Vista ");\r
- else\r
- out.append("Microsoft Windows Server 2008 ");\r
- }\r
- else if (osvi.dwMinorVersion == 1)\r
- {\r
- if (osvi.wProductType == VER_NT_WORKSTATION)\r
- out.append("Microsoft Windows 7 ");\r
- else\r
- out.append("Microsoft Windows Server 2008 R2 ");\r
- }\r
- else if (osvi.dwMinorVersion == 2)\r
- {\r
- out.append("Microsoft Windows 8 or later ");\r
- }\r
- }\r
-\r
- if (bOsVersionInfoEx)\r
- {\r
- if (osvi.dwMajorVersion == 6)\r
- {\r
- DWORD dwType;\r
- pGPI = (PGPI)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetProductInfo");\r
- pGPI(osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType);\r
-\r
- switch (dwType)\r
- {\r
- case PRODUCT_ULTIMATE:\r
- case PRODUCT_ULTIMATE_E:\r
- case PRODUCT_ULTIMATE_N:\r
- out.append("Ultimate Edition ");\r
- break;\r
- case PRODUCT_PROFESSIONAL:\r
- case PRODUCT_PROFESSIONAL_E:\r
- case PRODUCT_PROFESSIONAL_N:\r
- out.append("Professional Edition ");\r
- break;\r
- case PRODUCT_HOME_BASIC:\r
- case PRODUCT_HOME_BASIC_E:\r
- case PRODUCT_HOME_BASIC_N:\r
- out.append("Home Basic Edition ");\r
- break;\r
- case PRODUCT_HOME_PREMIUM:\r
- case PRODUCT_HOME_PREMIUM_E:\r
- case PRODUCT_HOME_PREMIUM_N:\r
- out.append("Home Premium Edition ");\r
- break;\r
- case PRODUCT_ENTERPRISE:\r
- case PRODUCT_ENTERPRISE_E:\r
- case PRODUCT_ENTERPRISE_N:\r
- out.append("Enterprise Edition ");\r
- break;\r
- case PRODUCT_BUSINESS:\r
- case PRODUCT_BUSINESS_N:\r
- out.append("Business Edition ");\r
- break;\r
- case PRODUCT_STARTER:\r
- case PRODUCT_STARTER_E:\r
- case PRODUCT_STARTER_N:\r
- out.append("Starter Edition ");\r
- break;\r
- }\r
- }\r
-#ifdef VER_SUITE_ENTERPRISE\r
- else\r
- if (osvi.wProductType == VER_NT_WORKSTATION)\r
- {\r
-#ifndef __BORLANDC__\r
- if( osvi.wSuiteMask & VER_SUITE_PERSONAL )\r
- out.append("Personal ");\r
- else\r
- out.append("Professional ");\r
-#endif\r
- }\r
- else if (osvi.wProductType == VER_NT_SERVER)\r
- {\r
- if( osvi.wSuiteMask & VER_SUITE_DATACENTER )\r
- out.append("DataCenter Server ");\r
- else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE )\r
- out.append("Advanced Server ");\r
- else\r
- out.append("Server ");\r
- }\r
-#endif\r
- }\r
- else\r
- {\r
- HKEY hKey;\r
- char szProductType[80];\r
- DWORD dwBufLen;\r
-\r
- RegOpenKeyEx( HKEY_LOCAL_MACHINE,\r
- __TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"),\r
- 0, KEY_QUERY_VALUE, &hKey );\r
- RegQueryValueEx( hKey, __TEXT("ProductType"), NULL, NULL,\r
- (LPBYTE) szProductType, &dwBufLen);\r
- RegCloseKey( hKey );\r
-\r
- \r
- if (irr::core::stringc("WINNT").equals_ignore_case(szProductType))\r
- out.append("Professional ");\r
- if (irr::core::stringc("LANMANNT").equals_ignore_case(szProductType))\r
- out.append("Server ");\r
- if (irr::core::stringc("SERVERNT").equals_ignore_case(szProductType))\r
- out.append("Advanced Server ");\r
- }\r
-\r
- // Display version, service pack (if any), and build number.\r
-\r
- char tmp[255];\r
-\r
- if (osvi.dwMajorVersion <= 4 )\r
- {\r
- sprintf(tmp, "version %lu.%lu %s (Build %lu)",\r
- osvi.dwMajorVersion,\r
- osvi.dwMinorVersion,\r
- irr::core::stringc(osvi.szCSDVersion).c_str(),\r
- osvi.dwBuildNumber & 0xFFFF);\r
- }\r
- else\r
- {\r
- sprintf(tmp, "%s (Build %lu)", irr::core::stringc(osvi.szCSDVersion).c_str(),\r
- osvi.dwBuildNumber & 0xFFFF);\r
- }\r
-\r
- out.append(tmp);\r
- break;\r
-\r
- case VER_PLATFORM_WIN32_WINDOWS:\r
-\r
- if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)\r
- {\r
- out.append("Microsoft Windows 95 ");\r
- if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )\r
- out.append("OSR2 " );\r
- }\r
-\r
- if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)\r
- {\r
- out.append("Microsoft Windows 98 ");\r
- if ( osvi.szCSDVersion[1] == 'A' )\r
- out.append( "SE " );\r
- }\r
-\r
- if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)\r
- out.append("Microsoft Windows Me ");\r
-\r
- break;\r
-\r
- case VER_PLATFORM_WIN32s:\r
- out.append("Microsoft Win32s ");\r
- break;\r
- }\r
+ char tmp[255];\r
+ snprintf(tmp, sizeof(tmp), "Microsoft Windows %lu.%lu %s", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.szCSDVersion);\r
+ out.append(tmp);\r
}\r
\r
//! Notifies the device, that it has been resized\r
GetWindowPlacement(HWnd, &wndpl);\r
wndpl.showCmd = SW_SHOWMAXIMIZED;\r
SetWindowPlacement(HWnd, &wndpl);\r
+\r
+ WindowMaximized = true;\r
}\r
\r
\r
GetWindowPlacement(HWnd, &wndpl);\r
wndpl.showCmd = SW_SHOWNORMAL;\r
SetWindowPlacement(HWnd, &wndpl);\r
+\r
+ WindowMaximized = false;\r
}\r
\r
core::position2di CIrrDeviceWin32::getWindowPosition()\r
}\r
\r
\r
-//! Set the current Gamma Value for the Display\r
-bool CIrrDeviceWin32::setGammaRamp( f32 red, f32 green, f32 blue, f32 brightness, f32 contrast )\r
-{\r
- bool r;\r
- u16 ramp[3][256];\r
-\r
- calculateGammaRamp( ramp[0], red, brightness, contrast );\r
- calculateGammaRamp( ramp[1], green, brightness, contrast );\r
- calculateGammaRamp( ramp[2], blue, brightness, contrast );\r
-\r
- HDC dc = GetDC(0);\r
- r = SetDeviceGammaRamp ( dc, ramp ) == TRUE;\r
- ReleaseDC(HWnd, dc);\r
- return r;\r
-}\r
-\r
-//! Get the current Gamma Value for the Display\r
-bool CIrrDeviceWin32::getGammaRamp( f32 &red, f32 &green, f32 &blue, f32 &brightness, f32 &contrast )\r
-{\r
- bool r;\r
- u16 ramp[3][256];\r
-\r
- HDC dc = GetDC(0);\r
- r = GetDeviceGammaRamp ( dc, ramp ) == TRUE;\r
- ReleaseDC(HWnd, dc);\r
-\r
- if (r)\r
- {\r
- calculateGammaFromRamp(red, ramp[0]);\r
- calculateGammaFromRamp(green, ramp[1]);\r
- calculateGammaFromRamp(blue, ramp[2]);\r
- }\r
-\r
- brightness = 0.f;\r
- contrast = 0.f;\r
-\r
- return r;\r
-}\r
-\r
-\r
//! Process system events\r
void CIrrDeviceWin32::handleSystemMessages()\r
{\r
{}\r
}\r
\r
-// shows last error in a messagebox to help internal debugging.\r
-void CIrrDeviceWin32::ReportLastWinApiError()\r
-{\r
- // (based on code from ovidiucucu from http://www.codeguru.com/forum/showthread.php?t=318721)\r
- LPCTSTR pszCaption = __TEXT("Windows SDK Error Report");\r
- DWORD dwError = GetLastError();\r
-\r
- if(NOERROR == dwError)\r
- {\r
- MessageBox(NULL, __TEXT("No error"), pszCaption, MB_OK);\r
- }\r
- else\r
- {\r
- const DWORD dwFormatControl = FORMAT_MESSAGE_ALLOCATE_BUFFER |\r
- FORMAT_MESSAGE_IGNORE_INSERTS |\r
- FORMAT_MESSAGE_FROM_SYSTEM;\r
-\r
- LPVOID pTextBuffer = NULL;\r
- DWORD dwCount = FormatMessage(dwFormatControl,\r
- NULL,\r
- dwError,\r
- 0,\r
- (LPTSTR) &pTextBuffer,\r
- 0,\r
- NULL);\r
- if(0 != dwCount)\r
- {\r
- MessageBox(NULL, (LPCTSTR)pTextBuffer, pszCaption, MB_OK|MB_ICONERROR);\r
- LocalFree(pTextBuffer);\r
- }\r
- else\r
- {\r
- MessageBox(NULL, __TEXT("Unknown error"), pszCaption, MB_OK|MB_ICONERROR);\r
- }\r
- }\r
-}\r
-\r
-// Same function Windows offers in VersionHelpers.h, but we can't use that as it's not available in older sdk's (minimum is SDK 8.1)\r
-bool CIrrDeviceWin32::isWindowsVistaOrGreater()\r
-{\r
-#if (_WIN32_WINNT >= 0x0500)\r
- OSVERSIONINFOEX osvi;\r
- ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));\r
- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);\r
- osvi.dwMajorVersion = 6; // Windows Vista\r
-\r
- if ( !GetVersionEx((OSVERSIONINFO*)&osvi) )\r
- {\r
- return false;\r
- }\r
-\r
- return VerifyVersionInfo(&osvi, VER_MAJORVERSION, VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL)) ? true : false;\r
-#else\r
- return false;\r
-#endif\r
-}\r
-\r
// Convert an Irrlicht texture to a Windows cursor\r
// Based on http://www.codeguru.com/cpp/w-p/win32/cursors/article.php/c4529/\r
HCURSOR CIrrDeviceWin32::TextureToCursor(HWND hwnd, irr::video::ITexture * tex, const core::rect<s32>& sourceRect, const core::position2d<s32> &hotspot)\r