Files
bullet3/examples/ThirdPartyLibs/Gwen/Platforms/Windows.cpp
erwincoumans ab8f16961e Code-style consistency improvement:
Apply clang-format-all.sh using the _clang-format file through all the cpp/.h files.
make sure not to apply it to certain serialization structures, since some parser expects the * as part of the name, instead of type.
This commit contains no other changes aside from adding and applying clang-format-all.sh
2018-09-23 14:17:31 -07:00

235 lines
4.8 KiB
C++

/*
GWEN
Copyright (c) 2011 Facepunch Studios
See license in Gwen.h
*/
#include "Gwen/Macros.h"
#include "Gwen/Platform.h"
#ifdef _WIN32
#include <windows.h>
#include <mmsystem.h>
#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