Libretro: Redo key handling, support bitmasks

This commit is contained in:
Vicki Pfau 2021-04-14 00:25:22 -07:00
parent ad17c22e51
commit 527c089f1f
1 changed files with 28 additions and 10 deletions

View File

@ -86,11 +86,25 @@ static unsigned imcapWidth;
static unsigned imcapHeight; static unsigned imcapHeight;
static size_t camStride; static size_t camStride;
static bool deferredSetup = false; static bool deferredSetup = false;
static bool useBitmasks = true;
static bool envVarsUpdated; static bool envVarsUpdated;
static int32_t tiltX = 0; static int32_t tiltX = 0;
static int32_t tiltY = 0; static int32_t tiltY = 0;
static int32_t gyroZ = 0; static int32_t gyroZ = 0;
static const int keymap[] = {
RETRO_DEVICE_ID_JOYPAD_A,
RETRO_DEVICE_ID_JOYPAD_B,
RETRO_DEVICE_ID_JOYPAD_SELECT,
RETRO_DEVICE_ID_JOYPAD_START,
RETRO_DEVICE_ID_JOYPAD_RIGHT,
RETRO_DEVICE_ID_JOYPAD_LEFT,
RETRO_DEVICE_ID_JOYPAD_UP,
RETRO_DEVICE_ID_JOYPAD_DOWN,
RETRO_DEVICE_ID_JOYPAD_R,
RETRO_DEVICE_ID_JOYPAD_L,
};
static void _initSensors(void) { static void _initSensors(void) {
if (sensorsInitDone) { if (sensorsInitDone) {
return; return;
@ -322,6 +336,8 @@ void retro_init(void) {
}; };
environCallback(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, &inputDescriptors); environCallback(RETRO_ENVIRONMENT_SET_INPUT_DESCRIPTORS, &inputDescriptors);
useBitmasks = environCallback(RETRO_ENVIRONMENT_GET_INPUT_BITMASKS, NULL);
// TODO: RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME when BIOS booting is supported // TODO: RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME when BIOS booting is supported
rumbleInitDone = false; rumbleInitDone = false;
@ -382,6 +398,7 @@ void retro_deinit(void) {
gyroEnabled = false; gyroEnabled = false;
luxSensorEnabled = false; luxSensorEnabled = false;
sensorsInitDone = false; sensorsInitDone = false;
useBitmasks = false;
} }
void retro_run(void) { void retro_run(void) {
@ -414,16 +431,17 @@ void retro_run(void) {
} }
keys = 0; keys = 0;
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_A)) << 0; int i;
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_B)) << 1; if (useBitmasks) {
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_SELECT)) << 2; int16_t joypadMask = inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK);
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_START)) << 3; for (i = 0; i < sizeof(keymap) / sizeof(*keymap); ++i) {
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_RIGHT)) << 4; keys |= ((joypadMask >> keymap[i]) & 1) << i;
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_LEFT)) << 5; }
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP)) << 6; } else {
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_DOWN)) << 7; for (i = 0; i < sizeof(keymap) / sizeof(*keymap); ++i) {
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_R)) << 8; keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, keymap[i])) << i;
keys |= (!!inputCallback(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_L)) << 9; }
}
core->setKeys(core, keys); core->setKeys(core, keys);
if (!luxSensorUsed) { if (!luxSensorUsed) {