Add joystick support to wx GUI.
This commit is contained in:
parent
72c6716f49
commit
539f0bc150
17 changed files with 1381 additions and 504 deletions
358
src/wx-joystickconfig.cc
Normal file
358
src/wx-joystickconfig.cc
Normal file
|
|
@ -0,0 +1,358 @@
|
|||
#include "wx-joystickconfig.h"
|
||||
|
||||
#include "wx-utils.h"
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#include "wx-dialogbox.h"
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#endif
|
||||
|
||||
#include "wx/xrc/xmlres.h"
|
||||
|
||||
extern "C" {
|
||||
void pclog(const char *format, ...);
|
||||
#include "config.h"
|
||||
#include "device.h"
|
||||
#include "gameport.h"
|
||||
#include "plat-joystick.h"
|
||||
}
|
||||
|
||||
#define IDC_CONFIG_BASE 1000
|
||||
|
||||
static int joystick_nr;
|
||||
static int joystick_config_type;
|
||||
#define AXIS_STRINGS_MAX 3
|
||||
static char axis_strings[AXIS_STRINGS_MAX][10] = {"X Axis", "Y Axis", "Z Axis"};
|
||||
|
||||
static void rebuild_axis_button_selections(void *hdlg)
|
||||
{
|
||||
int id = IDC_CONFIG_BASE + 3;
|
||||
void *h;
|
||||
int joystick;
|
||||
int c, d;
|
||||
|
||||
h = wx_getdlgitem(hdlg, IDC_CONFIG_BASE+1);
|
||||
joystick = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
|
||||
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++)
|
||||
{
|
||||
int sel = c;
|
||||
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
|
||||
|
||||
if (joystick)
|
||||
{
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_axes; d++)
|
||||
{
|
||||
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].axis[d].name);
|
||||
if (c < AXIS_STRINGS_MAX)
|
||||
{
|
||||
if (!stricmp(axis_strings[c], plat_joystick_state[joystick-1].axis[d].name))
|
||||
sel = d;
|
||||
}
|
||||
}
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_povs; d++)
|
||||
{
|
||||
char s[80];
|
||||
|
||||
sprintf(s, "%s (X axis)", plat_joystick_state[joystick-1].pov[d].name);
|
||||
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick-1].pov[d].name);
|
||||
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
}
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, sel, 0);
|
||||
wx_enablewindow(h, TRUE);
|
||||
}
|
||||
else
|
||||
wx_enablewindow(h, FALSE);
|
||||
|
||||
id += 2;
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
|
||||
{
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
|
||||
|
||||
if (joystick)
|
||||
{
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_buttons; d++)
|
||||
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].button[d].name);
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, c, 0);
|
||||
wx_enablewindow(h, TRUE);
|
||||
}
|
||||
else
|
||||
wx_enablewindow(h, FALSE);
|
||||
|
||||
id += 2;
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_pov_count(joystick_config_type)*2; c++)
|
||||
{
|
||||
int sel = c;
|
||||
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
wx_sendmessage(h, WX_CB_RESETCONTENT, 0, 0);
|
||||
|
||||
if (joystick)
|
||||
{
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_povs; d++)
|
||||
{
|
||||
char s[80];
|
||||
|
||||
sprintf(s, "%s (X axis)", plat_joystick_state[joystick-1].pov[d].name);
|
||||
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
sprintf(s, "%s (Y axis)", plat_joystick_state[joystick-1].pov[d].name);
|
||||
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
}
|
||||
for (d = 0; d < plat_joystick_state[joystick-1].nr_axes; d++)
|
||||
{
|
||||
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LPARAM)(LPCSTR)plat_joystick_state[joystick-1].axis[d].name);
|
||||
}
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, sel, 0);
|
||||
wx_enablewindow(h, TRUE);
|
||||
}
|
||||
else
|
||||
wx_enablewindow(h, FALSE);
|
||||
|
||||
id += 2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int get_axis(void *hdlg, int id)
|
||||
{
|
||||
void *h = wx_getdlgitem(hdlg, id);
|
||||
int axis_sel = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
|
||||
int nr_axes = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr-1].nr_axes;
|
||||
|
||||
if (axis_sel < nr_axes)
|
||||
return axis_sel;
|
||||
|
||||
axis_sel -= nr_axes;
|
||||
if (axis_sel & 1)
|
||||
return POV_Y | (axis_sel >> 1);
|
||||
else
|
||||
return POV_X | (axis_sel >> 1);
|
||||
}
|
||||
|
||||
static int get_pov(void *hdlg, int id)
|
||||
{
|
||||
void *h = wx_getdlgitem(hdlg, id);
|
||||
int axis_sel = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
|
||||
int nr_povs = plat_joystick_state[joystick_state[joystick_nr].plat_joystick_nr-1].nr_povs*2;
|
||||
|
||||
if (axis_sel < nr_povs)
|
||||
{
|
||||
if (axis_sel & 1)
|
||||
return POV_Y | (axis_sel >> 1);
|
||||
else
|
||||
return POV_X | (axis_sel >> 1);
|
||||
}
|
||||
|
||||
return axis_sel - nr_povs;
|
||||
}
|
||||
|
||||
static int joystickconfig_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam)
|
||||
{
|
||||
switch (message)
|
||||
{
|
||||
case WX_INITDIALOG:
|
||||
{
|
||||
// rebuild_axis_button_selections(hdlg);
|
||||
|
||||
void *h = wx_getdlgitem(hdlg, IDC_CONFIG_BASE+1);
|
||||
int c;
|
||||
int id = IDC_CONFIG_BASE + 3;
|
||||
int joystick = joystick_state[joystick_nr].plat_joystick_nr;
|
||||
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, joystick, 0);
|
||||
|
||||
rebuild_axis_button_selections(hdlg);
|
||||
|
||||
if (joystick_state[joystick_nr].plat_joystick_nr)
|
||||
{
|
||||
int nr_axes = plat_joystick_state[joystick-1].nr_axes;
|
||||
int nr_povs = plat_joystick_state[joystick-1].nr_povs;
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++)
|
||||
{
|
||||
int mapping = joystick_state[joystick_nr].axis_mapping[c];
|
||||
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
if (mapping & POV_X)
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, nr_axes + (mapping & 3)*2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, nr_axes + (mapping & 3)*2 + 1, 0);
|
||||
else
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, mapping, 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
|
||||
{
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, joystick_state[joystick_nr].button_mapping[c], 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_pov_count(joystick_config_type); c++)
|
||||
{
|
||||
int mapping;
|
||||
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
mapping = joystick_state[joystick_nr].pov_mapping[c][0];
|
||||
if (mapping & POV_X)
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, (mapping & 3)*2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, (mapping & 3)*2 + 1, 0);
|
||||
else
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, mapping + nr_povs*2, 0);
|
||||
id += 2;
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
mapping = joystick_state[joystick_nr].pov_mapping[c][1];
|
||||
if (mapping & POV_X)
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, (mapping & 3)*2, 0);
|
||||
else if (mapping & POV_Y)
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, (mapping & 3)*2 + 1, 0);
|
||||
else
|
||||
wx_sendmessage(h, WX_CB_SETCURSEL, mapping + nr_povs*2, 0);
|
||||
id += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case WX_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
{
|
||||
case IDC_CONFIG_BASE+1:
|
||||
// if (HIWORD(wParam) == CBN_SELCHANGE)
|
||||
rebuild_axis_button_selections(hdlg);
|
||||
break;
|
||||
|
||||
case wxID_OK:
|
||||
{
|
||||
void *h;
|
||||
int c;
|
||||
int id = IDC_CONFIG_BASE + 3;
|
||||
|
||||
h = wx_getdlgitem(hdlg, IDC_CONFIG_BASE+1);
|
||||
joystick_state[joystick_nr].plat_joystick_nr = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
|
||||
|
||||
if (joystick_state[joystick_nr].plat_joystick_nr)
|
||||
{
|
||||
for (c = 0; c < joystick_get_axis_count(joystick_config_type); c++)
|
||||
{
|
||||
joystick_state[joystick_nr].axis_mapping[c] = get_axis(hdlg, id);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_button_count(joystick_config_type); c++)
|
||||
{
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
joystick_state[joystick_nr].button_mapping[c] = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
|
||||
id += 2;
|
||||
}
|
||||
for (c = 0; c < joystick_get_pov_count(joystick_config_type); c++)
|
||||
{
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
joystick_state[joystick_nr].pov_mapping[c][0] = get_pov(hdlg, id);
|
||||
id += 2;
|
||||
h = wx_getdlgitem(hdlg, id);
|
||||
joystick_state[joystick_nr].pov_mapping[c][1] = get_pov(hdlg, id);
|
||||
id += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
case wxID_CANCEL:
|
||||
wx_enddialog(hdlg, 0);
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void joystickconfig_open(void *hwnd, int joy_nr, int type)
|
||||
{
|
||||
char s[257];
|
||||
int c;
|
||||
|
||||
PCemDialogBox dialog((wxWindow*) hwnd, joystickconfig_dlgproc);
|
||||
// dialog.SetWindowStyle(wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
|
||||
|
||||
joystick_nr = joy_nr;
|
||||
joystick_config_type = type;
|
||||
|
||||
dialog.SetTitle("Joystick Configuration");
|
||||
|
||||
wxFlexGridSizer* root = new wxFlexGridSizer(0, 1, 0, 0);
|
||||
root->SetFlexibleDirection(wxBOTH);
|
||||
root->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
|
||||
dialog.SetSizer(root);
|
||||
|
||||
wxFlexGridSizer* sizer = new wxFlexGridSizer(0, 2, 0, 0);
|
||||
sizer->SetFlexibleDirection(wxBOTH);
|
||||
sizer->SetNonFlexibleGrowMode(wxFLEX_GROWMODE_SPECIFIED);
|
||||
sizer->AddGrowableCol(1);
|
||||
root->Add(sizer, 1, wxEXPAND, 5);
|
||||
|
||||
int id = IDC_CONFIG_BASE;
|
||||
|
||||
|
||||
sizer->Add(new wxStaticText(&dialog, id++, "Device:"), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
|
||||
wxBoxSizer* comboSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
sizer->Add(comboSizer, 1, wxEXPAND, 5);
|
||||
wxComboBox* cb = new wxComboBox(&dialog, id++);
|
||||
cb->SetEditable(false);
|
||||
comboSizer->Add(cb, 1, wxALL, 5);
|
||||
|
||||
cb->Append("None");
|
||||
for (c = 0; c < joysticks_present; c++)
|
||||
cb->Append(plat_joystick_state[c].name);
|
||||
|
||||
for (c = 0; c < joystick_get_axis_count(type); c++)
|
||||
{
|
||||
sprintf(s, "Axis %i:", c);
|
||||
sizer->Add(new wxStaticText(&dialog, id++, s), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
|
||||
wxBoxSizer* comboSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
sizer->Add(comboSizer, 1, wxEXPAND, 5);
|
||||
wxComboBox* cb = new wxComboBox(&dialog, id++);
|
||||
cb->SetEditable(false);
|
||||
comboSizer->Add(cb, 1, wxALL, 5);
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_button_count(type); c++)
|
||||
{
|
||||
sprintf(s, "Button %i:", c);
|
||||
sizer->Add(new wxStaticText(&dialog, id++, s), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
|
||||
wxBoxSizer* comboSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
sizer->Add(comboSizer, 1, wxEXPAND, 5);
|
||||
wxComboBox* cb = new wxComboBox(&dialog, id++);
|
||||
cb->SetEditable(false);
|
||||
comboSizer->Add(cb, 1, wxALL, 5);
|
||||
}
|
||||
|
||||
for (c = 0; c < joystick_get_pov_count(type)*2; c++)
|
||||
{
|
||||
sprintf(s, "POV %i:", c);
|
||||
sizer->Add(new wxStaticText(&dialog, id++, s), 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
|
||||
wxBoxSizer* comboSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
sizer->Add(comboSizer, 1, wxEXPAND, 5);
|
||||
wxComboBox* cb = new wxComboBox(&dialog, id++);
|
||||
cb->SetEditable(false);
|
||||
comboSizer->Add(cb, 1, wxALL, 5);
|
||||
}
|
||||
|
||||
wxBoxSizer* okCancelSizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
root->Add(okCancelSizer, 1, wxEXPAND, 5);
|
||||
|
||||
okCancelSizer->Add(0, 0, 1, wxEXPAND, 5);
|
||||
okCancelSizer->Add(new wxButton(&dialog, wxID_OK), 0, wxALL, 5);
|
||||
okCancelSizer->Add(new wxButton(&dialog, wxID_CANCEL), 0, wxALL, 5);
|
||||
|
||||
dialog.Fit();
|
||||
dialog.OnInit();
|
||||
dialog.ShowModal();
|
||||
dialog.Destroy();
|
||||
}
|
||||
Loading…
Reference in a new issue