]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/joystick.cpp
Better scrolling to cursor.
[wxWidgets.git] / src / msw / joystick.cpp
index 5fa69fd9ce29eaffb3dbaa56ae3887c9d56fba0e..1cfed858425806de013c72b0f8b81676f25ed7e5 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     04/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:    wxWindows license
+// Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 #pragma hdrstop
 #endif
 
-#include <windows.h>
+#include "wx/string.h"
+#include "wx/window.h"
+#include "wx/msw/private.h"
 
-#ifndef __GNUWIN32__
-#include <mmsystem.h>
+#if !defined(__GNUWIN32_OLD__) || defined(__CYGWIN10__)
+    #include <mmsystem.h>
 #endif
 
 #if !defined(__WIN32__) && !defined(_MMRESULT_)
@@ -31,8 +33,8 @@ typedef UINT MMRESULT;
 #endif
 
 #ifndef __TWIN32__
-#ifdef __GNUWIN32__
-#include <wx/msw/gnuwin32/extra.h>
+#ifdef __GNUWIN32_OLD__
+#include "wx/msw/gnuwin32/extra.h"
 #endif
 #endif
 
@@ -41,15 +43,46 @@ typedef UINT MMRESULT;
 #define NO_JOYGETPOSEX
 #endif
 
-#include <wx/window.h>
-#include <wx/msw/joystick.h>
+#include "wx/window.h"
+#include "wx/msw/joystick.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);
@@ -59,7 +92,7 @@ wxPoint wxJoystick::GetPosition(void) const
         return wxPoint(0, 0);
 }
 
-int wxJoystick::GetZPosition(void) const
+int wxJoystick::GetZPosition() const
 {
     JOYINFO joyInfo;
     MMRESULT res = joyGetPos(m_joystick, & joyInfo);
@@ -69,12 +102,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)
@@ -85,51 +125,64 @@ 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
+/**
+       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 )
     {
@@ -142,11 +195,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 )
     {
@@ -159,11 +213,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 )
     {
@@ -176,7 +231,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);
@@ -197,19 +252,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 wxJoystick::GetNumberJoysticks(void) const
+       int i, maxsticks, actualsticks;
+       maxsticks = joyGetNumDevs();
+       actualsticks = 0;
+       for( i=0; i<maxsticks; i++ )
+       {
+               if( joyGetPos( i, & joyInfo ) == JOYERR_NOERROR )
+               {
+                       actualsticks ++;
+               }
+       }
+    return actualsticks;
+}
+
+/**
+       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)
@@ -218,7 +293,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)
@@ -227,16 +302,16 @@ int wxJoystick::GetProductId(void) const
         return joyCaps.wPid;
 }
 
-wxString wxJoystick::GetProductName(void) const
+wxString wxJoystick::GetProductName() const
 {
     JOYCAPS joyCaps;
     if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
-        return wxString("");
+        return wxEmptyString;
     else
         return wxString(joyCaps.szPname);
 }
 
-int wxJoystick::GetXMin(void) const
+int wxJoystick::GetXMin() const
 {
     JOYCAPS joyCaps;
     if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
@@ -245,7 +320,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)
@@ -254,7 +329,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)
@@ -263,7 +338,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)
@@ -272,7 +347,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)
@@ -281,7 +356,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)
@@ -290,7 +365,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)
@@ -299,7 +374,7 @@ int wxJoystick::GetNumberButtons(void) const
         return joyCaps.wNumButtons;
 }
 
-int wxJoystick::GetNumberAxes(void) const
+int wxJoystick::GetNumberAxes() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -312,7 +387,7 @@ int wxJoystick::GetNumberAxes(void) const
 #endif
 }
 
-int wxJoystick::GetMaxButtons(void) const
+int wxJoystick::GetMaxButtons() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -325,7 +400,7 @@ int wxJoystick::GetMaxButtons(void) const
 #endif
 }
 
-int wxJoystick::GetMaxAxes(void) const
+int wxJoystick::GetMaxAxes() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -338,7 +413,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)
@@ -347,7 +422,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)
@@ -356,7 +431,7 @@ int wxJoystick::GetPollingMax(void) const
         return joyCaps.wPeriodMax;
 }
 
-int wxJoystick::GetRudderMin(void) const
+int wxJoystick::GetRudderMin() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -369,7 +444,7 @@ int wxJoystick::GetRudderMin(void) const
 #endif
 }
 
-int wxJoystick::GetRudderMax(void) const
+int wxJoystick::GetRudderMax() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -382,7 +457,7 @@ int wxJoystick::GetRudderMax(void) const
 #endif
 }
 
-int wxJoystick::GetUMin(void) const
+int wxJoystick::GetUMin() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -395,7 +470,7 @@ int wxJoystick::GetUMin(void) const
 #endif
 }
 
-int wxJoystick::GetUMax(void) const
+int wxJoystick::GetUMax() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -408,7 +483,7 @@ int wxJoystick::GetUMax(void) const
 #endif
 }
 
-int wxJoystick::GetVMin(void) const
+int wxJoystick::GetVMin() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -421,7 +496,7 @@ int wxJoystick::GetVMin(void) const
 #endif
 }
 
-int wxJoystick::GetVMax(void) const
+int wxJoystick::GetVMax() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -435,7 +510,7 @@ int wxJoystick::GetVMax(void) const
 }
 
 
-bool wxJoystick::HasRudder(void) const
+bool wxJoystick::HasRudder() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -448,7 +523,7 @@ bool wxJoystick::HasRudder(void) const
 #endif
 }
 
-bool wxJoystick::HasZ(void) const
+bool wxJoystick::HasZ() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -461,7 +536,7 @@ bool wxJoystick::HasZ(void) const
 #endif
 }
 
-bool wxJoystick::HasU(void) const
+bool wxJoystick::HasU() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -474,7 +549,7 @@ bool wxJoystick::HasU(void) const
 #endif
 }
 
-bool wxJoystick::HasV(void) const
+bool wxJoystick::HasV() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -487,7 +562,7 @@ bool wxJoystick::HasV(void) const
 #endif
 }
 
-bool wxJoystick::HasPOV(void) const
+bool wxJoystick::HasPOV() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -500,7 +575,7 @@ bool wxJoystick::HasPOV(void) const
 #endif
 }
 
-bool wxJoystick::HasPOV4Dir(void) const
+bool wxJoystick::HasPOV4Dir() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -513,7 +588,7 @@ bool wxJoystick::HasPOV4Dir(void) const
 #endif
 }
 
-bool wxJoystick::HasPOVCTS(void) const
+bool wxJoystick::HasPOVCTS() const
 {
 #if defined(__WIN32__) && !defined(__TWIN32__)
     JOYCAPS joyCaps;
@@ -536,7 +611,7 @@ bool wxJoystick::SetCapture(wxWindow* win, int pollingFreq)
     return (res == JOYERR_NOERROR);
 }
 
-bool wxJoystick::ReleaseCapture(void)
+bool wxJoystick::ReleaseCapture()
 {
     MMRESULT res = joyReleaseCapture(m_joystick);
     return (res == JOYERR_NOERROR);