diff options
Diffstat (limited to 'platform/windows/os_windows.cpp')
-rw-r--r-- | platform/windows/os_windows.cpp | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 64219d6c17..778609950e 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -574,6 +574,8 @@ LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) { void OS_Windows::probe_joysticks() { + static uint32_t last_attached = 0; + int device_count = joyGetNumDevs(); JOYINFOEX jinfo; @@ -582,21 +584,40 @@ void OS_Windows::probe_joysticks() { for (int i=0; i<JOYSTICKS_MAX; i++) { - joysticks[i].attached = (device_count > 0) && (joyGetPosEx(JOYSTICKID1 + i, &jinfo) == JOYERR_NOERROR); - - if (!joysticks[i].attached) { + Joystick joy; + joy.id = i; + joy.attached = (device_count > 0) && (joyGetPosEx(JOYSTICKID1 + i, &jinfo) == JOYERR_NOERROR); + if (joy.attached == (last_attached & (1 << i) != 0)) { continue; }; - joysticks[i].last_buttons = jinfo.dwButtons; + // there's been a change since last call + + if (joy.attached) + last_attached = last_attached | (1 << i); + else + last_attached &= ~(1 << i); + + if (joy.attached) { - joysticks[i].last_axis[0] = jinfo.dwXpos; - joysticks[i].last_axis[1] = jinfo.dwYpos; - joysticks[i].last_axis[2] = jinfo.dwZpos; - joysticks[i].last_axis[3] = jinfo.dwRpos; - joysticks[i].last_axis[4] = jinfo.dwUpos; - joysticks[i].last_axis[5] = jinfo.dwVpos; + joy.last_buttons = jinfo.dwButtons; + + joy.last_axis[0] = jinfo.dwXpos; + joy.last_axis[1] = jinfo.dwYpos; + joy.last_axis[2] = jinfo.dwZpos; + joy.last_axis[3] = jinfo.dwRpos; + joy.last_axis[4] = jinfo.dwUpos; + joy.last_axis[5] = jinfo.dwVpos; + + JOYCAPS jcaps; + MMRESULT res = joyGetDevCaps(JOYSTICKID1 + i, &jcaps, sizeof(jcaps)); + if (res == JOYERR_NOERROR) { + joy.name = jcaps.szPname; + }; + }; + + joystick_change_queue.push_back(joy); }; }; @@ -998,7 +1019,13 @@ void OS_Windows::initialize(const VideoMode& p_desired,int p_video_driver,int p_ spatial_sound_2d_server = memnew( SpatialSound2DServerSW ); spatial_sound_2d_server->init(); - probe_joysticks(); + probe_joysticks(); // todo: move this to a thread + while (joystick_change_queue.size() > 0) { + Joystick joy = joystick_change_queue.front()->get(); + joystick_change_queue.pop_front(); + joysticks[joy.id] = joy; + input->joy_connection_changed(joy.id, joy.attached, joy.name); + }; TRACKMOUSEEVENT tme; tme.cbSize=sizeof(TRACKMOUSEEVENT); |