Add joystick support to wx GUI.

This commit is contained in:
SarahW 2017-10-09 22:04:22 +01:00
commit 539f0bc150
17 changed files with 1381 additions and 504 deletions

View file

@ -45,7 +45,7 @@ pcem_SOURCES += wx-main.cc wx-config_sel.c wx-dialogbox.cc wx-utils.cc wx-app.cc
wx-sdl2-joystick.c wx-sdl2-mouse.c wx-sdl2-keyboard.c wx-sdl2-video.c wx-sdl2-midi.c \
wx-sdl2.c wx-config.c wx-deviceconfig.cc wx-status.cc wx-sdl2-status.c \
wx-resources.cpp wx-thread.c wx-common.c wx-sdl2-display.c wx-sdl2-video-renderer.c wx-sdl2-video-gl3.c \
wx-glslp-parser.c wx-shader_man.c wx-shaderconfig.cc
wx-glslp-parser.c wx-shader_man.c wx-shaderconfig.cc wx-joystickconfig.cc
else
pcem_CFLAGS = $(allegro_CFLAGS) -DPCEM_ALLEGRO
pcem_CXXFLAGS =

View file

@ -23,7 +23,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70
x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o \
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o
DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -23,7 +23,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70
x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o \
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o
DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -24,7 +24,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad
vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xtide.o win-midi.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display-win.o \
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx.res
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o wx.res
DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -24,7 +24,7 @@ OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o ali1429.o amstrad
vid_vga.o vid_voodoo.o vid_wy700.o video.o wd76c10.o x86seg.o x87.o xtide.o win-midi.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-hostconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display-win.o \
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx.res
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o wx.res
DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o
NETOBJ = ne2000.o nethandler.o

View file

@ -22,7 +22,7 @@ vid_tkd8001_ramdac.o vid_tvga.o vid_unk_ramdac.o vid_vga.o vid_voodoo.o vid_wy70
x86seg.o x87.o xtide.o sound_dbopl.o sound_resid.o \
wx-main.o wx-config_sel.o wx-dialogbox.o wx-utils.o wx-app.o wx-sdl2-joystick.o wx-sdl2-mouse.o wx-sdl2-keyboard.o wx-sdl2-video.o wx-sdl2-midi.o \
wx-sdl2.o wx-config.o wx-deviceconfig.o wx-status.o wx-sdl2-status.o wx-resources.o wx-thread.o wx-common.o wx-sdl2-display.o \
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o
wx-sdl2-video-renderer.o wx-sdl2-video-gl3.o wx-glslp-parser.o wx-shader_man.o wx-shaderconfig.o wx-joystickconfig.o
DBOBJ = cdrom_image.o dbopl.o nukedopl.o vid_cga_comp.o
SIDOBJ = convolve.o convolve-sse.o envelope.o extfilt.o filter.o pot.o sid.o voice.o wave6581__ST.o wave6581_P_T.o wave6581_PS_.o wave6581_PST.o wave8580__ST.o wave8580_P_T.o wave8580_PS_.o wave8580_PST.o wave.o

View file

