/////////////////////////////////////////////////////////////////////////////
-// Name: joystick.cpp
+// Name: src/unix/joystick.cpp
// Purpose: wxJoystick class
// Author: Ported to Linux by Guilhem Lavaux
// Modified by:
// 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 <linux/joystick.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
-#include "wx/event.h"
-#include "wx/window.h"
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif
+
+#include "wx/unix/private.h"
enum {
wxJS_AXIS_X = 0,
fd_set read_fds;
struct timeval time_out = {0, 0};
- FD_ZERO(&read_fds);
+ wxFD_ZERO(&read_fds);
while (true)
{
if (TestDestroy())
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));
wxString dev_name;
// old /dev structure
- dev_name.Printf( wxT("/dev/js%d"), (joystick == wxJOYSTICK1) ? 0 : 1);
+ 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 == wxJOYSTICK1) ? 0 : 1);
- m_device = open(dev_name.fn_str(), O_RDONLY);
+ dev_name.Printf( wxT("/dev/input/js%d"), joystick);
+ m_device = open(dev_name.fn_str(), O_RDONLY);
}
if (m_device != -1)
return (m_device != -1);
}
-int wxJoystick::GetNumberJoysticks() const
+int wxJoystick::GetNumberJoysticks()
{
wxString dev_name;
int fd, j;
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;
}
return false;
}
#endif // wxUSE_JOYSTICK
-