mirror of
https://github.com/Oibaf66/frodo-wii.git
synced 2024-11-22 11:29:24 +01:00
Fixed keyboard input
This commit is contained in:
parent
fe89785105
commit
dc6d9aab2b
@ -1,4 +1,8 @@
|
||||
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
|
||||
"helpful and constructive" messages such as
|
||||
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 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",
|
||||
"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",
|
||||
"ctrl", "del", "home,", "shl", "shr", "clr", "C=", "<-",
|
||||
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(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),
|
||||
@ -253,7 +253,10 @@ void C64::bind_key(Prefs *np)
|
||||
32, 32, MENU_SIZE_X, MENU_SIZE_Y);
|
||||
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(&bind_key_menu);
|
||||
@ -353,7 +356,7 @@ void C64::Run(void)
|
||||
}
|
||||
|
||||
/* From dreamcast port */
|
||||
static char *auto_seq[4] =
|
||||
static const char *auto_seq[4] =
|
||||
{
|
||||
"\nLOAD \"*\",8,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)
|
||||
{
|
||||
#if defined(GEKKO)
|
||||
WPAD_ScanPads();
|
||||
#endif
|
||||
|
||||
// Poll joysticks
|
||||
TheCIA1->Joystick1 = poll_joystick(0);
|
||||
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)
|
||||
{
|
||||
#ifdef GEKKO
|
||||
int extra_keys[N_WIIMOTE_BINDINGS];
|
||||
int controller = port;
|
||||
Uint32 held;
|
||||
Uint32 held, held_other;
|
||||
uint8 j = 0xff;
|
||||
|
||||
if (ThePrefs.JoystickSwap)
|
||||
controller = !port;
|
||||
|
||||
WPAD_ScanPads();
|
||||
|
||||
held = WPAD_ButtonsHeld(controller);
|
||||
held_other = WPAD_ButtonsHeld(!controller);
|
||||
|
||||
if (held & WPAD_BUTTON_UP)
|
||||
j &= 0xfb; // Left
|
||||
if (held & WPAD_BUTTON_DOWN)
|
||||
@ -559,23 +567,26 @@ uint8 C64::poll_joystick(int port)
|
||||
j &= 0xef; // Button
|
||||
if (held & WPAD_BUTTON_HOME)
|
||||
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])
|
||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[0],
|
||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||
if ( (held & WPAD_BUTTON_B) && ThePrefs.JoystickKeyBinding[1])
|
||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[1],
|
||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||
if ( (held & WPAD_BUTTON_PLUS) && ThePrefs.JoystickKeyBinding[2])
|
||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[2],
|
||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||
if ( (held & WPAD_BUTTON_MINUS) && ThePrefs.JoystickKeyBinding[3])
|
||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[3],
|
||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||
if ( (held & WPAD_BUTTON_1) && ThePrefs.JoystickKeyBinding[4])
|
||||
TheDisplay->FakeKeyPressRepeat(ThePrefs.JoystickKeyBinding[4],
|
||||
false, TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||
int kc = ThePrefs.JoystickKeyBinding[i];
|
||||
|
||||
if ( kc < 0 )
|
||||
continue;
|
||||
|
||||
if (extra_keys[i])
|
||||
TheDisplay->UpdateKeyMatrix(kc, false,
|
||||
TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||
else
|
||||
TheDisplay->UpdateKeyMatrix(kc, true,
|
||||
TheCIA1->KeyMatrix, TheCIA1->RevMatrix);
|
||||
}
|
||||
|
||||
return j;
|
||||
|
@ -16,7 +16,7 @@
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SDL
|
||||
struct SDL_Surface;
|
||||
#include <SDL.h>
|
||||
extern SDL_Surface *real_screen;
|
||||
#endif
|
||||
|
||||
@ -65,11 +65,10 @@ public:
|
||||
void PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joystick);
|
||||
#endif
|
||||
#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,
|
||||
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
|
||||
bool NumLock(void);
|
||||
void InitColors(uint8 *colors);
|
||||
|
@ -245,22 +245,6 @@ int C64Display::BitmapXMod(void)
|
||||
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,
|
||||
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
|
||||
*/
|
||||
|
||||
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;
|
||||
switch (key) {
|
||||
@ -412,25 +419,7 @@ static void translate_key(SDLKey key, bool key_up, uint8 *key_matrix, uint8 *rev
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle other keys
|
||||
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);
|
||||
}
|
||||
this->UpdateKeyMatrix(c64_key, key_up, key_matrix, rev_matrix);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
@ -491,7 +480,7 @@ void C64Display::PollKeyboard(uint8 *key_matrix, uint8 *rev_matrix, uint8 *joyst
|
||||
if (event.key.keysym.sym == SDLK_NUMLOCK)
|
||||
num_locked = false;
|
||||
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;
|
||||
|
||||
// Quit Frodo
|
||||
|
13
Src/Prefs.h
13
Src/Prefs.h
@ -39,6 +39,17 @@ enum {
|
||||
DISPTYPE_SCREEN // BWindowScreen
|
||||
};
|
||||
|
||||
// Key bindings (WII)
|
||||
enum {
|
||||
WIIMOTE_A,
|
||||
WIIMOTE_B,
|
||||
WIIMOTE_PLUS,
|
||||
WIIMOTE_MINUS,
|
||||
WIIMOTE_1,
|
||||
N_WIIMOTE_BINDINGS
|
||||
};
|
||||
|
||||
|
||||
|
||||
// Preferences data
|
||||
class Prefs {
|
||||
@ -116,7 +127,7 @@ private:
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SDL
|
||||
int JoystickKeyBinding[5];
|
||||
int JoystickKeyBinding[N_WIIMOTE_BINDINGS];
|
||||
int DisplayOption;
|
||||
#endif
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user