diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2015-08-30 06:26:03 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2015-08-30 06:26:03 +0200 |
commit | 6c5c26e914c2f515f1ca678fa32ab78750b8a4b5 (patch) | |
tree | f2b3728b78381607a7ba61baa40c9626a849791d /ftnoir_tracker_joystick | |
parent | 5090466908ddf92b7566f4215985c2e7d7dc93d7 (diff) |
win32-joystick: allow for unique selection of joysticks
Distinguish joystick GUIDs to allow selecting one of several with the
same name.
Issue: #230
Diffstat (limited to 'ftnoir_tracker_joystick')
-rw-r--r-- | ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp | 34 | ||||
-rw-r--r-- | ftnoir_tracker_joystick/ftnoir_tracker_joystick.h | 16 | ||||
-rw-r--r-- | ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp | 4 |
3 files changed, 50 insertions, 4 deletions
diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp index 45cf2f10..ac374aa8 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.cpp @@ -82,6 +82,17 @@ static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance if (stop) { + if (self->guid_to_check.size()) + { + QString guid = guid_to_string(pdidInstance->guidInstance); + if (guid != self->guid_to_check) + { + return DIENUM_CONTINUE; + } + else + qDebug() << "guid ok" << self->guid_to_check; + } + (void) self->g_pDI->CreateDevice( pdidInstance->guidInstance, &self->g_pJoystick, NULL); qDebug() << "device" << static_cast<QString>(self->s.joyid); } @@ -103,13 +114,32 @@ void FTNoIR_Tracker::start_tracker(QFrame* frame) goto fail; } + guid_to_check = s.guid; + if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback, this, DIEDFL_ATTACHEDONLY))) { - qDebug() << "enum2"; - goto fail; + if (guid_to_check.isEmpty()) + { + qDebug() << "enum1"; + goto fail; + } + } + + if (!g_pJoystick && guid_to_check.size()) + { + guid_to_check = ""; + + if( FAILED( hr = g_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL, + EnumJoysticksCallback, + this, + DIEDFL_ATTACHEDONLY))) + { + qDebug() << "enum2"; + goto fail; + } } if (!g_pJoystick) diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h index 0958246a..ab32ec56 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick.h @@ -30,11 +30,12 @@ using namespace options; struct settings : opts { - value<QString> joyid; + value<QString> joyid, guid; value<int> joy_1, joy_2, joy_3, joy_4, joy_5, joy_6; settings() : opts("tracker-joystick"), joyid(b, "joy-id", ""), + guid(b, "joy-guid", ""), joy_1(b, "axis-map-1", 1), joy_2(b, "axis-map-2", 2), joy_3(b, "axis-map-3", 3), @@ -44,6 +45,18 @@ struct settings : opts { {} }; +template<typename = void> +QString guid_to_string(const GUID guid) +{ + char buf[40] = {0}; + wchar_t szGuidW[40] = {0}; + + StringFromGUID2(guid, szGuidW, 40); + WideCharToMultiByte(0, 0, szGuidW, -1, buf, 40, NULL, NULL); + + return QString(buf); +} + class FTNoIR_Tracker : public ITracker { public: @@ -59,6 +72,7 @@ public: DIDEVICEINSTANCE def; int iter; // XXX bad style settings s; + QString guid_to_check; static constexpr int AXIS_MAX = 65535; }; diff --git a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp index 7200003c..88074fef 100644 --- a/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp +++ b/ftnoir_tracker_joystick/ftnoir_tracker_joystick_dialog.cpp @@ -6,7 +6,8 @@ static BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance auto self = ( TrackerControls* )pContext; self->guids.push_back(pdidInstance->guidInstance); - self->ui.joylist->addItem(QString(pdidInstance->tszInstanceName)); + self->ui.joylist->addItem(QString(pdidInstance->tszInstanceName), + guid_to_string(pdidInstance->guidInstance)); return DIENUM_CONTINUE; } @@ -49,6 +50,7 @@ fin: } void TrackerControls::doOK() { + s.guid = ui.joylist->currentData().toString(); s.b->save(); if (tracker) tracker->reload(); |