/* GWEN Copyright (c) 2011 Facepunch Studios See license in Gwen.h */ #include "Gwen/Macros.h" #include "Gwen/Platform.h" #ifdef _WIN32 #include #include #pragma comment(lib, "winmm.lib") using namespace Gwen; using namespace Gwen::Platform; #ifdef UNICODE static LPWSTR iCursorConvertion[] = #else static LPSTR iCursorConvertion[] = #endif { IDC_ARROW, IDC_IBEAM, IDC_SIZENS, IDC_SIZEWE, IDC_SIZENWSE, IDC_SIZENESW, IDC_SIZEALL, IDC_NO, IDC_WAIT, IDC_HAND}; void Gwen::Platform::SetCursor(unsigned char iCursor) { // Todo.. Properly. ::SetCursor(LoadCursor(NULL, iCursorConvertion[iCursor])); } Gwen::UnicodeString Gwen::Platform::GetClipboardText() { if (!OpenClipboard(NULL)) return L""; HANDLE hData = GetClipboardData(CF_UNICODETEXT); if (hData == NULL) { CloseClipboard(); return L""; } wchar_t* buffer = (wchar_t*)GlobalLock(hData); UnicodeString str = buffer; GlobalUnlock(hData); CloseClipboard(); return str; } bool Gwen::Platform::SetClipboardText(const Gwen::UnicodeString& str) { if (!OpenClipboard(NULL)) return false; EmptyClipboard(); // Create a buffer to hold the string size_t iDataSize = (str.length() + 1) * sizeof(wchar_t); HGLOBAL clipbuffer = GlobalAlloc(GMEM_DDESHARE, iDataSize); // Copy the string into the buffer wchar_t* buffer = (wchar_t*)GlobalLock(clipbuffer); //wcscpy_s( buffer, iDataSize, str.c_str() ); memcpy(buffer, str.c_str(), iDataSize); GlobalUnlock(clipbuffer); // Place it on the clipboard SetClipboardData(CF_UNICODETEXT, clipbuffer); CloseClipboard(); return true; } double GetPerformanceFrequency() { static double Frequency = 0.0f; if (Frequency == 0.0f) { __int64 perfFreq; QueryPerformanceFrequency((LARGE_INTEGER*)&perfFreq); Frequency = 1.0 / (double)perfFreq; } return Frequency; } float Gwen::Platform::GetTimeInSeconds() { #if 1 static float fCurrentTime = 0.0f; static __int64 iLastTime = 0; __int64 thistime; QueryPerformanceCounter((LARGE_INTEGER*)&thistime); float fSecondsDifference = (double)(thistime - iLastTime) * GetPerformanceFrequency(); if (fSecondsDifference > 0.1f) fSecondsDifference = 0.1f; fCurrentTime += fSecondsDifference; iLastTime = thistime; return fCurrentTime; #else return timeGetTime() / 1000.0; #endif } bool Gwen::Platform::FileOpen(const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Event::Handler::FunctionStr fnCallback) { char Filestring[256]; String returnstring; char FilterBuffer[512]; { memset(FilterBuffer, 0, sizeof(FilterBuffer)); memcpy(FilterBuffer, Extension.c_str(), GwenUtil_Min(Extension.size(), 512)); for (int i = 0; i < 512; i++) { if (FilterBuffer[i] == '|') FilterBuffer[i] = 0; } } OPENFILENAMEA opf; opf.hwndOwner = 0; opf.lpstrFilter = FilterBuffer; opf.lpstrCustomFilter = 0; opf.nMaxCustFilter = 0L; opf.nFilterIndex = 1L; opf.lpstrFile = Filestring; opf.lpstrFile[0] = '\0'; opf.nMaxFile = 256; opf.lpstrFileTitle = 0; opf.nMaxFileTitle = 50; opf.lpstrInitialDir = StartPath.c_str(); opf.lpstrTitle = Name.c_str(); opf.nFileOffset = 0; opf.nFileExtension = 0; opf.lpstrDefExt = "*.*"; opf.lpfnHook = NULL; opf.lCustData = 0; opf.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR) & ~OFN_ALLOWMULTISELECT; opf.lStructSize = sizeof(OPENFILENAME); if (GetOpenFileNameA(&opf)) { if (pHandler && fnCallback) { (pHandler->*fnCallback)(opf.lpstrFile); } } else { if (pHandler && fnCallback) { (pHandler->*fnCallback)(""); } } return true; } bool Gwen::Platform::FileSave(const String& Name, const String& StartPath, const String& Extension, Gwen::Event::Handler* pHandler, Gwen::Event::Handler::FunctionStr fnCallback) { char Filestring[256]; String returnstring; char FilterBuffer[512]; { memset(FilterBuffer, 0, sizeof(FilterBuffer)); memcpy(FilterBuffer, Extension.c_str(), GwenUtil_Min(Extension.size(), 512)); for (int i = 0; i < 512; i++) { if (FilterBuffer[i] == '|') FilterBuffer[i] = 0; } } OPENFILENAMEA opf; opf.hwndOwner = 0; opf.lpstrFilter = FilterBuffer; opf.lpstrCustomFilter = 0; opf.nMaxCustFilter = 0L; opf.nFilterIndex = 1L; opf.lpstrFile = Filestring; opf.lpstrFile[0] = '\0'; opf.nMaxFile = 256; opf.lpstrFileTitle = 0; opf.nMaxFileTitle = 50; opf.lpstrInitialDir = StartPath.c_str(); opf.lpstrTitle = Name.c_str(); opf.nFileOffset = 0; opf.nFileExtension = 0; opf.lpstrDefExt = "*.*"; opf.lpfnHook = NULL; opf.lCustData = 0; opf.Flags = (OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR) & ~OFN_ALLOWMULTISELECT; opf.lStructSize = sizeof(OPENFILENAME); if (GetSaveFileNameA(&opf)) { if (pHandler && fnCallback) { (pHandler->*fnCallback)(opf.lpstrFile); } } else { if (pHandler && fnCallback) { (pHandler->*fnCallback)(""); } } return true; } #endif // WIN32