// Windows layer-independent code #include "compat.h" #include "build.h" #include "baselayer.h" #include "osd.h" #include "cache1d.h" #include "winbits.h" #ifdef BITNESS64 # define EBACKTRACEDLL "ebacktrace1-64.dll" #else # define EBACKTRACEDLL "ebacktrace1.dll" #endif int32_t backgroundidle = 1; int64_t win_timerfreq = 0; char silentvideomodeswitch = 0; static char taskswitching = 1; static HANDLE instanceflag = NULL; static OSVERSIONINFOEX osv; static int32_t togglecomp = 0; FARPROC pwinever; // // CheckWinVersion() -- check to see what version of Windows we happen to be running under // BOOL CheckWinVersion(void) { HMODULE hntdll = GetModuleHandle("ntdll.dll"); if (hntdll) pwinever = GetProcAddress(hntdll, "wine_get_version"); ZeroMemory(&osv, sizeof(osv)); osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!GetVersionEx((LPOSVERSIONINFOA)&osv)) return FALSE; return TRUE; } static void win_printversion(void) { const char *ver = ""; switch (osv.dwPlatformId) { case VER_PLATFORM_WIN32_WINDOWS: if (osv.dwMinorVersion < 10) ver = "95"; else if (osv.dwMinorVersion < 90) ver = "98"; else ver = "ME"; break; case VER_PLATFORM_WIN32_NT: switch (osv.dwMajorVersion) { case 5: switch (osv.dwMinorVersion) { case 0: ver = "2000"; break; case 1: ver = "XP"; break; case 2: ver = osv.wProductType == VER_NT_WORKSTATION ? "XP x64" : "Server 2003"; break; } break; case 6: switch (osv.dwMinorVersion) { case 0: ver = osv.wProductType == VER_NT_WORKSTATION ? "Vista" : "Server 2008"; break; case 1: ver = osv.wProductType == VER_NT_WORKSTATION ? "7" : "Server 2008 R2"; break; case 2: ver = osv.wProductType == VER_NT_WORKSTATION ? "8" : "Server 2012"; break; case 3: ver = osv.wProductType == VER_NT_WORKSTATION ? "8.1" : "Server 2012 R2"; break; } break; case 10: switch (osv.dwMinorVersion) { case 0: ver = osv.wProductType == VER_NT_WORKSTATION ? "10" : "Server 2016"; break; } break; } break; } char *str = (char *)Xcalloc(1, 256); int l; if (pwinever) l = Bsprintf(str, "Wine %s identifying as Windows %s", (char *)pwinever(), ver); else l = Bsprintf(str, "Windows %s", ver); // service packs if (osv.szCSDVersion[0]) { str[l] = 32; Bstrcat(&str[l], osv.szCSDVersion); } initprintf("Running on %s (build %lu.%lu.%lu)\n", str, osv.dwMajorVersion, osv.dwMinorVersion, osv.dwBuildNumber); Bfree(str); } // // win_allowtaskswitching() -- captures/releases alt+tab hotkeys // void win_allowtaskswitching(int32_t onf) { if (onf == taskswitching) return; taskswitching = onf; if (onf) { UnregisterHotKey(0,0); UnregisterHotKey(0,1); } else { RegisterHotKey(0,0,MOD_ALT,VK_TAB); RegisterHotKey(0,1,MOD_ALT|MOD_SHIFT,VK_TAB); } } // // win_checkinstance() -- looks for another instance of a Build app // int32_t win_checkinstance(void) { if (!instanceflag) return 0; return (WaitForSingleObject(instanceflag,0) == WAIT_TIMEOUT); } // // high-resolution timers for profiling // #if defined(RENDERTYPEWIN) || SDL_MAJOR_VERSION==1 int32_t win_inittimer(void) { int64_t t; if (win_timerfreq) return 0; // already installed // OpenWatcom seems to want us to query the value into a local variable // instead of the global 'win_timerfreq' or else it gets pissed with an // access violation if (!QueryPerformanceFrequency((LARGE_INTEGER *)&t)) { ShowErrorBox("Failed fetching timer frequency"); return -1; } win_timerfreq = t; return 0; } uint64_t win_getu64ticks(void) { uint64_t i; if (win_timerfreq == 0) return 0; QueryPerformanceCounter((LARGE_INTEGER *)&i); return i; } #endif static void ToggleDesktopComposition(BOOL compEnable) { static HMODULE hDWMApiDLL = NULL; static HRESULT(WINAPI *aDwmEnableComposition)(UINT); if (!hDWMApiDLL && (hDWMApiDLL = LoadLibrary("DWMAPI.DLL"))) aDwmEnableComposition = (HRESULT(WINAPI *)(UINT))(void (*)(void))GetProcAddress(hDWMApiDLL, "DwmEnableComposition"); if (aDwmEnableComposition) { aDwmEnableComposition(compEnable); if (!silentvideomodeswitch) initprintf("%sabling desktop composition...\n", (compEnable) ? "En" : "Dis"); } } typedef void (*dllSetString)(const char*); // // win_open(), win_init(), win_setvideomode(), win_uninit(), win_close() -- shared code // void win_open(void) { #ifdef DEBUGGINGAIDS HMODULE ebacktrace = LoadLibraryA(EBACKTRACEDLL); if (ebacktrace) { dllSetString SetTechnicalName = (dllSetString) (void (*)(void))GetProcAddress(ebacktrace, "SetTechnicalName"); dllSetString SetProperName = (dllSetString) (void (*)(void))GetProcAddress(ebacktrace, "SetProperName"); if (SetTechnicalName) SetTechnicalName(AppTechnicalName); if (SetProperName) SetProperName(AppProperName); } #endif instanceflag = CreateSemaphore(NULL, 1,1, WindowClass); } void win_init(void) { uint32_t i; static osdcvardata_t cvars_win[] = { { "r_togglecomposition","enable/disable toggle of desktop composition when initializing screen modes",(void *) &togglecomp, CVAR_BOOL, 0, 1 }, }; for (i=0; i