libretro: add support for Open / Solid Apple keys.

Signed-off-by: Andrea Odetti <mariofutire@gmail.com>
This commit is contained in:
Andrea Odetti 2020-12-12 19:25:43 +00:00
parent ab655cda40
commit e461847a49
2 changed files with 109 additions and 68 deletions

View file

@ -26,6 +26,7 @@
#include "linux/videobuffer.h" #include "linux/videobuffer.h"
#include "linux/keyboard.h" #include "linux/keyboard.h"
#include "linux/paddle.h"
#include "frontends/common2/programoptions.h" #include "frontends/common2/programoptions.h"
#include "frontends/common2/configuration.h" #include "frontends/common2/configuration.h"
#include "frontends/retro/environment.h" #include "frontends/retro/environment.h"
@ -145,88 +146,124 @@ void Game::keyboardCallback(bool down, unsigned keycode, uint32_t character, uin
{ {
if (down) if (down)
{ {
BYTE ch = 0; processKeyDown(keycode, character, key_modifiers);
switch (keycode) }
else
{
processKeyUp(keycode, character, key_modifiers);
}
}
void Game::processKeyDown(unsigned keycode, uint32_t character, uint16_t key_modifiers)
{
BYTE ch = 0;
switch (keycode)
{
case RETROK_RETURN:
{ {
case RETROK_RETURN: ch = 0x0d;
break;
}
case RETROK_BACKSPACE: // same as AppleWin
case RETROK_LEFT:
{
ch = 0x08;
break;
}
case RETROK_RIGHT:
{
ch = 0x15;
break;
}
case RETROK_UP:
{
ch = 0x0b;
break;
}
case RETROK_DOWN:
{
ch = 0x0a;
break;
}
case RETROK_DELETE:
{
ch = 0x7f;
break;
}
case RETROK_ESCAPE:
{
ch = 0x1b;
break;
}
case RETROK_TAB:
{
ch = 0x09;
break;
}
case RETROK_LALT:
{
Paddle::setButtonPressed(Paddle::ourOpenApple);
break;
}
case RETROK_RALT:
{
Paddle::setButtonPressed(Paddle::ourSolidApple);
break;
}
case RETROK_a ... RETROK_z:
{
ch = (keycode - RETROK_a) + 0x01;
if (key_modifiers & RETROKMOD_CTRL)
{ {
ch = 0x0d; // ok
break;
} }
case RETROK_BACKSPACE: // same as AppleWin else if (key_modifiers & RETROKMOD_SHIFT)
case RETROK_LEFT:
{ {
ch = 0x08; ch += 0x60;
break;
} }
case RETROK_RIGHT: else
{ {
ch = 0x15; ch += 0x40;
break;
} }
case RETROK_UP: break;
}
}
if (!ch)
{
switch (character) {
case 0x20 ... 0x40:
case 0x5b ... 0x60:
case 0x7b ... 0x7e:
{ {
ch = 0x0b; // not the letters
break; // this is very simple, but one cannot handle CRTL-key combination.
} ch = character;
case RETROK_DOWN:
{
ch = 0x0a;
break;
}
case RETROK_DELETE:
{
ch = 0x7f;
break;
}
case RETROK_ESCAPE:
{
ch = 0x1b;
break;
}
case RETROK_TAB:
{
ch = 0x09;
break;
}
case RETROK_a ... RETROK_z:
{
ch = (keycode - RETROK_a) + 0x01;
if (key_modifiers & RETROKMOD_CTRL)
{
// ok
}
else if (key_modifiers & RETROKMOD_SHIFT)
{
ch += 0x60;
}
else
{
ch += 0x40;
}
break; break;
} }
} }
}
if (!ch) if (ch)
{
addKeyToBuffer(ch);
log_cb(RETRO_LOG_INFO, "RA2: %s - %02x\n", __FUNCTION__, ch);
}
}
void Game::processKeyUp(unsigned keycode, uint32_t character, uint16_t key_modifiers)
{
switch (keycode)
{
case RETROK_LALT:
{ {
switch (character) { Paddle::setButtonReleased(Paddle::ourOpenApple);
case 0x20 ... 0x40: break;
case 0x5b ... 0x60:
case 0x7b ... 0x7e:
{
// not the letters
// this is very simple, but one cannot handle CRTL-key combination.
ch = character;
break;
}
}
} }
case RETROK_RALT:
if (ch)
{ {
addKeyToBuffer(ch); Paddle::setButtonReleased(Paddle::ourSolidApple);
log_cb(RETRO_LOG_INFO, "RA2: %s - %02x\n", __FUNCTION__, ch); break;
} }
} }
} }

View file

@ -17,6 +17,10 @@ public:
static void keyboardCallback(bool down, unsigned keycode, uint32_t character, uint16_t key_modifiers); static void keyboardCallback(bool down, unsigned keycode, uint32_t character, uint16_t key_modifiers);
private: private:
Speed mySpeed; // fixed speed Speed mySpeed; // fixed speed
static void processKeyDown(unsigned keycode, uint32_t character, uint16_t key_modifiers);
static void processKeyUp(unsigned keycode, uint32_t character, uint16_t key_modifiers);
}; };