Files
wxWidgets/src/msw/joystick.cpp
Vadim Zeitlin 3f66f6a5b3 Remove all lines containing cvs/svn "$Id$" keyword.
This keyword is not expanded by Git which means it's not replaced with the
correct revision value in the releases made using git-based scripts and it's
confusing to have lines with unexpanded "$Id$" in the released files. As
expanding them with Git is not that simple (it could be done with git archive
and export-subst attribute) and there are not many benefits in having them in
the first place, just remove all these lines.

If nothing else, this will make an eventual transition to Git simpler.

Closes #14487.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2013-07-26 16:02:46 +00:00

661 lines
14 KiB
C++

/////////////////////////////////////////////////////////////////////////////
// Name: src/msw/joystick.cpp
// Purpose: wxJoystick class
// Author: Julian Smart
// Modified by:
// Created: 04/01/98
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_JOYSTICK
#include "wx/joystick.h"
#ifndef WX_PRECOMP
#include "wx/string.h"
#include "wx/window.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__)
#define NO_JOYGETPOSEX
#endif
#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;
MMRESULT res = joyGetPos(m_joystick, & joyInfo);
if (res == JOYERR_NOERROR )
return wxPoint(joyInfo.wXpos, joyInfo.wYpos);
else
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
{
JOYINFO joyInfo;
MMRESULT res = joyGetPos(m_joystick, & joyInfo);
if (res == JOYERR_NOERROR )
return joyInfo.wZpos;
else
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)
buttons |= wxJOY_BUTTON1;
if (joyInfo.wButtons & JOY_BUTTON2)
buttons |= wxJOY_BUTTON2;
if (joyInfo.wButtons & JOY_BUTTON3)
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
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 -1;
#else
return -1;
#endif
}
/**
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 -1;
#else
return -1;
#endif
}
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 )
{
return joyInfo.dwRpos;
}
else
return 0;
#else
return 0;
#endif
}
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 )
{
return joyInfo.dwUpos;
}
else
return 0;
#else
return 0;
#endif
}
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 )
{
return joyInfo.dwVpos;
}
else
return 0;
#else
return 0;
#endif
}
int wxJoystick::GetMovementThreshold() const
{
UINT thresh = 0;
MMRESULT res = joyGetThreshold(m_joystick, & thresh);
if (res == JOYERR_NOERROR )
{
return thresh;
}
else
return 0;
}
void wxJoystick::SetMovementThreshold(int threshold)
{
UINT thresh = threshold;
joySetThreshold(m_joystick, thresh);
}
// Capabilities
////////////////////////////////////////////////////////////////////////////
/**
johan@linkdata.se 2002-08-20:
Now returns the number of connected, functioning
joysticks, as intended.
*/
int wxJoystick::GetNumberJoysticks()
{
JOYINFO joyInfo;
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
{
JOYINFO joyInfo;
return (joyGetPos(m_joystick, & joyInfo) == JOYERR_NOERROR);
}
int wxJoystick::GetManufacturerId() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wMid;
}
int wxJoystick::GetProductId() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wPid;
}
wxString wxJoystick::GetProductName() const
{
wxString str;
#ifndef __WINE__
JOYCAPS joyCaps;
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
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wXmin;
}
int wxJoystick::GetYMin() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wYmin;
}
int wxJoystick::GetZMin() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wZmin;
}
int wxJoystick::GetXMax() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wXmax;
}
int wxJoystick::GetYMax() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wYmax;
}
int wxJoystick::GetZMax() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wZmax;
}
int wxJoystick::GetNumberButtons() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wNumButtons;
}
int wxJoystick::GetNumberAxes() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wNumAxes;
#else
return 0;
#endif
}
int wxJoystick::GetMaxButtons() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wMaxButtons;
#else
return 0;
#endif
}
int wxJoystick::GetMaxAxes() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wMaxAxes;
#else
return 0;
#endif
}
int wxJoystick::GetPollingMin() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wPeriodMin;
}
int wxJoystick::GetPollingMax() const
{
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wPeriodMax;
}
int wxJoystick::GetRudderMin() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wRmin;
#else
return 0;
#endif
}
int wxJoystick::GetRudderMax() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wRmax;
#else
return 0;
#endif
}
int wxJoystick::GetUMin() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wUmin;
#else
return 0;
#endif
}
int wxJoystick::GetUMax() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wUmax;
#else
return 0;
#endif
}
int wxJoystick::GetVMin() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wVmin;
#else
return 0;
#endif
}
int wxJoystick::GetVMax() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return 0;
else
return joyCaps.wVmax;
#else
return 0;
#endif
}
bool wxJoystick::HasRudder() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return false;
else
return ((joyCaps.wCaps & JOYCAPS_HASR) == JOYCAPS_HASR);
#else
return false;
#endif
}
bool wxJoystick::HasZ() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return false;
else
return ((joyCaps.wCaps & JOYCAPS_HASZ) == JOYCAPS_HASZ);
#else
return false;
#endif
}
bool wxJoystick::HasU() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return false;
else
return ((joyCaps.wCaps & JOYCAPS_HASU) == JOYCAPS_HASU);
#else
return false;
#endif
}
bool wxJoystick::HasV() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return false;
else
return ((joyCaps.wCaps & JOYCAPS_HASV) == JOYCAPS_HASV);
#else
return false;
#endif
}
bool wxJoystick::HasPOV() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return false;
else
return ((joyCaps.wCaps & JOYCAPS_HASPOV) == JOYCAPS_HASPOV);
#else
return false;
#endif
}
bool wxJoystick::HasPOV4Dir() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return false;
else
return ((joyCaps.wCaps & JOYCAPS_POV4DIR) == JOYCAPS_POV4DIR);
#else
return false;
#endif
}
bool wxJoystick::HasPOVCTS() const
{
#if defined(__WIN32__)
JOYCAPS joyCaps;
if (joyGetDevCaps(m_joystick, & joyCaps, sizeof(JOYCAPS)) != JOYERR_NOERROR)
return false;
else
return ((joyCaps.wCaps & JOYCAPS_POVCTS) == JOYCAPS_POVCTS);
#else
return false;
#endif
}
// Operations
////////////////////////////////////////////////////////////////////////////
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()
{
MMRESULT res = joyReleaseCapture(m_joystick);
return (res == JOYERR_NOERROR);
}
#endif // wxUSE_JOYSTICK