// Windows layer-independent code #include "compat.h" #include "build.h" #include "baselayer.h" #include "osd.h" #include "cache1d.h" #include "winbits.h" #if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__) # 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 = 1; // // CheckWinVersion() -- check to see what version of Windows we happen to be running under // BOOL CheckWinVersion(void) { ZeroMemory(&osv, sizeof(osv)); osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); // we don't like anything older than Windows XP if (!GetVersionEx((LPOSVERSIONINFOA)&osv)) return FALSE; if (osv.dwMajorVersion >= 6) return TRUE; if (osv.dwMajorVersion == 5 && osv.dwMinorVersion >= 1) return TRUE; return FALSE; } static void win_printversion(void) { const char *ver = ""; switch (osv.dwPlatformId) { case VER_PLATFORM_WIN32_NT: if (osv.dwMajorVersion == 5) { switch (osv.dwMinorVersion) { case 1: ver = "XP"; break; case 2: ver = osv.wProductType == VER_NT_WORKSTATION ? "XP x64" : "Server 2003"; break; } break; } if (osv.dwMajorVersion == 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; } break; } initprintf("Windows %s", ver); if (osv.szCSDVersion && osv.szCSDVersion[0]) initprintf(" %s", osv.szCSDVersion); initprintf(" (build %lu.%lu.%lu)\n", osv.dwMajorVersion, osv.dwMinorVersion, osv.dwBuildNumber); } // // win_allowtaskswitching() -- captures/releases alt+tab hotkeys // void win_allowtaskswitching(int32_t onf) { if (onf == taskswitching) return; 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); } taskswitching = onf; } // // 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 // 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; } static void ToggleDesktopComposition(BOOL compEnable) { static HMODULE hDWMApiDLL = NULL; static HRESULT(WINAPI *aDwmEnableComposition)(UINT); if (!hDWMApiDLL && (hDWMApiDLL = LoadLibrary("DWMAPI.DLL"))) aDwmEnableComposition = (HRESULT(WINAPI *)(UINT))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) GetProcAddress(ebacktrace, "SetTechnicalName"); dllSetString SetProperName = (dllSetString) 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; cvar_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= 8) || (defined __clang__ && __clang_major__ == 3 && __clang_minor__ >= 4) # include "mingw_main.c" #endif