@ -581,3 +581,5 @@ void saveconfig(char *fn);
void saveconfig_global_only();
#define UNUSED(x) (void)x
#define MIN(a, b) ((a) < (b) ? (a) : (b))

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1942,6 +1942,102 @@
</object>
</object>
</object>
<object class="notebookpage">
<selected>0</selected>
<bitmap>icons/32x32/joystick.png</bitmap>
<object class="wxPanel">
<style>wxTAB_TRAVERSAL</style>
<object class="wxFlexGridSizer">
<rows>2</rows>
<cols>0</cols>
<vgap>0</vgap>
<hgap>0</hgap>
<growablecols></growablecols>
<growablerows></growablerows>
<object class="sizeritem">
<object class="wxFlexGridSizer">
<rows>0</rows>
<cols>4</cols>
<vgap>0</vgap>
<hgap>0</hgap>
<growablecols>1</growablecols>
<growablerows></growablerows>
<object class="sizeritem">
<option>0</option>
<flag>wxALL | wxALIGN_CENTER_VERTICAL</flag>
<border>5</border>
<object class="wxStaticText">
<size>80,-1</size>
<label>Joystick:</label>
<wrap>-1</wrap>
</object>
</object>
<object class="sizeritem">
<option>1</option>
<flag>wxEXPAND</flag>
<border>5</border>
<object class="wxBoxSizer">
<orient>wxHORIZONTAL</orient>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxComboBox" name="IDC_COMBOJOY">
<style>wxCB_DROPDOWN|wxCB_READONLY</style>
<size>350,-1</size>
<value></value>
<content />
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem">
<object class="wxGridSizer">
<rows>0</rows>
<cols>4</cols>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxButton" name="IDC_JOY1">
<label>Joystick 1...</label>
<default>1</default>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxButton" name="IDC_JOY2">
<label>Joystick 2...</label>
<default>1</default>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxButton" name="IDC_JOY3">
<label>Joystick 3...</label>
<default>1</default>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxALL</flag>
<border>5</border>
<object class="wxButton" name="IDC_JOY4">
<label>Joystick 4...</label>
<default>1</default>
</object>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="notebookpage">
<label></label>
<selected>0</selected>

View file

