X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b9f933ab5d4a293790d0f5186c434229678c76ea..07aaf32633ecf18ec3edfbb41793a112914792d0:/src/msw/joystick.cpp diff --git a/src/msw/joystick.cpp b/src/msw/joystick.cpp index 0cd1a0307f..158c0b64b8 100644 --- a/src/msw/joystick.cpp +++ b/src/msw/joystick.cpp @@ -1,56 +1,81 @@ ///////////////////////////////////////////////////////////////////////////// -// 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_OLD__) || defined(__CYGWIN10__) - #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_OLD__ -#include "wx/msw/gnuwin32/extra.h" -#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 //////////////////////////////////////////////////////////////////////////// +/** + 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 +83,27 @@ 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::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() const @@ -71,12 +116,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,12 +139,26 @@ int wxJoystick::GetButtonState() const buttons |= wxJOY_BUTTON3; if (joyInfo.wButtons & JOY_BUTTON4) buttons |= wxJOY_BUTTON4; + return buttons; +#endif } else return 0; } +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 @@ -105,12 +171,16 @@ int wxJoystick::GetPOVPosition() const 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 @@ -123,9 +193,9 @@ int wxJoystick::GetPOVCTSPosition() const return joyInfo.dwPOV; } else - return 0; + return -1; #else - return 0; + return -1; #endif } @@ -204,16 +274,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 @@ -236,11 +326,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 @@ -308,7 +411,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; @@ -321,7 +424,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; @@ -334,7 +437,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; @@ -365,7 +468,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; @@ -378,7 +481,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; @@ -391,7 +494,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; @@ -404,7 +507,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; @@ -417,7 +520,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; @@ -430,7 +533,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; @@ -444,92 +547,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 } @@ -538,9 +641,15 @@ bool wxJoystick::HasPOVCTS() 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() @@ -549,3 +658,4 @@ bool wxJoystick::ReleaseCapture() return (res == JOYERR_NOERROR); } +#endif // wxUSE_JOYSTICK