mirror of
https://github.com/mauiaaron/apple2.git
synced 2025-01-10 23:29:43 +00:00
Better support for keypad emulated joystick
* Allow for automatic recentering of keypad emulated joystick * Force X11 to give us a detectable auto-repeat
This commit is contained in:
parent
f8d338b382
commit
ffd78508ba
4
.apple2
4
.apple2
@ -4,7 +4,7 @@ mode = //e
|
|||||||
disk path = /usr/local/games/apple2/disks
|
disk path = /usr/local/games/apple2/disks
|
||||||
color = interpolated
|
color = interpolated
|
||||||
volume = 8
|
volume = 8
|
||||||
joystick = pc joystick
|
joystick = joy keypad
|
||||||
system path = /usr/local/games/apple2/rom
|
system path = /usr/local/games/apple2/rom
|
||||||
pc joystick parms = 128 128 255 1 255 1 6
|
pc joystick parms = 128 128 255 1 255 1 6
|
||||||
keypad joystick parms = 16
|
keypad joystick parms = 8 1
|
||||||
|
@ -39,7 +39,8 @@ unsigned char joy_button0 = 0;
|
|||||||
unsigned char joy_button1 = 0;
|
unsigned char joy_button1 = 0;
|
||||||
|
|
||||||
#ifdef KEYPAD_JOYSTICK
|
#ifdef KEYPAD_JOYSTICK
|
||||||
short joy_step;
|
short joy_step = 1;
|
||||||
|
uint8_t auto_recenter = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PC_JOYSTICK
|
#ifdef PC_JOYSTICK
|
||||||
@ -360,8 +361,8 @@ static void c_calibrate_keypad_joystick()
|
|||||||
"| | . | 1 @ 3 |",
|
"| | . | 1 @ 3 |",
|
||||||
"| | | Alt-l Alt-r |",
|
"| | | Alt-l Alt-r |",
|
||||||
"| | | |",
|
"| | | |",
|
||||||
"| | | |",
|
"| | | + toggles auto- |",
|
||||||
"| | | |",
|
"| | | recentering: @@@ |",
|
||||||
"| | | < or > to change |",
|
"| | | < or > to change |",
|
||||||
"| ||||||||||||||||| sensitivity: @@ |",
|
"| ||||||||||||||||| sensitivity: @@ |",
|
||||||
"| |",
|
"| |",
|
||||||
@ -393,6 +394,9 @@ static void c_calibrate_keypad_joystick()
|
|||||||
snprintf(temp, TEMPSIZE, "%02x", (uint8_t)joy_step);
|
snprintf(temp, TEMPSIZE, "%02x", (uint8_t)joy_step);
|
||||||
copy_and_pad_string(&submenu[KEYPAD_SUBMENU_H-4][36], temp, ' ', 3, ' ');
|
copy_and_pad_string(&submenu[KEYPAD_SUBMENU_H-4][36], temp, ' ', 3, ' ');
|
||||||
|
|
||||||
|
snprintf(temp, TEMPSIZE, "%s", auto_recenter ? " on" : "off" );
|
||||||
|
copy_and_pad_string(&submenu[KEYPAD_SUBMENU_H-6][35], temp, ' ', 4, ' ');
|
||||||
|
|
||||||
int x_plot = CALIBRATE_TURTLE_KP_X0 + (int)(joy_x * CALIBRATE_TURTLE_KP_STEP_X);
|
int x_plot = CALIBRATE_TURTLE_KP_X0 + (int)(joy_x * CALIBRATE_TURTLE_KP_STEP_X);
|
||||||
int y_plot = CALIBRATE_TURTLE_KP_Y0 + (int)(joy_y * CALIBRATE_TURTLE_STEP_Y);
|
int y_plot = CALIBRATE_TURTLE_KP_Y0 + (int)(joy_y * CALIBRATE_TURTLE_STEP_Y);
|
||||||
|
|
||||||
@ -426,6 +430,15 @@ static void c_calibrate_keypad_joystick()
|
|||||||
++joy_step;
|
++joy_step;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (ch == '+')
|
||||||
|
{
|
||||||
|
auto_recenter = (auto_recenter+1) % 2;
|
||||||
|
if (auto_recenter)
|
||||||
|
{
|
||||||
|
joy_x = HALF_JOY_RANGE;
|
||||||
|
joy_y = HALF_JOY_RANGE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct timespec ts = { .tv_sec=0, .tv_nsec=33333333 };
|
static struct timespec ts = { .tv_sec=0, .tv_nsec=33333333 };
|
||||||
nanosleep(&ts, NULL);
|
nanosleep(&ts, NULL);
|
||||||
|
15
src/keys.c
15
src/keys.c
@ -398,6 +398,14 @@ void c_handle_input(int scancode, int pressed)
|
|||||||
#if defined(KEYPAD_JOYSTICK)
|
#if defined(KEYPAD_JOYSTICK)
|
||||||
else if (joy_mode == JOY_KPAD)
|
else if (joy_mode == JOY_KPAD)
|
||||||
{
|
{
|
||||||
|
bool joy_axis_unpressed = (!pressed && ((scancode == SCODE_J_U) || (scancode == SCODE_J_D) || (scancode == SCODE_J_L) || (scancode == SCODE_J_R)) );
|
||||||
|
|
||||||
|
if (key_pressed[ SCODE_J_C ] || (auto_recenter && joy_axis_unpressed))
|
||||||
|
{
|
||||||
|
joy_x = HALF_JOY_RANGE;
|
||||||
|
joy_y = HALF_JOY_RANGE;
|
||||||
|
}
|
||||||
|
|
||||||
if (key_pressed[ SCODE_J_U ])
|
if (key_pressed[ SCODE_J_U ])
|
||||||
{
|
{
|
||||||
if (joy_y > joy_step)
|
if (joy_y > joy_step)
|
||||||
@ -445,14 +453,9 @@ void c_handle_input(int scancode, int pressed)
|
|||||||
joy_x = JOY_RANGE-1;
|
joy_x = JOY_RANGE-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key_pressed[ SCODE_J_C ])
|
|
||||||
{
|
|
||||||
joy_x = HALF_JOY_RANGE;
|
|
||||||
joy_y = HALF_JOY_RANGE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(PC_JOYSTICK)
|
#if defined(PC_JOYSTICK)
|
||||||
else if ((joy_mode == JOY_PCJOY) && !(js_fd < 0))
|
else if ((joy_mode == JOY_PCJOY) && !(js_fd < 0))
|
||||||
{
|
{
|
||||||
|
@ -330,11 +330,13 @@ void load_settings(void)
|
|||||||
{
|
{
|
||||||
joy_step = 1;
|
joy_step = 1;
|
||||||
}
|
}
|
||||||
else
|
else if (joy_step > 255)
|
||||||
if (joy_step > 255)
|
|
||||||
{
|
{
|
||||||
joy_step = 255;
|
joy_step = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto_recenter = strtol(argument, &argument, 10);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -415,7 +417,7 @@ bool save_settings(void)
|
|||||||
|
|
||||||
#ifdef KEYPAD_JOYSTICK
|
#ifdef KEYPAD_JOYSTICK
|
||||||
err = fprintf(config_file,
|
err = fprintf(config_file,
|
||||||
"keypad joystick parms = %d\n", joy_step);
|
"keypad joystick parms = %d %u\n", joy_step, auto_recenter ? 1 : 0);
|
||||||
#endif
|
#endif
|
||||||
anErr = anErr || (err < 0);
|
anErr = anErr || (err < 0);
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ extern joystick_mode_t joy_mode;
|
|||||||
|
|
||||||
#ifdef KEYPAD_JOYSTICK
|
#ifdef KEYPAD_JOYSTICK
|
||||||
extern short joy_step;
|
extern short joy_step;
|
||||||
|
extern uint8_t auto_recenter;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PC_JOYSTICK
|
#ifdef PC_JOYSTICK
|
||||||
|
10
src/xvideo.c
10
src/xvideo.c
@ -898,6 +898,16 @@ void video_init() {
|
|||||||
// reset Apple2 softframebuffers
|
// reset Apple2 softframebuffers
|
||||||
memset(video__fb1,0,SCANWIDTH*SCANHEIGHT);
|
memset(video__fb1,0,SCANWIDTH*SCANHEIGHT);
|
||||||
memset(video__fb2,0,SCANWIDTH*SCANHEIGHT);
|
memset(video__fb2,0,SCANWIDTH*SCANHEIGHT);
|
||||||
|
|
||||||
|
#ifdef KEYPAD_JOYSTICK
|
||||||
|
int autorepeat_supported = 0;
|
||||||
|
XkbGetDetectableAutoRepeat(display, &autorepeat_supported);
|
||||||
|
if (autorepeat_supported)
|
||||||
|
{
|
||||||
|
LOG("Xkb Setting detectable autorepeat ...");
|
||||||
|
XkbSetDetectableAutoRepeat(display, true, NULL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void video_shutdown(void)
|
void video_shutdown(void)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user