@ -19,8 +19,6 @@
#include "scsi_aha1540.h"
#include "timer.h"
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
int primed = 0;
typedef enum
{

View file

@ -1,5 +1,6 @@
#include "wx-utils.h"
#include "wx-sdl2.h"
#include "wx-joystickconfig.h"
#include "ibm.h"
#include "ide.h"
@ -269,6 +270,7 @@ int config_dlgsave(void* hdlg)
int temp_fda_type, temp_fdb_type;
int temp_mouse_type;
int temp_lpt1_device;
int temp_joystick_type;
#ifdef USE_NETWORKING
int temp_network_card;
#endif
@ -327,8 +329,9 @@ int config_dlgsave(void* hdlg)
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBODRB"));
temp_fdb_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
// h = wx_getdlgitem(hdlg, ID("IDC_COMBOJOY"));
// temp_joystick_type = wx_sendmessage(h, CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOMOUSE"));
temp_mouse_type = settings_list_to_mouse[wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0)];
@ -468,8 +471,8 @@ int config_dlgsave(void* hdlg)
speedchanged();
// joystick_type = temp_joystick_type;
// gameport_update_joystick_type();
joystick_type = temp_joystick_type;
gameport_update_joystick_type();
return TRUE;
@ -640,24 +643,24 @@ int config_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam)
else
wx_sendmessage(h, WX_WM_SETTEXT, 0, (LONG_PARAM) "KB");
// h = wx_getdlgitem(hdlg, ID("IDC_COMBOJOY"));
// c = 0;
// while (joystick_get_name(c))
// {
// wx_sendmessage(h, CB_ADDSTRING, 0, joystick_get_name(c));
// c++;
// }
// wx_enablewindow(h, TRUE);
// wx_sendmessage(h, CB_SETCURSEL, joystick_type, 0);
//
// h = wx_getdlgitem(hdlg, ID("IDC_JOY1"));
// wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 1) ? TRUE : FALSE);
// h = wx_getdlgitem(hdlg, ID("IDC_JOY2"));
// wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 2) ? TRUE : FALSE);
// h = wx_getdlgitem(hdlg, ID("IDC_JOY3"));
// wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 3) ? TRUE : FALSE);
// h = wx_getdlgitem(hdlg, ID("IDC_JOY4"));
// wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 4) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
c = 0;
while (joystick_get_name(c))
{
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM)joystick_get_name(c));
c++;
}
wx_enablewindow(h, TRUE);
wx_sendmessage(h, WX_CB_SETCURSEL, joystick_type, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY1"));
wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 1) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY2"));
wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 2) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY3"));
wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 3) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY4"));
wx_enablewindow(h, (joystick_get_max_joysticks(joystick_type) >= 4) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOWS"));
wx_sendmessage(h, WX_CB_ADDSTRING, 0, (LONG_PARAM) "System default");
@ -1028,51 +1031,54 @@ int config_dlgproc(void* hdlg, int message, INT_PARAM wParam, LONG_PARAM lParam)
deviceconfig_open(hdlg, (void *)network_card_getdevice(temp_network_card));
}
#endif
//
// case IDC_COMBOJOY:
// if (HIWORD(wParam) == CBN_SELCHANGE) {
// h = wx_getdlgitem(hdlg, IDC_COMBOJOY);
// temp_joystick_type = wx_sendmessage(h, CB_GETCURSEL, 0, 0);
//
// h = wx_getdlgitem(hdlg, IDC_JOY1);
// wx_enablewindow(h,
// (joystick_get_max_joysticks(temp_joystick_type) >= 1) ?
// TRUE : FALSE);
// h = wx_getdlgitem(hdlg, IDC_JOY2);
// wx_enablewindow(h,
// (joystick_get_max_joysticks(temp_joystick_type) >= 2) ?
// TRUE : FALSE);
// h = wx_getdlgitem(hdlg, IDC_JOY3);
// wx_enablewindow(h,
// (joystick_get_max_joysticks(temp_joystick_type) >= 3) ?
// TRUE : FALSE);
// h = wx_getdlgitem(hdlg, IDC_JOY4);
// wx_enablewindow(h,
// (joystick_get_max_joysticks(temp_joystick_type) >= 4) ?
// TRUE : FALSE);
// }
// break;
//
// case IDC_JOY1:
// h = wx_getdlgitem(hdlg, IDC_COMBOJOY);
// temp_joystick_type = wx_sendmessage(h, CB_GETCURSEL, 0, 0);
// joystickconfig_open(hdlg, 0, temp_joystick_type);
// break;
// case IDC_JOY2:
// h = wx_getdlgitem(hdlg, IDC_COMBOJOY);
// temp_joystick_type = wx_sendmessage(h, CB_GETCURSEL, 0, 0);
// joystickconfig_open(hdlg, 1, temp_joystick_type);
// break;
// case IDC_JOY3:
// h = wx_getdlgitem(hdlg, IDC_COMBOJOY);
// temp_joystick_type = wx_sendmessage(h, CB_GETCURSEL, 0, 0);
// joystickconfig_open(hdlg, 2, temp_joystick_type);
// break;
// case IDC_JOY4:
// h = wx_getdlgitem(hdlg, IDC_COMBOJOY);
// temp_joystick_type = wx_sendmessage(h, CB_GETCURSEL, 0, 0);
// joystickconfig_open(hdlg, 3, temp_joystick_type);
// break;
else if (wParam == WX_ID("IDC_COMBOJOY"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY1"));
wx_enablewindow(h, (joystick_get_max_joysticks(temp_joystick_type) >= 1) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY2"));
wx_enablewindow(h, (joystick_get_max_joysticks(temp_joystick_type) >= 2) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY3"));
wx_enablewindow(h, (joystick_get_max_joysticks(temp_joystick_type) >= 3) ? TRUE : FALSE);
h = wx_getdlgitem(hdlg, WX_ID("IDC_JOY4"));
wx_enablewindow(h, (joystick_get_max_joysticks(temp_joystick_type) >= 4) ? TRUE : FALSE);
}
else if (wParam == WX_ID("IDC_JOY1"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
joystickconfig_open(hdlg, 0, temp_joystick_type);
}
else if (wParam == WX_ID("IDC_JOY2"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
joystickconfig_open(hdlg, 1, temp_joystick_type);
}
else if (wParam == WX_ID("IDC_JOY3"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
joystickconfig_open(hdlg, 2, temp_joystick_type);
}
else if (wParam == WX_ID("IDC_JOY4"))
{
int temp_joystick_type;
h = wx_getdlgitem(hdlg, WX_ID("IDC_COMBOJOY"));
temp_joystick_type = wx_sendmessage(h, WX_CB_GETCURSEL, 0, 0);
joystickconfig_open(hdlg, 3, temp_joystick_type);
}
return 0;
}
}

358
src/wx-joystickconfig.cc Normal file
View 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();
}

15
src/wx-joystickconfig.h Normal file
View file

@ -0,0 +1,15 @@
#ifndef SRC_WX_DEVICECONFIG_H_
#define SRC_WX_DEVICECONFIG_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
void joystickconfig_open(void *hwnd, int joy_nr, int type);
#ifdef __cplusplus
}
#endif
#endif /* SRC_WX_DEVICECONFIG_H_ */

File diff suppressed because it is too large Load diff

View file

@ -1,15 +1,165 @@
#include <stdlib.h>
#include <math.h>
#include <SDL2/SDL.h>
#include "ibm.h"
#include "device.h"
#include "gameport.h"
#include "plat-joystick.h"
int joysticks_present;
joystick_t joystick_state[MAX_JOYSTICKS];
plat_joystick_t plat_joystick_state[MAX_PLAT_JOYSTICKS];
static SDL_Joystick *sdl_joy[MAX_PLAT_JOYSTICKS];
void joystick_init()
{
joysticks_present = 0;
int c;
SDL_InitSubSystem(SDL_INIT_JOYSTICK);
joysticks_present = SDL_NumJoysticks();
memset(sdl_joy, 0, sizeof(sdl_joy));
for (c = 0; c < joysticks_present; c++)
{
sdl_joy[c] = SDL_JoystickOpen(c);
if (sdl_joy[c])
{
int d;
pclog("Opened Joystick %i\n", c);
pclog(" Name: %s\n", SDL_JoystickName(sdl_joy[c]));
pclog(" Number of Axes: %d\n", SDL_JoystickNumAxes(sdl_joy[c]));
pclog(" Number of Buttons: %d\n", SDL_JoystickNumButtons(sdl_joy[c]));
pclog(" Number of Hats: %d\n", SDL_JoystickNumHats(sdl_joy[c]));
strncpy(plat_joystick_state[c].name, SDL_JoystickNameForIndex(c), 64);
plat_joystick_state[c].nr_axes = SDL_JoystickNumAxes(sdl_joy[c]);
plat_joystick_state[c].nr_buttons = SDL_JoystickNumButtons(sdl_joy[c]);
plat_joystick_state[c].nr_povs = SDL_JoystickNumHats(sdl_joy[c]);
for (d = 0; d < MIN(plat_joystick_state[c].nr_axes, 8); d++)
{
sprintf(plat_joystick_state[c].axis[d].name, "Axis %i", d);
plat_joystick_state[c].axis[d].id = d;
}
for (d = 0; d < MIN(plat_joystick_state[c].nr_buttons, 8); d++)
{
sprintf(plat_joystick_state[c].button[d].name, "Button %i", d);
plat_joystick_state[c].button[d].id = d;
}
for (d = 0; d < MIN(plat_joystick_state[c].nr_povs, 4); d++)
{
sprintf(plat_joystick_state[c].pov[d].name, "POV %i", d);
plat_joystick_state[c].pov[d].id = d;
}
}
}
}
void joystick_close()
{
int c;
for (c = 0; c < joysticks_present; c++)
{
if (sdl_joy[c])
SDL_JoystickClose(sdl_joy[c]);
}
}
static int joystick_get_axis(int joystick_nr, int mapping)
{
if (mapping & POV_X)
{
switch (plat_joystick_state[joystick_nr].p[mapping & 3])
{
case SDL_HAT_LEFTUP: case SDL_HAT_LEFT: case SDL_HAT_LEFTDOWN:
return -32767;
case SDL_HAT_RIGHTUP: case SDL_HAT_RIGHT: case SDL_HAT_RIGHTDOWN:
return 32767;
default:
return 0;
}
}
else if (mapping & POV_Y)
{
switch (plat_joystick_state[joystick_nr].p[mapping & 3])
{
case SDL_HAT_LEFTUP: case SDL_HAT_UP: case SDL_HAT_RIGHTUP:
return -32767;
case SDL_HAT_LEFTDOWN: case SDL_HAT_DOWN: case SDL_HAT_RIGHTDOWN:
return 32767;
default:
return 0;
}
}
else
return plat_joystick_state[joystick_nr].a[plat_joystick_state[joystick_nr].axis[mapping].id];
}
void joystick_poll()
{
int c, d;
SDL_JoystickUpdate();
for (c = 0; c < joysticks_present; c++)
{
int b;
plat_joystick_state[c].a[0] = SDL_JoystickGetAxis(sdl_joy[c], 0);
plat_joystick_state[c].a[1] = SDL_JoystickGetAxis(sdl_joy[c], 1);
plat_joystick_state[c].a[2] = SDL_JoystickGetAxis(sdl_joy[c], 2);
plat_joystick_state[c].a[3] = SDL_JoystickGetAxis(sdl_joy[c], 3);
plat_joystick_state[c].a[4] = SDL_JoystickGetAxis(sdl_joy[c], 4);
plat_joystick_state[c].a[5] = SDL_JoystickGetAxis(sdl_joy[c], 5);
for (b = 0; b < 16; b++)
plat_joystick_state[c].b[b] = SDL_JoystickGetButton(sdl_joy[c], b);
for (b = 0; b < 4; b++)
plat_joystick_state[c].p[b] = SDL_JoystickGetHat(sdl_joy[c], b);
// pclog("joystick %i - x=%i y=%i b[0]=%i b[1]=%i %i\n", c, joystick_state[c].x, joystick_state[c].y, joystick_state[c].b[0], joystick_state[c].b[1], joysticks_present);
}
for (c = 0; c < joystick_get_max_joysticks(joystick_type); c++)
{
if (joystick_state[c].plat_joystick_nr)
{
int joystick_nr = joystick_state[c].plat_joystick_nr - 1;
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
joystick_state[c].axis[d] = joystick_get_axis(joystick_nr, joystick_state[c].axis_mapping[d]);
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
joystick_state[c].button[d] = plat_joystick_state[joystick_nr].b[joystick_state[c].button_mapping[d]];
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
{
int x, y;
double angle, magnitude;
x = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][0]);
y = joystick_get_axis(joystick_nr, joystick_state[c].pov_mapping[d][1]);
angle = (atan2((double)y, (double)x) * 360.0) / (2*M_PI);
magnitude = sqrt((double)x*(double)x + (double)y*(double)y);
if (magnitude < 16384)
joystick_state[c].pov[d] = -1;
else
joystick_state[c].pov[d] = ((int)angle + 90 + 360) % 360;
}
}
else
{
for (d = 0; d < joystick_get_axis_count(joystick_type); d++)
joystick_state[c].axis[d] = 0;
for (d = 0; d < joystick_get_button_count(joystick_type); d++)
joystick_state[c].button[d] = 0;
for (d = 0; d < joystick_get_pov_count(joystick_type); d++)
joystick_state[c].pov[d] = -1;
}
}
}

View file

@ -27,6 +27,7 @@
#include "model.h"
#include "mouse.h"
#include "nvr.h"
#include "plat-joystick.h"
#include "sound.h"
#include "thread.h"
#include "disc.h"
@ -512,6 +513,7 @@ int pc_main(int argc, char** argv)
display_init();
#endif
sdl_video_init();
joystick_init();
return TRUE;
}