/////////////////////////////////////////////////////////////////////////////
-// 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 <windows.h>
+#if wxUSE_JOYSTICK
-#ifndef __GNUWIN32__
-#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
-#ifdef __GNUWIN32__
-#include <wx/msw/gnuwin32/extra.h>
+#include "wx/msw/private.h"
+
+#if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)
+ #include <mmsystem.h>
#endif
// Why doesn't BC++ have joyGetPosEx?
#define NO_JOYGETPOSEX
#endif
-#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);
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)
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 )
{
#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 )
{
#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 )
{
#endif
}
-int wxJoystick::GetMovementThreshold(void) const
+int wxJoystick::GetMovementThreshold() const
{
UINT thresh = 0;
MMRESULT res = joyGetThreshold(m_joystick, & thresh);
// 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)
return joyCaps.wMid;
}
-int wxJoystick::GetProductId(void) const
+int wxJoystick::GetProductId() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
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)
return joyCaps.wXmin;
}
-int wxJoystick::GetYMin(void) const
+int wxJoystick::GetYMin() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return joyCaps.wYmin;
}
-int wxJoystick::GetZMin(void) const
+int wxJoystick::GetZMin() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return joyCaps.wZmin;
}
-int wxJoystick::GetXMax(void) const
+int wxJoystick::GetXMax() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return joyCaps.wXmax;
}
-int wxJoystick::GetYMax(void) const
+int wxJoystick::GetYMax() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return joyCaps.wYmax;
}
-int wxJoystick::GetZMax(void) const
+int wxJoystick::GetZMax() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return joyCaps.wZmax;
}
-int wxJoystick::GetNumberButtons(void) const
+int wxJoystick::GetNumberButtons() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return joyCaps.wNumButtons;
}
-int wxJoystick::GetNumberAxes(void) const
+int wxJoystick::GetNumberAxes() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
#endif
}
-int wxJoystick::GetMaxButtons(void) const
+int wxJoystick::GetMaxButtons() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
#endif
}
-int wxJoystick::GetMaxAxes(void) const
+int wxJoystick::GetMaxAxes() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
#endif
}
-int wxJoystick::GetPollingMin(void) const
+int wxJoystick::GetPollingMin() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return joyCaps.wPeriodMin;
}
-int wxJoystick::GetPollingMax(void) const
+int wxJoystick::GetPollingMax() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return joyCaps.wPeriodMax;
}
-int wxJoystick::GetRudderMin(void) const
+int wxJoystick::GetRudderMin() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
#endif
}
-int wxJoystick::GetRudderMax(void) const
+int wxJoystick::GetRudderMax() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
#endif
}
-int wxJoystick::GetUMin(void) const
+int wxJoystick::GetUMin() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
#endif
}
-int wxJoystick::GetUMax(void) const
+int wxJoystick::GetUMax() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
#endif
}
-int wxJoystick::GetVMin(void) const
+int wxJoystick::GetVMin() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
#endif
}
-int wxJoystick::GetVMax(void) const
+int wxJoystick::GetVMax() const
{
-#ifdef __WIN32__
+#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
}
-bool wxJoystick::HasRudder(void) const
+bool wxJoystick::HasRudder() const
{
-#ifdef __WIN32__
+#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
{
-#ifdef __WIN32__
+#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
{
-#ifdef __WIN32__
+#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
{
-#ifdef __WIN32__
+#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
{
-#ifdef __WIN32__
+#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
{
-#ifdef __WIN32__
+#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
{
-#ifdef __WIN32__
+#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
}
return (res == JOYERR_NOERROR);
}
-bool wxJoystick::ReleaseCapture(void)
+bool wxJoystick::ReleaseCapture()
{
MMRESULT res = joyReleaseCapture(m_joystick);
return (res == JOYERR_NOERROR);
}
+#endif // wxUSE_JOYSTICK