1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-16 07:14:09 +02:00

CachedEnumerateInputDevices

This commit is contained in:
Brian Fiete 2021-04-11 07:02:00 -04:00
parent f34424a61d
commit 9e3248fb4f
2 changed files with 36 additions and 8 deletions

View file

@ -1,4 +1,5 @@
using System; using System;
using System.Threading;
namespace Beefy.input namespace Beefy.input
{ {
@ -33,6 +34,33 @@ namespace Beefy.input
[CallingConvention(.Stdcall), CLink] [CallingConvention(.Stdcall), CLink]
public static extern void* BFApp_CreateInputDevice(char8* guid); public static extern void* BFApp_CreateInputDevice(char8* guid);
public Monitor mMonitor = new .() ~ delete _;
public String mEnumerateString = new .() ~ delete _;
public bool mEnumerating;
public void CachedEnumerateInputDevices(String outData)
{
using (mMonitor.Enter())
{
outData.Append(mEnumerateString);
if (!mEnumerating)
{
mEnumerating = true;
ThreadPool.QueueUserWorkItem(new () =>
{
String data = scope .();
data.Append(BFApp_EnumerateInputDevices());
using (mMonitor.Enter())
{
mEnumerateString.Set(data);
mEnumerating = false;
}
});
}
}
}
public void EnumerateInputDevices(String outData) public void EnumerateInputDevices(String outData)
{ {
outData.Append(BFApp_EnumerateInputDevices()); outData.Append(BFApp_EnumerateInputDevices());

View file

@ -8,30 +8,30 @@ USING_NS_BF;
static BOOL DIEnumDevicesCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef) static BOOL DIEnumDevicesCallback(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
{ {
DInputManager* _this = (DInputManager*)pvRef; String& outStr = *(String*)pvRef;
auto AddStr = [&](const StringImpl& str) auto AddStr = [&](const StringImpl& str)
{ {
for (auto c : str) for (auto c : str)
{ {
if ((c >= 32) && (c < 128)) if ((c >= 32) && (c < 128))
_this->mEnumData += c; outStr += c;
} }
}; };
AddStr(UTF8Encode(lpddi->tszInstanceName)); AddStr(UTF8Encode(lpddi->tszInstanceName));
_this->mEnumData += "\t"; outStr += "\t";
AddStr(UTF8Encode(lpddi->tszProductName)); AddStr(UTF8Encode(lpddi->tszProductName));
auto guid = lpddi->guidInstance; auto guid = lpddi->guidInstance;
_this->mEnumData += StrFormat("\t%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", outStr += StrFormat("\t%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",
guid.Data1, guid.Data2, guid.Data3, guid.Data1, guid.Data2, guid.Data3,
guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3], guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
//OutputDebugStrF("Device: %s %s\n", lpddi->tszInstanceName, lpddi->tszProductName); //OutputDebugStrF("Device: %s %s\n", lpddi->tszInstanceName, lpddi->tszProductName);
_this->mEnumData += "\n"; outStr += "\n";
return TRUE; return TRUE;
} }
@ -86,10 +86,10 @@ DInputDevice* DInputManager::CreateInputDevice(const StringImpl& guidStr)
String DInputManager::EnumerateDevices() String DInputManager::EnumerateDevices()
{ {
mEnumData.Clear(); String str;
if (mDirectInput != NULL) if (mDirectInput != NULL)
mDirectInput->EnumDevices(DI8DEVCLASS_ALL, DIEnumDevicesCallback, this, DIEDFL_ATTACHEDONLY); mDirectInput->EnumDevices(DI8DEVCLASS_ALL, DIEnumDevicesCallback, &str, DIEDFL_ATTACHEDONLY);
return mEnumData; return str;
} }
DInputDevice::~DInputDevice() DInputDevice::~DInputDevice()