SL-13610 [MAC] Manufacturer based search

master
Andrey Kleshchev 2022-12-29 19:16:15 +02:00 committed by akleshchev
parent 6481d36c69
commit 3084f86417
11 changed files with 286 additions and 177 deletions

View File

@ -1384,9 +1384,9 @@
<key>archive</key>
<map>
<key>hash</key>
<string>69c3e7c8cbf47d6f840011d1fa34cd8b</string>
<string>a487fff84208a45844602c4a1f68c974</string>
<key>url</key>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/108791/947410/libndofdev-0.1.577357-darwin64-577357.tar.bz2</string>
<string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76356/727333/libndofdev-0.1.555523-darwin64-555523.tar.bz2</string>
</map>
<key>name</key>
<string>darwin64</string>
@ -1417,7 +1417,7 @@
</map>
</map>
<key>version</key>
<string>0.1.577357</string>
<string>0.1.555523</string>
</map>
<key>libpng</key>
<map>

View File

@ -197,7 +197,7 @@ public:
// windows only DirectInput8 for joysticks
virtual void* getDirectInput8() { return NULL; };
virtual bool getInputDevices(U32 device_type_filter,
std::function<bool(std::string&, LLSD::Binary&, void*)> osx_callback,
std::function<bool(std::string&, LLSD&, void*)> osx_callback,
void* win_callback,
void* userdata)
{

View File

@ -1813,53 +1813,158 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)
}
}
// Device and Element Interfaces
typedef enum HIDElementTypeMask
// String should match ndof, so string mapping code was copied as is
static char mapChar( char c )
{
kHIDElementTypeInput = 1 << 1,
kHIDElementTypeOutput = 1 << 2,
kHIDElementTypeFeature = 1 << 3,
kHIDElementTypeCollection = 1 << 4,
kHIDElementTypeIO = kHIDElementTypeInput | kHIDElementTypeOutput | kHIDElementTypeFeature,
kHIDElementTypeAll = kHIDElementTypeIO | kHIDElementTypeCollection
}HIDElementTypeMask;
unsigned char uc = ( unsigned char ) c;
switch( uc )
{
case '/': return '-'; // use dash instead of slash
case 0x7F: return ' ';
case 0x80: return 'A';
case 0x81: return 'A';
case 0x82: return 'C';
case 0x83: return 'E';
case 0x84: return 'N';
case 0x85: return 'O';
case 0x86: return 'U';
case 0x87: return 'a';
case 0x88: return 'a';
case 0x89: return 'a';
case 0x8A: return 'a';
case 0x8B: return 'a';
case 0x8C: return 'a';
case 0x8D: return 'c';
case 0x8E: return 'e';
case 0x8F: return 'e';
case 0x90: return ' ';
case 0x91: return ' '; // ? '
case 0x92: return ' '; // ? '
case 0x93: return ' '; // ? "
case 0x94: return ' '; // ? "
case 0x95: return ' ';
case 0x96: return ' ';
case 0x97: return ' ';
case 0x98: return ' ';
case 0x99: return ' ';
case 0x9A: return ' ';
case 0x9B: return 0x27;
case 0x9C: return 0x22;
case 0x9D: return ' ';
case 0x9E: return ' ';
case 0x9F: return ' ';
case 0xA0: return ' ';
case 0xA1: return ' ';
case 0xA2: return ' ';
case 0xA3: return ' ';
case 0xA4: return ' ';
case 0xA5: return ' ';
case 0xA6: return ' ';
case 0xA7: return ' ';
case 0xA8: return ' ';
case 0xA9: return ' ';
case 0xAA: return ' ';
case 0xAB: return ' ';
case 0xAC: return ' ';
case 0xAD: return ' ';
case 0xAE: return ' ';
case 0xAF: return ' ';
case 0xB0: return ' ';
case 0xB1: return ' ';
case 0xB2: return ' ';
case 0xB3: return ' ';
case 0xB4: return ' ';
case 0xB5: return ' ';
case 0xB6: return ' ';
case 0xB7: return ' ';
case 0xB8: return ' ';
case 0xB9: return ' ';
case 0xBA: return ' ';
case 0xBB: return ' ';
case 0xBC: return ' ';
case 0xBD: return ' ';
case 0xBE: return ' ';
case 0xBF: return ' ';
case 0xC0: return ' ';
case 0xC1: return ' ';
case 0xC2: return ' ';
case 0xC3: return ' ';
case 0xC4: return ' ';
case 0xC5: return ' ';
case 0xC6: return ' ';
case 0xC7: return ' ';
case 0xC8: return ' ';
case 0xC9: return ' ';
case 0xCA: return ' ';
case 0xCB: return 'A';
case 0xCC: return 'A';
case 0xCD: return 'O';
case 0xCE: return ' ';
case 0xCF: return ' ';
case 0xD0: return '-';
case 0xD1: return '-';
case 0xD2: return 0x22;
case 0xD3: return 0x22;
case 0xD4: return 0x27;
case 0xD5: return 0x27;
case 0xD6: return '-'; // use dash instead of slash
case 0xD7: return ' ';
case 0xD8: return 'y';
case 0xD9: return 'Y';
case 0xDA: return '-'; // use dash instead of slash
case 0xDB: return ' ';
case 0xDC: return '<';
case 0xDD: return '>';
case 0xDE: return ' ';
case 0xDF: return ' ';
case 0xE0: return ' ';
case 0xE1: return ' ';
case 0xE2: return ',';
case 0xE3: return ',';
case 0xE4: return ' ';
case 0xE5: return 'A';
case 0xE6: return 'E';
case 0xE7: return 'A';
case 0xE8: return 'E';
case 0xE9: return 'E';
case 0xEA: return 'I';
case 0xEB: return 'I';
case 0xEC: return 'I';
case 0xED: return 'I';
case 0xEE: return 'O';
case 0xEF: return 'O';
case 0xF0: return ' ';
case 0xF1: return 'O';
case 0xF2: return 'U';
case 0xF3: return 'U';
case 0xF4: return 'U';
case 0xF5: return '|';
case 0xF6: return ' ';
case 0xF7: return ' ';
case 0xF8: return ' ';
case 0xF9: return ' ';
case 0xFA: return '.';
case 0xFB: return ' ';
case 0xFC: return ' ';
case 0xFD: return 0x22;
case 0xFE: return ' ';
case 0xFF: return ' ';
}
return c;
}
struct hu_element_t
// String should match ndof for manufacturer based search to work
static void sanitizeString( char* inCStr )
{
unsigned long type; // the type defined by IOHIDElementType in IOHIDKeys.h
long usage; // usage within above page from IOUSBHIDParser.h which defines specific usage
long usagePage; // usage page from IOUSBHIDParser.h which defines general usage
void* cookie; // unique value( within device of specific vendorID and productID ) which identifies element, will NOT change
long min; // reported min value possible
long max; // reported max value possible
long scaledMin; // reported scaled min value possible
long scaledMax; // reported scaled max value possible
long size; // size in bits of data return from element
unsigned char relative; // are reports relative to last report( deltas )
unsigned char wrapping; // does element wrap around( one value higher than max is min )
unsigned char nonLinear; // are the values reported non-linear relative to element movement
unsigned char preferredState; // does element have a preferred state( such as a button )
unsigned char nullState; // does element have null state
long units; // units value is reported in( not used very often )
long unitExp; // exponent for units( also not used very often )
char name[256]; // name of element( c string )
// runtime variables
long initialCenter; // center value at start up
unsigned char hasCenter; // whether or not to use center for calibration
long minReport; // min returned value
long maxReport; // max returned value( calibrate call )
long userMin; // user set value to scale to( scale call )
long userMax;
struct hu_element_t* pPrevious; // previous element( NULL at list head )
struct hu_element_t* pChild; // next child( only of collections )
struct hu_element_t* pSibling; // next sibling( for elements and collections )
long depth;
};
char* charIt = inCStr;
while ( *charIt )
{
*charIt = mapChar( *charIt );
charIt++;
}
}
struct HidDevice
{
@ -1871,20 +1976,6 @@ struct HidDevice
long mUsagePage;
};
/*************************************************************************
*
* hu_BuildDevice( inHIDDevice )
*
* Purpose: given a IO device object build a flat device record including device info and all elements
*
* Notes: handles NULL lists properly
*
* Inputs: inHIDDevice - the I/O device object
*
* Returns: hu_device_t* - the address of the new device record
*/
static void populate_device_info( io_object_t io_obj_p, CFDictionaryRef device_dic, HidDevice* devicep )
{
CFMutableDictionaryRef io_properties = nil;
@ -1927,6 +2018,7 @@ static void populate_device_info( io_object_t io_obj_p, CFDictionaryRef device_d
if ( dict_element )
{
bool res = CFStringGetCString((CFStringRef)dict_element, devicep->mProduct, 256, kCFStringEncodingUTF8);
sanitizeString(devicep->mProduct);
if ( !res )
{
LL_WARNS("Joystick") << "Failed to populate mProduct" << LL_ENDL;
@ -1941,6 +2033,7 @@ static void populate_device_info( io_object_t io_obj_p, CFDictionaryRef device_d
if ( dict_element )
{
bool res = CFStringGetCString( (CFStringRef)dict_element, devicep->mManufacturer, 256, kCFStringEncodingUTF8 );
sanitizeString(devicep->mManufacturer);
if ( !res )
{
LL_WARNS("Joystick") << "Failed to populate mManufacturer" << LL_ENDL;
@ -2115,17 +2208,30 @@ static void get_devices(std::list<HidDevice> &list_of_devices,
{
HidDevice device = populate_device( io_obj );
if (device.mAxis >= 3
|| (device.mUsagePage == kHIDPage_GenericDesktop
&& (device.mUsage == kHIDUsage_GD_MultiAxisController
|| device.mUsage == kHIDUsage_GD_GamePad
|| device.mUsage == kHIDUsage_GD_Joystick))
|| (device.mUsagePage == kHIDPage_Game
&& (device.mUsage == kHIDUsage_Game_3DGameController))
|| strstr(device.mManufacturer, "3Dconnexion"))
if (debugLoggingEnabled("Joystick"))
{
list_of_devices.push_back(device);
LL_DEBUGS("Joystick") << "Device axises: " << (S32)device.mAxis
<< "Device HIDUsepage: " << (S32)device.mUsagePage
<< "Device HIDUsage: " << (S32)device.mUsage
<< LL_ENDL;
}
else
{
// Should match ndof
if (device.mAxis >= 3
|| (device.mUsagePage == kHIDPage_GenericDesktop
&& (device.mUsage == kHIDUsage_GD_MultiAxisController
|| device.mUsage == kHIDUsage_GD_GamePad
|| device.mUsage == kHIDUsage_GD_Joystick))
|| (device.mUsagePage == kHIDPage_Game
&& device.mUsage == kHIDUsage_Game_3DGameController)
|| strstr(device.mManufacturer, "3Dconnexion"))
{
list_of_devices.push_back(device);
}
}
// release the device object, it is no longer needed
result = IOObjectRelease( io_obj );
@ -2137,7 +2243,7 @@ static void get_devices(std::list<HidDevice> &list_of_devices,
}
bool LLWindowMacOSX::getInputDevices(U32 device_type_filter,
std::function<bool(std::string&, LLSD::Binary&, void*)> osx_callback,
std::function<bool(std::string&, LLSD&, void*)> osx_callback,
void* win_callback,
void* userdata)
{
@ -2172,11 +2278,10 @@ bool LLWindowMacOSX::getInputDevices(U32 device_type_filter,
for (iter = device_list.begin(); iter != device_list.end(); ++iter)
{
S32 size = sizeof(long);
LLSD::Binary data; //just an std::vector
data.resize(size);
memcpy(&data[0], &iter->mLocalID, size);
std::string label(iter->mProduct);
LLSD data;
data["manufacturer"] = std::string(iter->mManufacturer);
data["product"] = label;
if (osx_callback(label, data, userdata))
{

View File

@ -114,7 +114,7 @@ public:
F32 getSystemUISize() override;
bool getInputDevices(U32 device_type_filter,
std::function<bool(std::string&, LLSD::Binary&, void*)> osx_callback,
std::function<bool(std::string&, LLSD&, void*)> osx_callback,
void* win_callback,
void* userdata) override;

View File

@ -4496,7 +4496,7 @@ void* LLWindowWin32::getDirectInput8()
}
bool LLWindowWin32::getInputDevices(U32 device_type_filter
std::function<bool(std::string&, LLSD::Binary&, void*)> osx_callback,
std::function<bool(std::string&, LLSD&, void*)> osx_callback,
void * di8_devices_callback,
void* userdata)
{

View File

@ -130,7 +130,7 @@ public:
/*virtual*/ void* getDirectInput8();
/*virtual*/ bool getInputDevices(U32 device_type_filter,
std::function<bool(std::string&, LLSD::Binary&, void*)> osx_callback,
std::function<bool(std::string&, LLSD&, void*)> osx_callback,
void* win_callback,
void* userdata);

View File

@ -3770,7 +3770,7 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<string>LLSD</string>
<key>Value</key>
<string />
</map>

View File

@ -250,7 +250,7 @@ void LLFloaterJoystick::refresh()
initFromSettings();
}
bool LLFloaterJoystick::addDeviceCallback(std::string &name, LLSD::Binary& value, void* userdata)
bool LLFloaterJoystick::addDeviceCallback(std::string &name, LLSD& value, void* userdata)
{
LLFloaterJoystick * floater = (LLFloaterJoystick*)userdata;
floater->mJoysticksCombo->add(name, value, ADD_BOTTOM, 1);
@ -280,9 +280,9 @@ void LLFloaterJoystick::refreshListOfDevices()
#elif LL_DARWIN
U32 device_type = 0;
#else
// MAC doesn't support device search yet
// On MAC there is an ndof_idsearch and it is possible to specify product
// and manufacturer in NDOF_Device for ndof_init_first to pick specific one
// On MAC it is possible to specify product
// and manufacturer in NDOF_Device for
// ndof_init_first to pick specific device
U32 device_type = 0;
#endif
if (gViewerWindow->getWindow()->getInputDevices(device_type, addDeviceCallback, win_calback, this))
@ -427,10 +427,11 @@ void LLFloaterJoystick::onCommitJoystickEnabled(LLUICtrl*, void *joy_panel)
joystick->toggleFlycam();
}
}
std::string device_id = LLViewerJoystick::getInstance()->getDeviceUUIDString();
gSavedSettings.setString("JoystickDeviceUUID", device_id);
LL_DEBUGS("Joystick") << "Selected " << device_id << " as joystick." << LL_ENDL;
LLViewerJoystick::getInstance()->saveDeviceIdToSettings();
std::string device_string = LLViewerJoystick::getInstance()->getDeviceUUIDString();
LL_DEBUGS("Joystick") << "Selected " << device_string << " as joystick." << LL_ENDL;
self->refreshListOfDevices();
}

View File

@ -46,7 +46,7 @@ public:
virtual void draw();
static void setSNDefaults();
static bool addDeviceCallback(std::string &name, LLSD::Binary& value, void* userdata);
static bool addDeviceCallback(std::string &name, LLSD& value, void* userdata);
void addDevice(std::string &name, LLSD& value);
protected:

View File

@ -229,18 +229,11 @@ std::string string_from_guid(const GUID &guid)
}
#elif LL_DARWIN
bool macos_devices_callback(std::string &product_name, LLSD::Binary &data, void* userdata)
bool macos_devices_callback(std::string &product_name, LLSD &data, void* userdata)
{
S32 size = sizeof(long);
long id;
memcpy(&id, &data[0], size);
std::string product = data["product"].asString();
NDOF_Device *device = ndof_idsearch(id);
if (device)
{
return LLViewerJoystick::getInstance()->initDevice(device, data);
}
return false;
return LLViewerJoystick::getInstance()->initDevice(nullptr, product, data);
}
#endif
@ -384,7 +377,7 @@ void LLViewerJoystick::init(bool autoenable)
{
U32 device_type = 0;
void* win_callback = nullptr;
std::function<bool(std::string&, LLSD::Binary&, void*)> osx_callback;
std::function<bool(std::string&, LLSD&, void*)> osx_callback;
// di8_devices_callback callback is immediate and happens in scope of getInputDevices()
#if LL_WINDOWS && !LL_MESA_HEADLESS
// space navigator is marked as DI8DEVCLASS_GAMECTRL in ndof lib
@ -393,27 +386,24 @@ void LLViewerJoystick::init(bool autoenable)
#elif LL_DARWIN
osx_callback = macos_devices_callback;
if (mLastDeviceUUID.isBinary())
if (mLastDeviceUUID.isMap())
{
S32 size = sizeof(long);
long id;
memcpy(&id, &mLastDeviceUUID[0], size);
std::string manufacturer = mLastDeviceUUID["manufacturer"].asString();
std::string product = mLastDeviceUUID["product"].asString();
// todo: search by manufcturer instead, locid might have changed
NDOF_Device *device = ndof_idsearch(id);
if (device)
strncpy(mNdofDev->manufacturer, manufacturer.c_str(), sizeof(mNdofDev->manufacturer));
strncpy(mNdofDev->product, product.c_str(), sizeof(mNdofDev->product));
if (ndof_init_first(mNdofDev, nullptr))
{
if (ndof_init_first(device, nullptr))
{
mDriverState = JDS_INITIALIZING;
// Saved device no longer exist
LL_WARNS() << "ndof_init_first FAILED" << LL_ENDL;
}
else
{
mNdofDev = device;
mDriverState = JDS_INITIALIZED;
}
mDriverState = JDS_INITIALIZING;
// Saved device no longer exist
// No device found
LL_WARNS() << "ndof_init_first FAILED" << LL_ENDL;
}
else
{
mDriverState = JDS_INITIALIZED;
}
}
#endif
@ -483,7 +473,7 @@ void LLViewerJoystick::initDevice(LLSD &guid)
mLastDeviceUUID = guid;
U32 device_type = 0;
void* win_callback = nullptr;
std::function<bool(std::string&, LLSD::Binary&, void*)> osx_callback;
std::function<bool(std::string&, LLSD&, void*)> osx_callback;
mDriverState = JDS_INITIALIZING;
#if LL_WINDOWS && !LL_MESA_HEADLESS
@ -492,27 +482,24 @@ void LLViewerJoystick::initDevice(LLSD &guid)
win_callback = &di8_devices_callback;
#elif LL_DARWIN
osx_callback = macos_devices_callback;
if (mLastDeviceUUID.isBinary())
if (mLastDeviceUUID.isMap())
{
S32 size = sizeof(long);
long id;
memcpy(&id, &mLastDeviceUUID[0], size);
std::string manufacturer = mLastDeviceUUID["manufacturer"].asString();
std::string product = mLastDeviceUUID["product"].asString();
NDOF_Device *device = ndof_idsearch(id);
if (device)
strncpy(mNdofDev->manufacturer, manufacturer.c_str(), sizeof(mNdofDev->manufacturer));
strncpy(mNdofDev->product, product.c_str(), sizeof(mNdofDev->product));
if (ndof_init_first(mNdofDev, nullptr))
{
// todo: search by manufcturer instead, locid might have changed
if (ndof_init_first(device, nullptr))
{
mDriverState = JDS_INITIALIZING;
// Saved device no longer exist
LL_WARNS() << "ndof_init_first FAILED" << LL_ENDL;
}
else
{
mNdofDev = device;
mDriverState = JDS_INITIALIZED;
}
mDriverState = JDS_INITIALIZING;
// Saved device no longer exist
// Np other device present
LL_WARNS() << "ndof_init_first FAILED" << LL_ENDL;
}
else
{
mDriverState = JDS_INITIALIZED;
}
}
#endif
@ -522,7 +509,7 @@ void LLViewerJoystick::initDevice(LLSD &guid)
if (!gViewerWindow->getWindow()->getInputDevices(device_type, osx_callback, win_callback, NULL))
{
LL_INFOS("Joystick") << "Failed to gather input devices. Falling back to ndof's init" << LL_ENDL;
// Failed to gather devices from windows, init first suitable one
// Failed to gather devices from window, init first suitable one
void *preffered_device = NULL;
mLastDeviceUUID = LLSD();
initDevice(preffered_device);
@ -537,19 +524,37 @@ void LLViewerJoystick::initDevice(LLSD &guid)
#endif
}
void LLViewerJoystick::initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, std::string &name, LLSD &guid)
bool LLViewerJoystick::initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, std::string &name, LLSD &guid)
{
#if LIB_NDOF
mLastDeviceUUID = guid;
#if LL_DARWIN
if (guid.isMap())
{
std::string manufacturer = mLastDeviceUUID["manufacturer"].asString();
std::string product = mLastDeviceUUID["product"].asString();
strncpy(mNdofDev->manufacturer, manufacturer.c_str(), sizeof(mNdofDev->manufacturer));
strncpy(mNdofDev->product, product.c_str(), sizeof(mNdofDev->product));
}
else
{
mNdofDev->product[0] = '\0';
mNdofDev->manufacturer[0] = '\0';
}
#else
strncpy(mNdofDev->product, name.c_str(), sizeof(mNdofDev->product));
mNdofDev->manufacturer[0] = '\0';
#endif
initDevice(preffered_device);
return initDevice(preffered_device);
#else
return false;
#endif
}
void LLViewerJoystick::initDevice(void * preffered_device /* LPDIRECTINPUTDEVICE8* */)
bool LLViewerJoystick::initDevice(void * preffered_device /* LPDIRECTINPUTDEVICE8* */)
{
#if LIB_NDOF
// Different joysticks will return different ranges of raw values.
@ -579,23 +584,6 @@ void LLViewerJoystick::initDevice(void * preffered_device /* LPDIRECTINPUTDEVICE
else
{
mDriverState = JDS_INITIALIZED;
}
#endif
}
bool LLViewerJoystick::initDevice(NDOF_Device * ndof_device, LLSD::Binary &data)
{
mLastDeviceUUID = data;
#if LIB_NDOF
if (ndof_init_first(ndof_device, nullptr))
{
mDriverState = JDS_UNINITIALIZED;
LL_WARNS() << "ndof_init_first FAILED" << LL_ENDL;
}
else
{
mNdofDev = ndof_device;
mDriverState = JDS_INITIALIZED;
return true;
}
#endif
@ -1407,6 +1395,8 @@ bool LLViewerJoystick::isDeviceUUIDSet()
#if LL_WINDOWS && !LL_MESA_HEADLESS
// for ease of comparison and to dial less with platform specific variables, we store id as LLSD binary
return mLastDeviceUUID.isBinary();
#elif LL_DARWIN
return mLastDeviceUUID.isMap();
#else
return false;
#endif
@ -1434,13 +1424,11 @@ std::string LLViewerJoystick::getDeviceUUIDString()
return std::string();
}
#elif LL_DARWIN
if (mLastDeviceUUID.isBinary())
if (mLastDeviceUUID.isMap())
{
S32 size = sizeof(long);
LLSD::Binary data = mLastDeviceUUID.asBinary();
long id;
memcpy(&id, &data[0], size);
return std::to_string(id);
std::string manufacturer = mLastDeviceUUID["manufacturer"].asString();
std::string product = mLastDeviceUUID["product"].asString();
return manufacturer + ":" + product;
}
else
{
@ -1451,13 +1439,32 @@ std::string LLViewerJoystick::getDeviceUUIDString()
#endif
}
void LLViewerJoystick::saveDeviceIdToSettings()
{
#if LL_WINDOWS && !LL_MESA_HEADLESS
// can't save as binary directly,
// someone editing the xml will corrupt it
// so convert to string first
std::string device_string = getDeviceUUIDString();
gSavedSettings.setLLSD("JoystickDeviceUUID", LLSD(device_string);
#else
LLSD device_id = getDeviceUUID();
gSavedSettings.setLLSD("JoystickDeviceUUID", device_id);
#endif
}
void LLViewerJoystick::loadDeviceIdFromSettings()
{
LLSD dev_id = gSavedSettings.getLLSD("JoystickDeviceUUID");
#if LL_WINDOWS && !LL_MESA_HEADLESS
// We can't save binary data to gSavedSettings, somebody editing the file will corrupt it,
// so _GUID data gets converted to string (we probably can convert it to LLUUID with memcpy)
// and here we need to convert it back to binary from string
std::string device_string = gSavedSettings.getString("JoystickDeviceUUID");
std::string device_string;
if (dev_id.isString())
{
device_string = dev_id.asString();
}
if (device_string.empty())
{
mLastDeviceUUID = LLSD();
@ -1475,21 +1482,17 @@ void LLViewerJoystick::loadDeviceIdFromSettings()
mLastDeviceUUID = LLSD(data);
}
#elif LL_DARWIN
std::string device_string = gSavedSettings.getString("JoystickDeviceUUID");
if (device_string.empty())
if (!dev_id.isMap())
{
mLastDeviceUUID = LLSD();
}
else
{
LL_DEBUGS("Joystick") << "Looking for device by id: " << device_string << LL_ENDL;
long id = std::stol(device_string);
S32 size = sizeof(long);
LLSD::Binary data; //just an std::vector
data.resize(size);
memcpy(&data[0], &id, size);
std::string manufacturer = mLastDeviceUUID["manufacturer"].asString();
std::string product = mLastDeviceUUID["product"].asString();
LL_DEBUGS("Joystick") << "Looking for device by manufacturer: " << manufacturer << " and product: " << product << LL_ENDL;
// We store this data in LLSD since it can handle both GUID2 and long
mLastDeviceUUID = LLSD(data);
mLastDeviceUUID = dev_id;
}
#else
mLastDeviceUUID = LLSD();

View File

@ -55,9 +55,8 @@ class LLViewerJoystick : public LLSingleton<LLViewerJoystick>
public:
void init(bool autoenable);
void initDevice(LLSD &guid);
void initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/);
void initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, std::string &name, LLSD &guid);
bool initDevice(NDOF_Device * ndof_device, LLSD::Binary &guid);
bool initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/);
bool initDevice(void * preffered_device /*LPDIRECTINPUTDEVICE8*/, std::string &name, LLSD &guid);
void terminate();
void updateStatus();
@ -80,6 +79,7 @@ public:
LLSD getDeviceUUID(); //unconverted, OS dependent value wrapped into LLSD, for comparison/search
std::string getDeviceUUIDString(); // converted readable value for settings
std::string getDescription();
void saveDeviceIdToSettings();
protected:
void updateEnabled(bool autoenable);