]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/joystick.cpp
(blind) fix for keyboard cues display under XP (bug 1298512)
[wxWidgets.git] / src / msw / joystick.cpp
index 0cd1a0307f52a2bdf524820b3f19c22c3aa541a6..a9a18a6935bf5392349cfb77b70e03b0ee2420c8 100644 (file)
@@ -5,14 +5,10 @@
 // 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"
 
     #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/registry.h"
 #include "wx/msw/joystick.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 +78,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 +91,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 +114,18 @@ 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
@@ -105,12 +138,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 +160,9 @@ int wxJoystick::GetPOVCTSPosition() const
         return joyInfo.dwPOV;
     }
     else
-        return 0;
+        return -1;
 #else
-    return 0;
+    return -1;
 #endif
 }
 
@@ -204,16 +241,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
@@ -237,10 +294,22 @@ int wxJoystick::GetProductId() const
 wxString wxJoystick::GetProductName() const
 {
     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));
+
+    wxString str;
+    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);
+
+    return str;
 }
 
 int wxJoystick::GetXMin() const
@@ -308,7 +377,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 +390,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 +403,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 +434,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 +447,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 +460,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 +473,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 +486,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 +499,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 +513,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
 }