X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5f4987fed4dc52a35f0ddd649ae1cf9e75bb92d3..4d623b67ee74794fbeba5805a269433d030c67d5:/samples/joytest/joytest.cpp diff --git a/samples/joytest/joytest.cpp b/samples/joytest/joytest.cpp index 92add26604..f8f478d5f9 100644 --- a/samples/joytest/joytest.cpp +++ b/samples/joytest/joytest.cpp @@ -5,8 +5,8 @@ // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". @@ -20,11 +20,21 @@ #include "wx/wx.h" #endif -#include -#include +#if !wxUSE_JOYSTICK +# error You must set wxUSE_JOYSTICK to 1 in setup.h +#endif + +#include "wx/sound.h" +#include "wx/joystick.h" #include "joytest.h" +// the application icon (under Windows and OS/2 it is in resources and even +// though we could still include the XPM here it would be unused) +#ifndef wxHAS_IMAGES_IN_RESOURCES + #include "../sample.xpm" +#endif + MyFrame *frame = NULL; IMPLEMENT_APP(MyApp) @@ -35,137 +45,162 @@ long ypos = -1; int winNumber = 1; +int nButtons = 0; // Initialise this in OnInit, not statically -bool MyApp::OnInit(void) +bool MyApp::OnInit() { - wxJoystick stick(wxJOYSTICK1); - if (!stick.IsOk()) - { - wxMessageBox("No joystick detected!"); - return FALSE; - } - m_fire.Create("gun.wav"); + if ( !wxApp::OnInit() ) + return false; - m_maxX = stick.GetXMax(); - m_maxY = stick.GetYMax(); + wxJoystick stick(wxJOYSTICK1); + if (!stick.IsOk()) + { + wxMessageBox(wxT("No joystick detected!")); + return false; + } - // Create the main frame window +#if wxUSE_SOUND + m_fire.Create(wxT("buttonpress.wav")); +#endif // wxUSE_SOUND - frame = new MyFrame(NULL, "Joystick Demo", wxPoint(0, 0), wxSize(500, 400), - wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL); + m_minX = stick.GetXMin(); + m_minY = stick.GetYMin(); + m_maxX = stick.GetXMax(); + m_maxY = stick.GetYMax(); - // Give it an icon (this is ignored in MDI mode: uses resources) -#ifdef __WXMSW__ - frame->SetIcon(wxIcon("joyicon")); -#endif -#ifdef __X__ - frame->SetIcon(wxIcon("joyicon.xbm")); -#endif + // Create the main frame window - // Make a menubar - wxMenu *file_menu = new wxMenu; + frame = new MyFrame(NULL, wxT("Joystick Demo"), wxDefaultPosition, + wxSize(500, 400), wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL); - file_menu->Append(JOYTEST_QUIT, "&Exit"); + frame->SetIcon(wxICON(sample)); - wxMenu *help_menu = new wxMenu; - help_menu->Append(JOYTEST_ABOUT, "&About"); + // Make a menubar + wxMenu *file_menu = new wxMenu; - wxMenuBar *menu_bar = new wxMenuBar; + file_menu->Append(JOYTEST_QUIT, wxT("&Exit")); - menu_bar->Append(file_menu, "&File"); - menu_bar->Append(help_menu, "&Help"); + wxMenuBar *menu_bar = new wxMenuBar; - // Associate the menu bar with the frame - frame->SetMenuBar(menu_bar); + menu_bar->Append(file_menu, wxT("&File")); - frame->CreateStatusBar(); + // Associate the menu bar with the frame + frame->SetMenuBar(menu_bar); - frame->Show(TRUE); +#if wxUSE_STATUSBAR + frame->CreateStatusBar(); + frame->SetStatusText(wxString::Format(wxT("Device [%s] (PID:[%i] MID:[%i]) Ready... # of joysticks:[%i]"), stick.GetProductName().c_str(), stick.GetProductId(), stick.GetManufacturerId(), wxJoystick::GetNumberJoysticks())); +#endif // wxUSE_STATUSBAR - SetTopWindow(frame); + frame->CenterOnScreen(); + frame->Show(true); - return TRUE; + return true; } BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) - EVT_JOYSTICK_EVENTS(MyCanvas::OnJoystickEvent) + EVT_JOYSTICK_EVENTS(MyCanvas::OnJoystickEvent) END_EVENT_TABLE() // Define a constructor for my canvas MyCanvas::MyCanvas(wxWindow *parent, const wxPoint& pos, const wxSize& size): - wxScrolledWindow(parent, -1, pos, size, wxSUNKEN_BORDER) + wxScrolledWindow(parent, wxID_ANY, pos, size, wxSUNKEN_BORDER) { - wxJoystick joystick(wxJOYSTICK1); - joystick.SetCapture(this); + m_stick = new wxJoystick(wxJOYSTICK1); + nButtons = m_stick->GetNumberButtons(); + m_stick->SetCapture(this, 10); } -MyCanvas::~MyCanvas(void) +MyCanvas::~MyCanvas() { - wxJoystick joystick(wxJOYSTICK1); - joystick.ReleaseCapture(); + m_stick->ReleaseCapture(); + delete m_stick; } void MyCanvas::OnJoystickEvent(wxJoystickEvent& event) { - wxClientDC dc(this); - - wxPoint pt(event.GetPosition()); - - // Scale to canvas size - int cw, ch; - GetSize(&cw, &ch); - - pt.x = (long) (((double)pt.x/(double)wxGetApp().m_maxX) * cw); - pt.y = (long) (((double)pt.y/(double)wxGetApp().m_maxY) * ch); - - if (xpos > -1 && ypos > -1 && event.IsMove() && event.ButtonIsDown()) - { - dc.SetPen(*wxBLACK_PEN); - dc.DrawLine(xpos, ypos, pt.x, pt.y); - } - xpos = pt.x; - ypos = pt.y; - - char buf[100]; - if (event.ButtonDown()) - sprintf(buf, "Joystick (%ld, %ld) Fire!", pt.x, pt.y); - else - sprintf(buf, "Joystick (%ld, %ld)", pt.x, pt.y); - frame->SetStatusText(buf); - - if (event.ButtonDown() && wxGetApp().m_fire.IsOk()) - { - wxGetApp().m_fire.Play(); - } + // We don't have valid (x, y) coordinates for z-move events. + if ( !event.IsZMove() ) + { + wxClientDC dc(this); + + wxPoint pt(event.GetPosition()); + + // if negative positions are possible then shift everything up + int xmin = wxGetApp().m_minX; + int xmax = wxGetApp().m_maxX; + int ymin = wxGetApp().m_minY; + int ymax = wxGetApp().m_maxY; + if (xmin < 0) { + xmax += abs(xmin); + pt.x += abs(xmin); + } + if (ymin < 0) { + ymax += abs(ymin); + pt.y += abs(ymin); + } + + // Scale to canvas size + int cw, ch; + GetSize(&cw, &ch); + + pt.x = (long) (((double)pt.x/(double)xmax) * cw); + pt.y = (long) (((double)pt.y/(double)ymax) * ch); + + if (xpos > -1 && ypos > -1 && event.IsMove() && event.ButtonIsDown()) + { + dc.SetPen(*wxBLACK_PEN); + dc.DrawLine(xpos, ypos, pt.x, pt.y); + } + + xpos = pt.x; + ypos = pt.y; + } + +#if wxUSE_STATUSBAR + wxString buf; + if (event.ButtonDown()) + buf.Printf(wxT("Joystick (%d, %d) #%i Fire!"), xpos, ypos, event.GetButtonChange()); + else + buf.Printf(wxT("Joystick (%d, %d) "), xpos, ypos); + +/* + for(int i = 0; i < nButtons; ++i) + { + buf += wxString(wxT("[")) + + ((event.GetButtonState() & (1 << i)) ? wxT("Y") : wxT("N")) + wxString(wxT("]")); + } +*/ + + frame->SetStatusText(buf); +#endif // wxUSE_STATUSBAR + +#if wxUSE_SOUND + if (event.ButtonDown() && wxGetApp().m_fire.IsOk()) + { + wxGetApp().m_fire.Play(); + } +#endif // wxUSE_SOUND } BEGIN_EVENT_TABLE(MyFrame, wxFrame) - EVT_MENU(JOYTEST_QUIT, MyFrame::OnQuit) + EVT_MENU(JOYTEST_QUIT, MyFrame::OnQuit) END_EVENT_TABLE() -MyFrame::MyFrame(wxFrame *parent, const wxString& title, const wxPoint& pos, const wxSize& size, -const long style): - wxFrame(parent, -1, title, pos, size, style) +MyFrame::MyFrame(wxFrame *parent, const wxString& title, const wxPoint& pos, + const wxSize& size, const long style) + : wxFrame(parent, wxID_ANY, title, pos, size, style) { - canvas = new MyCanvas(this); + canvas = new MyCanvas(this); } -MyFrame::~MyFrame(void) +void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { -} - -void MyFrame::OnQuit(wxCommandEvent& event) -{ - Close(TRUE); + Close(true); } void MyFrame::OnActivate(wxActivateEvent& event) { - if (event.GetActive() && canvas) - canvas->SetFocus(); + if (event.GetActive() && canvas) + canvas->SetFocus(); } - -bool MyFrame::OnClose(void) -{ - return TRUE; -} \ No newline at end of file