X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ae090fdb7f4be47466b5728ad37065923b48c8c3..6945b5878c8d46a56f1a59f558837a0943492f3c:/src/msw/joystick.cpp diff --git a/src/msw/joystick.cpp b/src/msw/joystick.cpp index b8920854e6..294447cb0a 100644 --- a/src/msw/joystick.cpp +++ b/src/msw/joystick.cpp @@ -1,18 +1,14 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: joystick.cpp +// Name: src/msw/joystick.cpp // Purpose: wxJoystick class // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "joystick.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -20,6 +16,9 @@ #pragma hdrstop #endif +#if wxUSE_JOYSTICK + +#include "wx/joystick.h" #include "wx/string.h" #include "wx/window.h" #include "wx/msw/private.h" @@ -28,29 +27,52 @@ #include <mmsystem.h> #endif -#if !defined(__WIN32__) && !defined(_MMRESULT_) -typedef UINT MMRESULT; -#endif - -#ifndef __TWIN32__ -#ifdef __GNUWIN32_OLD__ -#include "wx/msw/gnuwin32/extra.h" -#endif -#endif - // Why doesn't BC++ have joyGetPosEx? -#if !defined(__WIN32__) || defined(__BORLANDC__) || defined(__TWIN32__) +#if !defined(__WIN32__) || defined(__BORLANDC__) #define NO_JOYGETPOSEX #endif #include "wx/window.h" -#include "wx/msw/joystick.h" +#include "wx/msw/registry.h" + +#include <regstr.h> IMPLEMENT_DYNAMIC_CLASS(wxJoystick, wxObject) // Attributes //////////////////////////////////////////////////////////////////////////// +/** + johan@linkdata.se 2002-08-20: + Now returns only valid, functioning + joysticks, counting from the first + available and upwards. +*/ +wxJoystick::wxJoystick(int joystick) +{ + JOYINFO joyInfo; + int i, maxsticks; + + maxsticks = joyGetNumDevs(); + for( i=0; i<maxsticks; i++ ) + { + if( joyGetPos(i, & joyInfo) == JOYERR_NOERROR ) + { + if( !joystick ) + { + /* Found the one we want, store actual OS id and return */ + m_joystick = i; + return; + } + joystick --; + } + } + + /* No such joystick, return ID 0 */ + m_joystick = 0; + return; +} + wxPoint wxJoystick::GetPosition() const { JOYINFO joyInfo; @@ -58,7 +80,7 @@ wxPoint wxJoystick::GetPosition() const if (res == JOYERR_NOERROR ) return wxPoint(joyInfo.wXpos, joyInfo.wYpos); else - return wxPoint(0, 0); + return wxPoint(0,0); } int wxJoystick::GetZPosition() const @@ -71,12 +93,19 @@ int wxJoystick::GetZPosition() const return 0; } +/** + johan@linkdata.se 2002-08-20: + Return a bitmap with all button states in it, + like the GTK version does and Win32 does. +*/ int wxJoystick::GetButtonState() const { JOYINFO joyInfo; MMRESULT res = joyGetPos(m_joystick, & joyInfo); if (res == JOYERR_NOERROR ) { + return joyInfo.wButtons; +#if 0 int buttons = 0; if (joyInfo.wButtons & JOY_BUTTON1) @@ -87,43 +116,55 @@ int wxJoystick::GetButtonState() const buttons |= wxJOY_BUTTON3; if (joyInfo.wButtons & JOY_BUTTON4) buttons |= wxJOY_BUTTON4; + return buttons; +#endif } else return 0; } +/** + JLI 2002-08-20: + Returns -1 to signify error. +*/ int wxJoystick::GetPOVPosition() const { #ifndef NO_JOYGETPOSEX JOYINFOEX joyInfo; joyInfo.dwFlags = JOY_RETURNPOV; + joyInfo.dwSize = sizeof(joyInfo); MMRESULT res = joyGetPosEx(m_joystick, & joyInfo); if (res == JOYERR_NOERROR ) { return joyInfo.dwPOV; } else - return 0; + return -1; #else - return 0; + return -1; #endif } +/** + johan@linkdata.se 2002-08-20: + Returns -1 to signify error. +*/ int wxJoystick::GetPOVCTSPosition() const { #ifndef NO_JOYGETPOSEX JOYINFOEX joyInfo; joyInfo.dwFlags = JOY_RETURNPOVCTS; + joyInfo.dwSize = sizeof(joyInfo); MMRESULT res = joyGetPosEx(m_joystick, & joyInfo); if (res == JOYERR_NOERROR ) { return joyInfo.dwPOV; } else - return 0; + return -1; #else - return 0; + return -1; #endif } @@ -132,6 +173,7 @@ int wxJoystick::GetRudderPosition() const #ifndef NO_JOYGETPOSEX JOYINFOEX joyInfo; joyInfo.dwFlags = JOY_RETURNR; + joyInfo.dwSize = sizeof(joyInfo); MMRESULT res = joyGetPosEx(m_joystick, & joyInfo); if (res == JOYERR_NOERROR ) { @@ -149,6 +191,7 @@ int wxJoystick::GetUPosition() const #ifndef NO_JOYGETPOSEX JOYINFOEX joyInfo; joyInfo.dwFlags = JOY_RETURNU; + joyInfo.dwSize = sizeof(joyInfo); MMRESULT res = joyGetPosEx(m_joystick, & joyInfo); if (res == JOYERR_NOERROR ) { @@ -166,6 +209,7 @@ int wxJoystick::GetVPosition() const #ifndef NO_JOYGETPOSEX JOYINFOEX joyInfo; joyInfo.dwFlags = JOY_RETURNV; + joyInfo.dwSize = sizeof(joyInfo); MMRESULT res = joyGetPosEx(m_joystick, & joyInfo); if (res == JOYERR_NOERROR ) { @@ -199,16 +243,36 @@ void wxJoystick::SetMovementThreshold(int threshold) // Capabilities //////////////////////////////////////////////////////////////////////////// -bool wxJoystick::IsOk() const +/** + johan@linkdata.se 2002-08-20: + Now returns the number of connected, functioning + joysticks, as intended. +*/ +int wxJoystick::GetNumberJoysticks() { JOYINFO joyInfo; - MMRESULT res = joyGetPos(m_joystick, & joyInfo); - return ((joyGetNumDevs() > 0) || (res == JOYERR_NOERROR)); + int i, maxsticks, actualsticks; + maxsticks = joyGetNumDevs(); + actualsticks = 0; + for( i=0; i<maxsticks; i++ ) + { + if( joyGetPos( i, & joyInfo ) == JOYERR_NOERROR ) + { + actualsticks ++; + } + } + return actualsticks; } -int wxJoystick::GetNumberJoysticks() const +/** + johan@linkdata.se 2002-08-20: + The old code returned true if there were any + joystick capable drivers loaded (=always). +*/ +bool wxJoystick::IsOk() const { - return joyGetNumDevs(); + JOYINFO joyInfo; + return (joyGetPos(m_joystick, & joyInfo) == JOYERR_NOERROR); } int wxJoystick::GetManufacturerId() const @@ -231,11 +295,24 @@ int wxJoystick::GetProductId() const wxString wxJoystick::GetProductName() const { + wxString str; +#ifndef __WINE__ JOYCAPS joyCaps; - if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) - return wxString(""); - else - return wxString(joyCaps.szPname); + if (joyGetDevCaps(m_joystick, &joyCaps, sizeof(joyCaps)) != JOYERR_NOERROR) + return wxEmptyString; + + wxRegKey key1(wxString::Format(wxT("HKEY_LOCAL_MACHINE\\%s\\%s\\%s"), + REGSTR_PATH_JOYCONFIG, joyCaps.szRegKey, REGSTR_KEY_JOYCURR)); + + key1.QueryValue(wxString::Format(wxT("Joystick%d%s"), + m_joystick + 1, REGSTR_VAL_JOYOEMNAME), + str); + + wxRegKey key2(wxString::Format(wxT("HKEY_LOCAL_MACHINE\\%s\\%s"), + REGSTR_PATH_JOYOEM, str.c_str())); + key2.QueryValue(REGSTR_VAL_JOYOEMNAME, str); +#endif + return str; } int wxJoystick::GetXMin() const @@ -303,7 +380,7 @@ int wxJoystick::GetNumberButtons() const int wxJoystick::GetNumberAxes() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -316,7 +393,7 @@ int wxJoystick::GetNumberAxes() const int wxJoystick::GetMaxButtons() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -329,7 +406,7 @@ int wxJoystick::GetMaxButtons() const int wxJoystick::GetMaxAxes() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -360,7 +437,7 @@ int wxJoystick::GetPollingMax() const int wxJoystick::GetRudderMin() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -373,7 +450,7 @@ int wxJoystick::GetRudderMin() const int wxJoystick::GetRudderMax() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -386,7 +463,7 @@ int wxJoystick::GetRudderMax() const int wxJoystick::GetUMin() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -399,7 +476,7 @@ int wxJoystick::GetUMin() const int wxJoystick::GetUMax() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -412,7 +489,7 @@ int wxJoystick::GetUMax() const int wxJoystick::GetVMin() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -425,7 +502,7 @@ int wxJoystick::GetVMin() const int wxJoystick::GetVMax() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) return 0; @@ -439,92 +516,92 @@ int wxJoystick::GetVMax() const bool wxJoystick::HasRudder() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) - return FALSE; + return false; else return ((joyCaps.wCaps & JOYCAPS_HASR) == JOYCAPS_HASR); #else - return FALSE; + return false; #endif } bool wxJoystick::HasZ() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) - return FALSE; + return false; else return ((joyCaps.wCaps & JOYCAPS_HASZ) == JOYCAPS_HASZ); #else - return FALSE; + return false; #endif } bool wxJoystick::HasU() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) - return FALSE; + return false; else return ((joyCaps.wCaps & JOYCAPS_HASU) == JOYCAPS_HASU); #else - return FALSE; + return false; #endif } bool wxJoystick::HasV() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) - return FALSE; + return false; else return ((joyCaps.wCaps & JOYCAPS_HASV) == JOYCAPS_HASV); #else - return FALSE; + return false; #endif } bool wxJoystick::HasPOV() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) - return FALSE; + return false; else return ((joyCaps.wCaps & JOYCAPS_HASPOV) == JOYCAPS_HASPOV); #else - return FALSE; + return false; #endif } bool wxJoystick::HasPOV4Dir() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) - return FALSE; + return false; else return ((joyCaps.wCaps & JOYCAPS_POV4DIR) == JOYCAPS_POV4DIR); #else - return FALSE; + return false; #endif } bool wxJoystick::HasPOVCTS() const { -#if defined(__WIN32__) && !defined(__TWIN32__) +#if defined(__WIN32__) JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) - return FALSE; + return false; else return ((joyCaps.wCaps & JOYCAPS_POVCTS) == JOYCAPS_POVCTS); #else - return FALSE; + return false; #endif } @@ -544,3 +621,4 @@ bool wxJoystick::ReleaseCapture() return (res == JOYERR_NOERROR); } +#endif // wxUSE_JOYSTICK