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/cpp.h"
 | 
				
			||||||
#include "wx/object.h"
 | 
					#include "wx/object.h"
 | 
				
			||||||
#include "wx/clntdata.h"
 | 
					#include "wx/clntdata.h"
 | 
				
			||||||
 | 
					#include "wx/math.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if wxUSE_GUI
 | 
					#if wxUSE_GUI
 | 
				
			||||||
    #include "wx/gdicmn.h"
 | 
					    #include "wx/gdicmn.h"
 | 
				
			||||||
@@ -2760,6 +2761,7 @@ public:
 | 
				
			|||||||
    int GetZPosition() const { return m_zPosition; }
 | 
					    int GetZPosition() const { return m_zPosition; }
 | 
				
			||||||
    int GetButtonState() const { return m_buttonState; }
 | 
					    int GetButtonState() const { return m_buttonState; }
 | 
				
			||||||
    int GetButtonChange() const { return m_buttonChange; }
 | 
					    int GetButtonChange() const { return m_buttonChange; }
 | 
				
			||||||
 | 
					    int GetButtonOrdinal() const { return wxCTZ(m_buttonChange); }
 | 
				
			||||||
    int GetJoystick() const { return m_joyStick; }
 | 
					    int GetJoystick() const { return m_joyStick; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void SetJoystick(int stick) { m_joyStick = stick; }
 | 
					    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 */
 | 
					/* Compute the greatest common divisor of two positive integers */
 | 
				
			||||||
WXDLLIMPEXP_BASE unsigned int wxGCD(unsigned int u, unsigned int v);
 | 
					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_ */
 | 
					#endif /* _WX_MATH_H_ */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1741,10 +1741,24 @@ public:
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
        Returns the identifier of the button changing state.
 | 
					        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;
 | 
					    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.
 | 
					        Returns the down state of the buttons.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -159,7 +159,7 @@ void MyCanvas::OnJoystickEvent(wxJoystickEvent& event)
 | 
				
			|||||||
#if wxUSE_STATUSBAR
 | 
					#if wxUSE_STATUSBAR
 | 
				
			||||||
    wxString buf;
 | 
					    wxString buf;
 | 
				
			||||||
    if (event.ButtonDown())
 | 
					    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
 | 
					    else
 | 
				
			||||||
        buf.Printf("Joystick (%ld, %ld)  ", xpos, ypos);
 | 
					        buf.Printf("Joystick (%ld, %ld)  ", xpos, ypos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,8 @@
 | 
				
			|||||||
// For compilers that support precompilation, includes "wx.h".
 | 
					// For compilers that support precompilation, includes "wx.h".
 | 
				
			||||||
#include "wx/wxprec.h"
 | 
					#include "wx/wxprec.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "wx/debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __BORLANDC__
 | 
					#ifdef __BORLANDC__
 | 
				
			||||||
    #pragma hdrstop
 | 
					    #pragma hdrstop
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -1015,6 +1017,27 @@ unsigned int wxGCD(unsigned int u, unsigned int v)
 | 
				
			|||||||
    return u << shift;
 | 
					    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
 | 
					#endif // wxUSE_BASE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ============================================================================
 | 
					// ============================================================================
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,23 +37,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <regstr.h>
 | 
					#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 {
 | 
					enum {
 | 
				
			||||||
    wxJS_AXIS_X = 0,
 | 
					    wxJS_AXIS_X = 0,
 | 
				
			||||||
@@ -90,7 +73,7 @@ public:
 | 
				
			|||||||
private:
 | 
					private:
 | 
				
			||||||
    void      SendEvent(wxEventType type, long ts, int change = 0);
 | 
					    void      SendEvent(wxEventType type, long ts, int change = 0);
 | 
				
			||||||
    int       m_joystick;
 | 
					    int       m_joystick;
 | 
				
			||||||
    UINT      m_buttons;
 | 
					    int       m_buttons;
 | 
				
			||||||
    wxWindow* m_catchwin;
 | 
					    wxWindow* m_catchwin;
 | 
				
			||||||
    int       m_polling;
 | 
					    int       m_polling;
 | 
				
			||||||
    JOYINFO   m_joyInfo;
 | 
					    JOYINFO   m_joyInfo;
 | 
				
			||||||
@@ -141,9 +124,9 @@ void* wxJoystickThread::Entry()
 | 
				
			|||||||
        // "Current button number that is pressed.", but it turns out
 | 
					        // "Current button number that is pressed.", but it turns out
 | 
				
			||||||
        // it is the *total* number of buttons pressed.
 | 
					        // it is the *total* number of buttons pressed.
 | 
				
			||||||
        if (deltaUp)
 | 
					        if (deltaUp)
 | 
				
			||||||
            SendEvent(wxEVT_JOY_BUTTON_UP, ts, wxCtz(deltaUp)+1);
 | 
					            SendEvent(wxEVT_JOY_BUTTON_UP, ts, deltaUp);
 | 
				
			||||||
        if (deltaDown)
 | 
					        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) ||
 | 
					        if ((m_joyInfo.wXpos != m_lastJoyInfo.wXpos) ||
 | 
				
			||||||
            (m_joyInfo.wYpos != m_lastJoyInfo.wYpos) ||
 | 
					            (m_joyInfo.wYpos != m_lastJoyInfo.wYpos) ||
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -872,7 +872,7 @@ void* wxJoystickThread::Entry()
 | 
				
			|||||||
                wxevent.SetEventType(wxEVT_JOY_BUTTON_UP);
 | 
					                wxevent.SetEventType(wxEVT_JOY_BUTTON_UP);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            wxevent.SetButtonChange(nIndex+1);
 | 
					            wxevent.SetButtonChange(1 << nIndex);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if (nIndex == wxJS_AXIS_X)
 | 
					        else if (nIndex == wxJS_AXIS_X)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -181,12 +181,12 @@ void* wxJoystickThread::Entry()
 | 
				
			|||||||
                if (j_evt.value)
 | 
					                if (j_evt.value)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    m_buttons |= (1 << j_evt.number);
 | 
					                    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
 | 
					                else
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    m_buttons &= ~(1 << j_evt.number);
 | 
					                    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