Fix joystick handling for multiple joysticks (well, partly at least)

This commit is contained in:
simon.kagstrom 2010-03-07 09:26:54 +00:00
parent fa3e08bee8
commit ec924bafeb
4 changed files with 24 additions and 10 deletions

View File

@ -164,7 +164,7 @@ private:
uint8 poll_joystick(int port);
uint8 poll_joystick_axes(int port, bool *has_event);
uint8 poll_joystick_hats(int port, bool *has_event);
uint8 poll_joystick_buttons(int port, bool *has_event);
uint8 poll_joystick_buttons(int port, uint8 *table, bool *has_event);
void thread_func(void);
bool thread_running; // Emulation thread is running

View File

@ -247,6 +247,7 @@ void C64::VBlank(bool draw_frame)
if (ThePrefs.JoystickSwap)
joy_port_1 = 1;
SDL_JoystickUpdate();
// Poll joysticks
j1 = poll_joystick(!joy_port_1);
j2 = poll_joystick(joy_port_1);

View File

@ -884,7 +884,7 @@ uint8 C64::poll_joystick_hats(int port, bool *has_event)
return out;
}
uint8 C64::poll_joystick_buttons(int port, bool *has_event)
uint8 C64::poll_joystick_buttons(int port, uint8 *table, bool *has_event)
{
SDL_Joystick *js = joy[port];
uint8 out = 0xff;
@ -901,12 +901,10 @@ uint8 C64::poll_joystick_buttons(int port, bool *has_event)
Gui::gui->pushJoystickEvent(ev);
*has_event = true;
}
if (kc == JOY_NONE)
continue;
TheDisplay->UpdateKeyMatrix(kc, !cur,
TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &out);
table[kc] = cur ? 2 : 1;
}
return out;
@ -919,20 +917,35 @@ uint8 C64::poll_joystick(int port)
{
bool has_event = false;
uint8 out = 0xff;
if (port == 0 && (joy[0] || joy[1]))
SDL_JoystickUpdate();
static uint8 last_table_ports[2][0xff];
static uint8 table_ports[2][0xff];
uint8 *last_table = last_table_ports[port];
uint8 *table = table_ports[port];
if (!joy[port])
return out;
memset(table, 0, 0xff);
out &= this->poll_joystick_axes(port, &has_event);
out &= this->poll_joystick_hats(port, &has_event);
out &= this->poll_joystick_buttons(port, &has_event);
out &= this->poll_joystick_buttons(port, table, &has_event);
if (!has_event)
Gui::gui->pushJoystickEvent(EVENT_NONE);
/* Handle keyboard codes */
for (int i = 0; i < 0x51; i++)
{
if (table[i] == 0 || table[i] == last_table[i])
continue;
TheDisplay->UpdateKeyMatrix(i, table[i] == 1,
TheCIA1->KeyMatrix, TheCIA1->RevMatrix, &out);
}
memcpy(last_table, table, sizeof(table));
return out;
}

View File

@ -158,6 +158,7 @@ void Prefs::SetupJoystickDefaults()
this->JoystickButtons[7] = 0x50;
this->JoystickButtons[9] = 0x50;
this->JoystickButtons[10] = 0x50;
this->MenuJoystickButtons[3] = KEY_SELECT;
this->MenuJoystickButtons[7] = KEY_SELECT;
this->MenuJoystickButtons[9] = KEY_SELECT;
@ -204,7 +205,6 @@ void Prefs::SetupJoystickDefaults()
/* Saitek P380 */
else if (strcmp(name, "Jess Tech Dual Analog Pad") == 0)
{
printf("Found joystikk\n");
/* Pad */
this->JoystickHats[0] = HAT_PLAIN;
this->MenuJoystickHats[0] = HAT_PLAIN;