X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/627b2b2a0db4017fe243ee5d676b04eebf5bb632..f5766910b6731eb03e82371416e9778203396ce7:/src/unix/joystick.cpp diff --git a/src/unix/joystick.cpp b/src/unix/joystick.cpp index 0a32033ee3..64afa78cb9 100644 --- a/src/unix/joystick.cpp +++ b/src/unix/joystick.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: joystick.cpp +// Name: src/unix/joystick.cpp // Purpose: wxJoystick class // Author: Ported to Linux by Guilhem Lavaux // Modified by: @@ -9,19 +9,18 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) -#pragma implementation "joystick.h" -#endif - // for compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/defs.h" - #if wxUSE_JOYSTICK #include "wx/joystick.h" +#ifndef WX_PRECOMP + #include "wx/event.h" + #include "wx/window.h" +#endif //WX_PRECOMP + #include #include #include @@ -30,8 +29,11 @@ #include #include -#include "wx/event.h" -#include "wx/window.h" +#ifdef HAVE_SYS_SELECT_H +# include +#endif + +#include "wx/unix/private.h" enum { wxJS_AXIS_X = 0, @@ -91,7 +93,7 @@ void* wxJoystickThread::Entry() fd_set read_fds; struct timeval time_out = {0, 0}; - FD_ZERO(&read_fds); + wxFD_ZERO(&read_fds); while (true) { if (TestDestroy()) @@ -104,9 +106,9 @@ void* wxJoystickThread::Entry() else time_out.tv_usec = 10 * 1000; // check at least every 10 msec in blocking case - FD_SET(m_device, &read_fds); + wxFD_SET(m_device, &read_fds); select(m_device+1, &read_fds, NULL, NULL, &time_out); - if (FD_ISSET(m_device, &read_fds)) + if (wxFD_ISSET(m_device, &read_fds)) { memset(&j_evt, 0, sizeof(j_evt)); read(m_device, &j_evt, sizeof(j_evt)); @@ -183,10 +185,17 @@ wxJoystick::wxJoystick(int joystick) { wxString dev_name; - // Assume it's the same device name on all Linux systems ... - dev_name.Printf( wxT("/dev/js%d"), (joystick == wxJOYSTICK1) ? 0 : 1); + // old /dev structure + dev_name.Printf( wxT("/dev/js%d"), joystick); m_device = open(dev_name.fn_str(), O_RDONLY); + // new /dev structure with "input" subdirectory + if (m_device == -1) + { + dev_name.Printf( wxT("/dev/input/js%d"), joystick); + m_device = open(dev_name.fn_str(), O_RDONLY); + } + if (m_device != -1) { m_thread = new wxJoystickThread(m_device, m_joystick); @@ -279,7 +288,7 @@ bool wxJoystick::IsOk() const return (m_device != -1); } -int wxJoystick::GetNumberJoysticks() const +int wxJoystick::GetNumberJoysticks() { wxString dev_name; int fd, j; @@ -288,9 +297,20 @@ int wxJoystick::GetNumberJoysticks() const dev_name.Printf(wxT("/dev/js%d"), j); fd = open(dev_name.fn_str(), O_RDONLY); if (fd == -1) - return j; + break; close(fd); } + + if (j == 0) { + for (j=0; j<4; j++) { + dev_name.Printf(wxT("/dev/input/js%d"), j); + fd = open(dev_name.fn_str(), O_RDONLY); + if (fd == -1) + return j; + close(fd); + } + } + return j; } @@ -474,4 +494,3 @@ bool wxJoystick::ReleaseCapture() return false; } #endif // wxUSE_JOYSTICK -