(iOS) Add keyboard character callback support.

This commit is contained in:
meancoot 2013-03-29 20:00:42 -04:00
parent b4fc13b0cc
commit 2e4846cb43
3 changed files with 65 additions and 14 deletions

View File

@ -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,

View File

@ -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

View File

@ -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);
}
}