mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-26 05:24:21 +01:00
Fixed keyboard input
This commit is contained in:
parent
fe89785105
commit
dc6d9aab2b
@ -1,4 +1,8 @@
|
|||||||
version 2:
|
version 2:
|
||||||
|
* Improve keyboard bindings to handle press and release correctly and also
|
||||||
|
both controllers at the same time (key is released when the last controller releases
|
||||||
|
it)
|
||||||
|
* Handle keycode 0 and therefore make del work
|
||||||
* Remove the 1-1 graphics option and make stretched the default. Should avoid
|
* Remove the 1-1 graphics option and make stretched the default. Should avoid
|
||||||
"helpful and constructive" messages such as
|
"helpful and constructive" messages such as
|
||||||
http://wiinewz.com/forums/nintendo-news/91829-frodo-v1-0-a.html#post580580
|
http://wiinewz.com/forums/nintendo-news/91829-frodo-v1-0-a.html#post580580
|
||||||
|
@ -226,13 +226,13 @@ void C64::bind_key(Prefs *np)
|
|||||||
{
|
{
|
||||||
menu_t bind_key_menu;
|
menu_t bind_key_menu;
|
||||||
menu_t key_menu;
|
menu_t key_menu;
|
||||||
static const char *keys[] = { "space", "Run/Stop", "return", "F1", "F3", "F5", "F7",
|
static const char *keys[] = { "None", "space", "Run/Stop", "return", "F1", "F3", "F5", "F7",
|
||||||
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
|
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A",
|
||||||
"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
|
"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
|
||||||
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
|
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
|
||||||
"ctrl", "del", "home,", "shl", "shr", "clr", "C=", "<-",
|
"ctrl", "del", "home,", "shl", "shr", "clr", "C=", "<-",
|
||||||
NULL };
|
NULL };
|
||||||
int kcs[] = { MATRIX(7, 4), MATRIX(7, 7), MATRIX(0, 1), /* space, R/S, return */
|
int kcs[] = { 0, MATRIX(7, 4), MATRIX(7, 7), MATRIX(0, 1), /* space, R/S, return */
|
||||||
MATRIX(0, 4), MATRIX(0, 5), MATRIX(0, 6), MATRIX(0, 3), MATRIX(4, 3), MATRIX(7, 0),
|
MATRIX(0, 4), MATRIX(0, 5), MATRIX(0, 6), MATRIX(0, 3), MATRIX(4, 3), MATRIX(7, 0),
|
||||||
MATRIX(7, 3), MATRIX(1, 0), MATRIX(1, 3), MATRIX(2, 0), MATRIX(2, 3), MATRIX(3, 0),
|
MATRIX(7, 3), MATRIX(1, 0), MATRIX(1, 3), MATRIX(2, 0), MATRIX(2, 3), MATRIX(3, 0),
|
||||||
MATRIX(3, 3), MATRIX(4, 0), MATRIX(1, 2), MATRIX(3, 4), MATRIX(2, 4), MATRIX(2, 2),
|
MATRIX(3, 3), MATRIX(4, 0), MATRIX(1, 2), MATRIX(3, 4), MATRIX(2, 4), MATRIX(2, 2),
|
||||||
@ -253,7 +253,10 @@ void C64::bind_key(Prefs *np)
|
|||||||
32, 32, MENU_SIZE_X, MENU_SIZE_Y);
|
32, 32, MENU_SIZE_X, MENU_SIZE_Y);
|
||||||
int key = menu_select(real_screen, &key_menu, NULL);
|
int key = menu_select(real_screen, &key_menu, NULL);
|
||||||
|
|
||||||
np->JoystickKeyBinding[opt] = kcs[key];
|
if (key > 0)
|
||||||
|
np->JoystickKeyBinding[opt] = kcs[key];
|
||||||
|
else if (key == 0)
|
||||||
|
np->JoystickKeyBinding[opt] = -1;
|
||||||
menu_fini(&key_menu);
|
menu_fini(&key_menu);
|
||||||
}
|
}
|
||||||
menu_fini(&bind_key_menu);
|
menu_fini(&bind_key_menu);
|
||||||
@ -353,7 +356,7 @@ void C64::Run(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* From dreamcast port */
|
/* From dreamcast port */
|
||||||
static char *auto_seq[4] =
|
static const char *auto_seq[4] =
|
||||||
{
|
{
|
||||||
"\nLOAD \"*\",8,1\nRUN\n",
|
"\nLOAD \"*\",8,1\nRUN\n",
|
||||||
"\nLOAD \"*\",9,1\nRUN\n",
|
"\nLOAD \"*\",9,1\nRUN\n",
|
||||||
@ -368,6 +371,10 @@ extern "C" int get_kc_from_char(char c_in, int *shifted);
|
|||||||
|
|
||||||
void C64::VBlank(bool draw_frame)
|
void C64::VBlank(bool draw_frame)
|
||||||
{
|
{
|
||||||
|
#if defined(GEKKO)
|
||||||
|
WPAD_ScanPads();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Poll joysticks
|
// Poll joysticks
|
||||||
TheCIA1->Joystick1 = poll_joystick(0);
|
TheCIA1->Joystick1 = poll_joystick(0);
|
||||||
TheCIA1->Joystick2 = poll_joystick(1);
|
TheCIA1->Joystick2 = poll_joystick(1);
|
||||||
@ -537,16 +544,17 @@ void C64::open_close_joysticks(bool oldjoy1, bool oldjoy2, bool newjoy1, bool ne
|
|||||||
uint8 C64::poll_joystick(int port)
|
uint8 C64::poll_joystick(int port)
|
||||||
{
|
{
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
int extra_keys[N_WIIMOTE_BINDINGS];
|
||||||
int controller = port;
|
int controller = port;
|
||||||
Uint32 held;
|
Uint32 held, held_other;
|
||||||
uint8 j = 0xff;
|
uint8 j = 0xff;
|
||||||
|
|
||||||
if (ThePrefs.JoystickSwap)
|
if (ThePrefs.JoystickSwap)
|
||||||
controller = !port;
|
controller = !port;
|
||||||
|
|
||||||
WPAD_ScanPads();
|
|
||||||
|
|
||||||
held = WPAD_ButtonsHeld(controller);
|
held = WPAD_ButtonsHeld(controller);
|
||||||
|
held_other = WPAD_ButtonsHeld(!controller);
|
||||||
|
|
||||||
if (held & WPAD_BUTTON_UP)
|
if (held & WPAD_BUTTON_UP)
|
||||||
j &= 0xfb; // Left
|
j &= 0xfb; // Left
|
||||||
if (held & WPAD_BUTTON_DOWN)
|
if (held & WPAD_BUTTON_DOWN)
|
||||||
@ -559,23 +567,26 @@ uint8 C64::poll_joystick(int port)
|
|||||||
j &= 0xef; // Button
|
j &= 0xef; // Button
|
||||||
if (held & WPAD_BUTTON_HOME)
|
if (held & WPAD_BUTTON_HOME)
|
||||||
this->enter_menu();
|
this->enter_menu();
|
||||||
else
|
|
||||||
|
extra_keys[WIIMOTE_A] = (held | held_other) & WPAD_BUTTON_A;
|
||||||
|
extra_keys[WIIMOTE_B] = (held | held_other) & WPAD_BUTTON_B;
|
||||||
|
extra_keys[WIIMOTE_PLUS] = (held | held_other) & WPAD_BUTTON_PLUS;
|
||||||
|
extra_keys[WIIMOTE_MINUS] = (held | held_other) & WPAD_BUTTON_MINUS;
|
||||||
|
extra_keys[WIIMOTE_1] = (held | held_other) & WPAD_BUTTON_1;
|
||||||
|
|
||||||
|
for (int i = 0; i < N_WIIMOTE_BINDINGS; i++)
|
||||||
{
|
{
|
||||||
if ( (held & WPAD_BUTTON_A) && ThePrefs.JoystickKeyBinding[0])
|
int kc = ThePrefs.JoystickKeyBinding[i];
|
||||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[0],
|
|
||||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
if ( kc < 0 )
|
||||||
if ( (held & WPAD_BUTTON_B) && ThePrefs.JoystickKeyBinding[1])
|
continue;
|
||||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[1],
|
|
||||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
if (extra_keys[i])
|
||||||
if ( (held & WPAD_BUTTON_PLUS) && ThePrefs.JoystickKeyBinding[2])
|
TheDisplay->UpdateKeyMatrix(kc, false,
|
||||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[2],
|
TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
else
|
||||||
if ( (held & WPAD_BUTTON_MINUS) && ThePrefs.JoystickKeyBinding[3])
|
TheDisplay->UpdateKeyMatrix(kc, true,
|
||||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[3],
|
TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
|
||||||
if ( (held & WPAD_BUTTON_1) && ThePrefs.JoystickKeyBinding[4])
|
|
||||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[4],
|
|
||||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return j;
|
return j;
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SDL
|
#ifdef HAVE_SDL
|
||||||
struct SDL_Surface;
|
#include <SDL.h>
|
||||||
extern SDL_Surface *real_screen;
|
extern SDL_Surface *real_screen;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -65,11 +65,10 @@ public:
|
|||||||
void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick);
|
void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick);
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_SDL)
|
#if defined(HAVE_SDL)
|
||||||
void FakeKeyPressRepeat(int kc, bool shift, uint8 *CIA_key_matrix,
|
|
||||||
uint8 *CIA_rev_matrix);
|
|
||||||
|
|
||||||
void FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix,
|
void FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix,
|
||||||
uint8 *CIA_rev_matrix);
|
uint8 *CIA_rev_matrix);
|
||||||
|
void TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick);
|
||||||
|
void UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix);
|
||||||
#endif
|
#endif
|
||||||
bool NumLock(void);
|
bool NumLock(void);
|
||||||
void InitColors(uint8 *colors);
|
void InitColors(uint8 *colors);
|
||||||
|
@ -245,22 +245,6 @@ int C64Display::BitmapXMod(void)
|
|||||||
return screen->pitch;
|
return screen->pitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
void C64Display::FakeKeyPressRepeat(int kc, bool shift, uint8 *CIA_key_matrix, uint8 *CIA_rev_matrix)
|
|
||||||
{
|
|
||||||
static int cnt = 5;
|
|
||||||
|
|
||||||
if (cnt > 0) {
|
|
||||||
this->FakeKeyPress(-1, shift, CIA_key_matrix, CIA_rev_matrix);
|
|
||||||
cnt--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this->FakeKeyPress(kc, shift, CIA_key_matrix, CIA_rev_matrix);
|
|
||||||
cnt = 5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void C64Display::FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix,
|
void C64Display::FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix,
|
||||||
uint8 *CIA_rev_matrix)
|
uint8 *CIA_rev_matrix)
|
||||||
{
|
{
|
||||||
@ -294,11 +278,34 @@ void C64Display::FakeKeyPress(int kc, bool shift, uint8 *CIA_key_matrix,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void C64Display::UpdateKeyMatrix(int c64_key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix)
|
||||||
|
{
|
||||||
|
bool shifted = c64_key & 0x80;
|
||||||
|
int c64_byte = (c64_key >> 3) & 7;
|
||||||
|
int c64_bit = c64_key & 7;
|
||||||
|
|
||||||
|
if (key_up) {
|
||||||
|
if (shifted) {
|
||||||
|
key_matrix[6] |= 0x10;
|
||||||
|
rev_matrix[4] |= 0x40;
|
||||||
|
}
|
||||||
|
key_matrix[c64_byte] |= (1 << c64_bit);
|
||||||
|
rev_matrix[c64_bit] |= (1 << c64_byte);
|
||||||
|
} else {
|
||||||
|
if (shifted) {
|
||||||
|
key_matrix[6] &= 0xef;
|
||||||
|
rev_matrix[4] &= 0xbf;
|
||||||
|
}
|
||||||
|
key_matrix[c64_byte] &= ~(1 << c64_bit);
|
||||||
|
rev_matrix[c64_bit] &= ~(1 << c64_byte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Poll the keyboard
|
* Poll the keyboard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void translate_key(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
|
void C64Display::TranslateKey(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
|
||||||
{
|
{
|
||||||
int c64_key = -1;
|
int c64_key = -1;
|
||||||
switch (key) {
|
switch (key) {
|
||||||
@ -412,25 +419,7 @@ static void translate_key(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle other keys
|
this->UpdateKeyMatrix(c64_key, key_up, key_matrix, rev_matrix);
|
||||||
bool shifted = c64_key & 0x80;
|
|
||||||
int c64_byte = (c64_key >> 3) & 7;
|
|
||||||
int c64_bit = c64_key & 7;
|
|
||||||
if (key_up) {
|
|
||||||
if (shifted) {
|
|
||||||
key_matrix[6] |= 0x10;
|
|
||||||
rev_matrix[4] |= 0x40;
|
|
||||||
}
|
|
||||||
key_matrix[c64_byte] |= (1 << c64_bit);
|
|
||||||
rev_matrix[c64_bit] |= (1 << c64_byte);
|
|
||||||
} else {
|
|
||||||
if (shifted) {
|
|
||||||
key_matrix[6] &= 0xef;
|
|
||||||
rev_matrix[4] &= 0xbf;
|
|
||||||
}
|
|
||||||
key_matrix[c64_byte] &= ~(1 << c64_bit);
|
|
||||||
rev_matrix[c64_bit] &= ~(1 << c64_byte);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
|
void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick)
|
||||||
@ -481,7 +470,7 @@ void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joyst
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
translate_key(event.key.keysym.sym, false, key_matrix, rev_matrix, joystick);
|
TranslateKey(event.key.keysym.sym, false, key_matrix, rev_matrix, joystick);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -491,7 +480,7 @@ void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joyst
|
|||||||
if (event.key.keysym.sym == SDLK_NUMLOCK)
|
if (event.key.keysym.sym == SDLK_NUMLOCK)
|
||||||
num_locked = false;
|
num_locked = false;
|
||||||
else
|
else
|
||||||
translate_key(event.key.keysym.sym, true, key_matrix, rev_matrix, joystick);
|
TranslateKey(event.key.keysym.sym, true, key_matrix, rev_matrix, joystick);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Quit Frodo
|
// Quit Frodo
|
||||||
|
13
Src/Prefs.h
13
Src/Prefs.h
@ -39,6 +39,17 @@ enum {
|
|||||||
DISPTYPE_SCREEN // BWindowScreen
|
DISPTYPE_SCREEN // BWindowScreen
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Key bindings (WII)
|
||||||
|
enum {
|
||||||
|
WIIMOTE_A,
|
||||||
|
WIIMOTE_B,
|
||||||
|
WIIMOTE_PLUS,
|
||||||
|
WIIMOTE_MINUS,
|
||||||
|
WIIMOTE_1,
|
||||||
|
N_WIIMOTE_BINDINGS
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Preferences data
|
// Preferences data
|
||||||
class Prefs {
|
class Prefs {
|
||||||
@ -116,7 +127,7 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SDL
|
#ifdef HAVE_SDL
|
||||||
int JoystickKeyBinding[5];
|
int JoystickKeyBinding[N_WIIMOTE_BINDINGS];
|
||||||
int DisplayOption;
|
int DisplayOption;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user