X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/65fd5cb0124e62ab1fc41f93382a205d95b00e75..43f4e852a1b2ac37c3db6a2b87315192ac549191:/src/msw/joystick.cpp?ds=sidebyside diff --git a/src/msw/joystick.cpp b/src/msw/joystick.cpp index 58b7631915..158c0b64b8 100644 --- a/src/msw/joystick.cpp +++ b/src/msw/joystick.cpp @@ -1,69 +1,112 @@ ///////////////////////////////////////////////////////////////////////////// -// 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" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif -#include "wx/string.h" -#include "wx/window.h" -#include "wx/msw/private.h" +#if wxUSE_JOYSTICK -#if !defined( __GNUWIN32__ ) || defined(wxUSE_NORLANDER_HEADERS) -#include <mmsystem.h> -#endif +#include "wx/joystick.h" -#if !defined(__WIN32__) && !defined(_MMRESULT_) -typedef UINT MMRESULT; +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/window.h" #endif -#ifndef __TWIN32__ -#ifdef __GNUWIN32__ -#ifndef wxUSE_NORLANDER_HEADERS -#include <wx/msw/gnuwin32/extra.h> -#endif -#endif +#include "wx/msw/private.h" + +#if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__) + #include <mmsystem.h> #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 //////////////////////////////////////////////////////////////////////////// -wxPoint wxJoystick::GetPosition(void) const +/** + 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; MMRESULT res = joyGetPos(m_joystick, & joyInfo); if (res == JOYERR_NOERROR ) return wxPoint(joyInfo.wXpos, joyInfo.wYpos); else - return wxPoint(0, 0); + return wxPoint(0,0); +} + +int wxJoystick::GetPosition(unsigned axis) const +{ + switch (axis) { + case 0: + return GetPosition().x; + case 1: + return GetPosition().y; + case 2: + return GetZPosition(); + case 3: + return GetRudderPosition(); + case 4: + return GetUPosition(); + case 5: + return GetVPosition(); + default: + return 0; + } } -int wxJoystick::GetZPosition(void) const +int wxJoystick::GetZPosition() const { JOYINFO joyInfo; MMRESULT res = joyGetPos(m_joystick, & joyInfo); @@ -73,12 +116,19 @@ int wxJoystick::GetZPosition(void) const return 0; } -int wxJoystick::GetButtonState(void) const +/** + 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) @@ -89,51 +139,72 @@ int wxJoystick::GetButtonState(void) const buttons |= wxJOY_BUTTON3; if (joyInfo.wButtons & JOY_BUTTON4) buttons |= wxJOY_BUTTON4; + return buttons; +#endif } else return 0; } -int wxJoystick::GetPOVPosition(void) const +bool wxJoystick::GetButtonState(unsigned id) const +{ + if (id > sizeof(int) * 8) + return false; + + return (GetButtonState() & (1 << id)) != 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 } -int wxJoystick::GetPOVCTSPosition(void) const +/** + 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 } -int wxJoystick::GetRudderPosition(void) const +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 ) { @@ -146,11 +217,12 @@ int wxJoystick::GetRudderPosition(void) const #endif } -int wxJoystick::GetUPosition(void) const +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 ) { @@ -163,11 +235,12 @@ int wxJoystick::GetUPosition(void) const #endif } -int wxJoystick::GetVPosition(void) const +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 ) { @@ -180,7 +253,7 @@ int wxJoystick::GetVPosition(void) const #endif } -int wxJoystick::GetMovementThreshold(void) const +int wxJoystick::GetMovementThreshold() const { UINT thresh = 0; MMRESULT res = joyGetThreshold(m_joystick, & thresh); @@ -201,19 +274,39 @@ void wxJoystick::SetMovementThreshold(int threshold) // Capabilities //////////////////////////////////////////////////////////////////////////// -bool wxJoystick::IsOk(void) 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(void) 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(void) const +int wxJoystick::GetManufacturerId() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -222,7 +315,7 @@ int wxJoystick::GetManufacturerId(void) const return joyCaps.wMid; } -int wxJoystick::GetProductId(void) const +int wxJoystick::GetProductId() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -231,16 +324,29 @@ int wxJoystick::GetProductId(void) const return joyCaps.wPid; } -wxString wxJoystick::GetProductName(void) 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(void) const +int wxJoystick::GetXMin() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -249,7 +355,7 @@ int wxJoystick::GetXMin(void) const return joyCaps.wXmin; } -int wxJoystick::GetYMin(void) const +int wxJoystick::GetYMin() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -258,7 +364,7 @@ int wxJoystick::GetYMin(void) const return joyCaps.wYmin; } -int wxJoystick::GetZMin(void) const +int wxJoystick::GetZMin() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -267,7 +373,7 @@ int wxJoystick::GetZMin(void) const return joyCaps.wZmin; } -int wxJoystick::GetXMax(void) const +int wxJoystick::GetXMax() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -276,7 +382,7 @@ int wxJoystick::GetXMax(void) const return joyCaps.wXmax; } -int wxJoystick::GetYMax(void) const +int wxJoystick::GetYMax() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -285,7 +391,7 @@ int wxJoystick::GetYMax(void) const return joyCaps.wYmax; } -int wxJoystick::GetZMax(void) const +int wxJoystick::GetZMax() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -294,7 +400,7 @@ int wxJoystick::GetZMax(void) const return joyCaps.wZmax; } -int wxJoystick::GetNumberButtons(void) const +int wxJoystick::GetNumberButtons() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -303,9 +409,9 @@ int wxJoystick::GetNumberButtons(void) const return joyCaps.wNumButtons; } -int wxJoystick::GetNumberAxes(void) 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,9 +422,9 @@ int wxJoystick::GetNumberAxes(void) const #endif } -int wxJoystick::GetMaxButtons(void) 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,9 +435,9 @@ int wxJoystick::GetMaxButtons(void) const #endif } -int wxJoystick::GetMaxAxes(void) 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; @@ -342,7 +448,7 @@ int wxJoystick::GetMaxAxes(void) const #endif } -int wxJoystick::GetPollingMin(void) const +int wxJoystick::GetPollingMin() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -351,7 +457,7 @@ int wxJoystick::GetPollingMin(void) const return joyCaps.wPeriodMin; } -int wxJoystick::GetPollingMax(void) const +int wxJoystick::GetPollingMax() const { JOYCAPS joyCaps; if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR) @@ -360,9 +466,9 @@ int wxJoystick::GetPollingMax(void) const return joyCaps.wPeriodMax; } -int wxJoystick::GetRudderMin(void) 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,9 +479,9 @@ int wxJoystick::GetRudderMin(void) const #endif } -int wxJoystick::GetRudderMax(void) 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,9 +492,9 @@ int wxJoystick::GetRudderMax(void) const #endif } -int wxJoystick::GetUMin(void) 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,9 +505,9 @@ int wxJoystick::GetUMin(void) const #endif } -int wxJoystick::GetUMax(void) 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,9 +518,9 @@ int wxJoystick::GetUMax(void) const #endif } -int wxJoystick::GetVMin(void) 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,9 +531,9 @@ int wxJoystick::GetVMin(void) const #endif } -int wxJoystick::GetVMax(void) 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,94 +545,94 @@ int wxJoystick::GetVMax(void) const } -bool wxJoystick::HasRudder(void) 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(void) const +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(void) const +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(void) const +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(void) const +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(void) const +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(void) const +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 } @@ -535,14 +641,21 @@ bool wxJoystick::HasPOVCTS(void) const bool wxJoystick::SetCapture(wxWindow* win, int pollingFreq) { +#ifdef __WXMSW__ BOOL changed = (pollingFreq == 0); MMRESULT res = joySetCapture((HWND) win->GetHWND(), m_joystick, pollingFreq, changed); return (res == JOYERR_NOERROR); +#else + wxUnusedVar(win); + wxUnusedVar(pollingFreq); + return false; +#endif } -bool wxJoystick::ReleaseCapture(void) +bool wxJoystick::ReleaseCapture() { MMRESULT res = joyReleaseCapture(m_joystick); return (res == JOYERR_NOERROR); } +#endif // wxUSE_JOYSTICK