mirror of
https://github.com/CTCaer/RetroArch.git
synced 2025-02-04 02:26:13 +00:00
(iOS) Add keyboard character callback support.
This commit is contained in:
parent
b4fc13b0cc
commit
2e4846cb43
@ -24,6 +24,36 @@ static const rarch_joypad_driver_t* const g_joydriver = &ios_joypad;
|
||||
|
||||
static const struct rarch_key_map rarch_key_map_hidusage[];
|
||||
|
||||
// Key event data, called in main.m
|
||||
#define MAX_KEY_EVENTS 32
|
||||
|
||||
static struct
|
||||
{
|
||||
bool down;
|
||||
unsigned keycode;
|
||||
uint32_t character;
|
||||
uint16_t modifiers;
|
||||
} g_key_events[MAX_KEY_EVENTS];
|
||||
static int g_pending_key_events;
|
||||
|
||||
void ios_add_key_event(bool down, unsigned keycode, uint32_t character, uint16_t keyModifiers)
|
||||
{
|
||||
if (!g_extern.system.key_event)
|
||||
return;
|
||||
|
||||
if (g_pending_key_events == MAX_KEY_EVENTS)
|
||||
{
|
||||
RARCH_LOG("Key event buffer overlow");
|
||||
return;
|
||||
}
|
||||
|
||||
g_key_events[g_pending_key_events].down = down;
|
||||
g_key_events[g_pending_key_events].keycode = keycode;
|
||||
g_key_events[g_pending_key_events].character = character;
|
||||
g_key_events[g_pending_key_events].modifiers = keyModifiers;
|
||||
g_pending_key_events ++;
|
||||
}
|
||||
|
||||
// Non-exported helpers
|
||||
static bool ios_key_pressed(enum retro_key key)
|
||||
{
|
||||
@ -42,11 +72,24 @@ static bool ios_is_pressed(unsigned port_num, const struct retro_keybind *key)
|
||||
static void *ios_input_init(void)
|
||||
{
|
||||
input_init_keyboard_lut(rarch_key_map_hidusage);
|
||||
g_pending_key_events = 0;
|
||||
return (void*)-1;
|
||||
}
|
||||
|
||||
static void ios_input_poll(void *data)
|
||||
{
|
||||
if (g_extern.system.key_event)
|
||||
{
|
||||
for (int i = 0; i < g_pending_key_events; i ++)
|
||||
{
|
||||
const enum retro_key keycode = input_translate_keysym_to_rk(g_key_events[i].keycode);
|
||||
g_extern.system.key_event(g_key_events[i].down, keycode, g_key_events[i].character, g_key_events[i].modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
g_pending_key_events = 0;
|
||||
|
||||
|
||||
for (int i = 0; i != ios_touch_count; i ++)
|
||||
{
|
||||
input_translate_coord_viewport(ios_touch_list[i].screen_x, ios_touch_list[i].screen_y,
|
||||
|
@ -32,4 +32,6 @@ extern uint32_t ios_key_list[MAX_KEYS];
|
||||
extern uint32_t ios_touch_count;
|
||||
extern touch_data_t ios_touch_list[MAX_TOUCHES];
|
||||
|
||||
#endif
|
||||
void ios_add_key_event(bool down, unsigned keycode, uint32_t character, uint16_t keyModifiers);
|
||||
|
||||
#endif
|
||||
|
@ -16,11 +16,12 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
#include "input/ios_input.h"
|
||||
|
||||
#define GSEVENT_TYPE 2
|
||||
#define GSEVENT_FLAGS 12
|
||||
#define GSEVENTKEY_KEYCODE 15
|
||||
#define GSEVENT_TYPE_KEYDOWN 10
|
||||
#define GSEVENT_TYPE_KEYUP 11
|
||||
#define GSEVENT_MOD_SHIFT = (1 << 17)
|
||||
#define GSEVENT_MOD_CTRL = (1 << 18)
|
||||
#define GSEVENT_MOD_ALT = (1 << 19)
|
||||
#define GSEVENT_MOD_CMD = (1 << 20)
|
||||
|
||||
uint32_t ios_key_list[MAX_KEYS];
|
||||
uint32_t ios_touch_count;
|
||||
@ -58,19 +59,24 @@ touch_data_t ios_touch_list[MAX_TOUCHES];
|
||||
// Stolen from: http://nacho4d-nacho4d.blogspot.com/2012/01/catching-keyboard-events-in-ios.html
|
||||
else if ([event respondsToSelector:@selector(_gsEvent)])
|
||||
{
|
||||
int* eventMem = (int *)(void*)CFBridgingRetain([event performSelector:@selector(_gsEvent)]);
|
||||
int eventType = eventMem ? eventMem[GSEVENT_TYPE] : 0;
|
||||
uint8_t* eventMem = (uint8_t*)(void*)CFBridgingRetain([event performSelector:@selector(_gsEvent)]);
|
||||
int eventType = eventMem ? *(int*)&eventMem[8] : 0;
|
||||
|
||||
printf("%d\n", eventType);
|
||||
|
||||
if (eventMem && (eventType == GSEVENT_TYPE_KEYDOWN || eventType == GSEVENT_TYPE_KEYUP))
|
||||
if (eventType == GSEVENT_TYPE_KEYDOWN || eventType == GSEVENT_TYPE_KEYUP)
|
||||
{
|
||||
// Read keycode from GSEventKey
|
||||
int tmp = eventMem[GSEVENTKEY_KEYCODE];
|
||||
UniChar *keycode = (UniChar *)&tmp;
|
||||
|
||||
if (keycode[0] < MAX_KEYS)
|
||||
ios_key_list[keycode[0]] = (eventType == GSEVENT_TYPE_KEYDOWN) ? 1 : 0;
|
||||
uint16_t* data = (uint16_t*)&eventMem[0x3C];
|
||||
|
||||
if (data[0] < MAX_KEYS)
|
||||
ios_key_list[data[0]] = (eventType == GSEVENT_TYPE_KEYDOWN) ? 1 : 0;
|
||||
|
||||
// HACK: These line up for now
|
||||
const uint32_t mods = (*(uint32_t*)&eventMem[0x30] >> 17) & 0xF;
|
||||
ios_add_key_event(eventType == GSEVENT_TYPE_KEYDOWN, data[0], data[1], mods);
|
||||
// printf("%d %d %d %08X\n", data[0], data[1], data[2], *(uint32_t*)&eventMem[0x30]);
|
||||
}
|
||||
|
||||
|
||||
CFBridgingRelease(eventMem);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user