Synchronize joystick events between all ports
Generate wxJoystickEvent with the same fields under all platforms by making the Linux and macOS versions follow MSW convention of using "1 << N" for the changed button. Add GetButtonOrdinal() accessor which can be used to retrieve just N. Closes #18233.
This commit is contained in:
committed by
Vadim Zeitlin
parent
cf980cf5e3
commit
291a880d0c
@@ -15,6 +15,7 @@
|
||||
#include "wx/cpp.h"
|
||||
#include "wx/object.h"
|
||||
#include "wx/clntdata.h"
|
||||
#include "wx/math.h"
|
||||
|
||||
#if wxUSE_GUI
|
||||
#include "wx/gdicmn.h"
|
||||
@@ -2760,6 +2761,7 @@ public:
|
||||
int GetZPosition() const { return m_zPosition; }
|
||||
int GetButtonState() const { return m_buttonState; }
|
||||
int GetButtonChange() const { return m_buttonChange; }
|
||||
int GetButtonOrdinal() const { return wxCTZ(m_buttonChange); }
|
||||
int GetJoystick() const { return m_joyStick; }
|
||||
|
||||
void SetJoystick(int stick) { m_joyStick = stick; }
|
||||
|
@@ -181,4 +181,14 @@ inline double wxRadToDeg(double rad) { return (rad * 180.0) / M_PI; }
|
||||
/* Compute the greatest common divisor of two positive integers */
|
||||
WXDLLIMPEXP_BASE unsigned int wxGCD(unsigned int u, unsigned int v);
|
||||
|
||||
#ifdef __cplusplus
|
||||
/* Count trailing zeros
|
||||
|
||||
Returns the number of trailing zeros in unsigned input x.
|
||||
|
||||
@since 3.1.2
|
||||
*/
|
||||
WXDLLIMPEXP_BASE unsigned int wxCTZ(unsigned x);
|
||||
#endif
|
||||
|
||||
#endif /* _WX_MATH_H_ */
|
||||
|
@@ -1741,10 +1741,24 @@ public:
|
||||
/**
|
||||
Returns the identifier of the button changing state.
|
||||
|
||||
This is a @c wxJOY_BUTTONn identifier, where @c n is one of 1, 2, 3, 4.
|
||||
The return value is @code 1 << n @endcode where @c n is the index of the
|
||||
button changing state.
|
||||
|
||||
Note that for @c n equal to 1, 2, 3 or 4 there are predefined @c wxJOY_BUTTONn
|
||||
constants which can be used for more clarity, however these constants are not
|
||||
defined for the buttons beyond the first four.
|
||||
and whose values were 1 << n. To support more than four buttons, the return value
|
||||
is now defined as 1 << n.
|
||||
*/
|
||||
int GetButtonChange() const;
|
||||
|
||||
/**
|
||||
Returns the 0-indexed ordinal of the button changing state.
|
||||
|
||||
@since 3.1.2.
|
||||
*/
|
||||
int GetButtonOrdinal() const;
|
||||
|
||||
/**
|
||||
Returns the down state of the buttons.
|
||||
|
||||
|
@@ -159,7 +159,7 @@ void MyCanvas::OnJoystickEvent(wxJoystickEvent& event)
|
||||
#if wxUSE_STATUSBAR
|
||||
wxString buf;
|
||||
if (event.ButtonDown())
|
||||
buf.Printf("Joystick (%ld, %ld) #%i Fire!", xpos, ypos, event.GetButtonChange());
|
||||
buf.Printf("Joystick (%ld, %ld) #%i Fire!", xpos, ypos, event.GetButtonOrdinal());
|
||||
else
|
||||
buf.Printf("Joystick (%ld, %ld) ", xpos, ypos);
|
||||
|
||||
|
@@ -19,6 +19,8 @@
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#include "wx/debug.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
@@ -1015,6 +1017,27 @@ unsigned int wxGCD(unsigned int u, unsigned int v)
|
||||
return u << shift;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxCTZ
|
||||
// Count trailing zeros. Use optimised builtin where available.
|
||||
// ----------------------------------------------------------------------------
|
||||
unsigned int wxCTZ(unsigned x)
|
||||
{
|
||||
wxCHECK_MSG(x > 0, 0, "Undefined for x == 0.");
|
||||
#ifdef __GNUC__
|
||||
return __builtin_ctz(x);
|
||||
#else
|
||||
int n;
|
||||
n = 1;
|
||||
if ((x & 0x0000FFFF) == 0) {n = n +16; x = x >>16;}
|
||||
if ((x & 0x000000FF) == 0) {n = n + 8; x = x >> 8;}
|
||||
if ((x & 0x0000000F) == 0) {n = n + 4; x = x >> 4;}
|
||||
if ((x & 0x00000003) == 0) {n = n + 2; x = x >> 2;}
|
||||
return n - (x & 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#endif // wxUSE_BASE
|
||||
|
||||
// ============================================================================
|
||||
|
@@ -37,23 +37,6 @@
|
||||
|
||||
#include <regstr.h>
|
||||
|
||||
// Use optimised count trailing zeros where available.
|
||||
static int wxCtz(unsigned x)
|
||||
{
|
||||
wxCHECK_MSG(x > 0, 0, "Undefined for x == 0.");
|
||||
#ifdef __GNUC__
|
||||
return __builtin_ctz(x);
|
||||
#else
|
||||
int n;
|
||||
n = 1;
|
||||
if ((x & 0x0000FFFF) == 0) {n = n +16; x = x >>16;}
|
||||
if ((x & 0x000000FF) == 0) {n = n + 8; x = x >> 8;}
|
||||
if ((x & 0x0000000F) == 0) {n = n + 4; x = x >> 4;}
|
||||
if ((x & 0x00000003) == 0) {n = n + 2; x = x >> 2;}
|
||||
return n - (x & 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
enum {
|
||||
wxJS_AXIS_X = 0,
|
||||
@@ -90,7 +73,7 @@ public:
|
||||
private:
|
||||
void SendEvent(wxEventType type, long ts, int change = 0);
|
||||
int m_joystick;
|
||||
UINT m_buttons;
|
||||
int m_buttons;
|
||||
wxWindow* m_catchwin;
|
||||
int m_polling;
|
||||
JOYINFO m_joyInfo;
|
||||
@@ -141,9 +124,9 @@ void* wxJoystickThread::Entry()
|
||||
// "Current button number that is pressed.", but it turns out
|
||||
// it is the *total* number of buttons pressed.
|
||||
if (deltaUp)
|
||||
SendEvent(wxEVT_JOY_BUTTON_UP, ts, wxCtz(deltaUp)+1);
|
||||
SendEvent(wxEVT_JOY_BUTTON_UP, ts, deltaUp);
|
||||
if (deltaDown)
|
||||
SendEvent(wxEVT_JOY_BUTTON_DOWN, ts, wxCtz(deltaDown)+1);
|
||||
SendEvent(wxEVT_JOY_BUTTON_DOWN, ts, deltaDown);
|
||||
|
||||
if ((m_joyInfo.wXpos != m_lastJoyInfo.wXpos) ||
|
||||
(m_joyInfo.wYpos != m_lastJoyInfo.wYpos) ||
|
||||
|
@@ -872,7 +872,7 @@ void* wxJoystickThread::Entry()
|
||||
wxevent.SetEventType(wxEVT_JOY_BUTTON_UP);
|
||||
}
|
||||
|
||||
wxevent.SetButtonChange(nIndex+1);
|
||||
wxevent.SetButtonChange(1 << nIndex);
|
||||
}
|
||||
else if (nIndex == wxJS_AXIS_X)
|
||||
{
|
||||
|
@@ -181,12 +181,12 @@ void* wxJoystickThread::Entry()
|
||||
if (j_evt.value)
|
||||
{
|
||||
m_buttons |= (1 << j_evt.number);
|
||||
SendEvent(wxEVT_JOY_BUTTON_DOWN, j_evt.time, j_evt.number);
|
||||
SendEvent(wxEVT_JOY_BUTTON_DOWN, j_evt.time, 1 << j_evt.number);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_buttons &= ~(1 << j_evt.number);
|
||||
SendEvent(wxEVT_JOY_BUTTON_UP, j_evt.time, j_evt.number);
|
||||
SendEvent(wxEVT_JOY_BUTTON_UP, j_evt.time, 1 << j_evt.number);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user