diff --git a/apple/OSX/RetroArch-Info.plist b/apple/OSX/RetroArch-Info.plist
index c1254a5bcc..9567e1f6c0 100644
--- a/apple/OSX/RetroArch-Info.plist
+++ b/apple/OSX/RetroArch-Info.plist
@@ -42,6 +42,6 @@
NSMainNibFile
MainMenu
NSPrincipalClass
- NSApplication
+ RApplication
diff --git a/apple/RetroArch/RAGameView.m b/apple/RetroArch/RAGameView.m
index 8f05fee13a..8a95ace709 100644
--- a/apple/RetroArch/RAGameView.m
+++ b/apple/RetroArch/RAGameView.m
@@ -81,6 +81,16 @@ static float g_screen_scale = 1.0f;
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
+// Stop the annoying sound when pressing a key
+- (BOOL)acceptsFirstResponder
+{
+ return YES;
+}
+
+- (void)keyDown:(NSEvent*)theEvent
+{
+}
+
#elif defined(IOS) // < iOS Pause menu and lifecycle
- (id)init
{
diff --git a/apple/iOS/input/ios_input.c b/apple/RetroArch/apple_input.c
similarity index 83%
rename from apple/iOS/input/ios_input.c
rename to apple/RetroArch/apple_input.c
index b4b8fab049..93524d5cbb 100644
--- a/apple/iOS/input/ios_input.c
+++ b/apple/RetroArch/apple_input.c
@@ -18,18 +18,39 @@
#include
#include "input/input_common.h"
-#include "ios_input.h"
+#include "apple_input.h"
#include "general.h"
#include "driver.h"
+#ifdef IOS
extern const rarch_joypad_driver_t ios_joypad;
static const rarch_joypad_driver_t* const g_joydriver = &ios_joypad;
+#else
+static const rarch_joypad_driver_t* const g_joydriver = 0;
+#endif
-ios_input_data_t g_current_input_data;
-ios_input_data_t g_polled_input_data;
+apple_input_data_t g_current_input_data;
+apple_input_data_t g_polled_input_data;
static const struct rarch_key_map rarch_key_map_hidusage[];
+#ifdef OSX // Taken from https://github.com/depp/keycode, check keycode.h for license
+const unsigned char MAC_NATIVE_TO_HID[128] = {
+ 4, 22, 7, 9, 11, 10, 29, 27, 6, 25,255, 5, 20, 26, 8, 21,
+ 28, 23, 30, 31, 32, 33, 35, 34, 46, 38, 36, 45, 37, 39, 48, 18,
+ 24, 47, 12, 19, 40, 15, 13, 52, 14, 51, 49, 54, 56, 17, 16, 55,
+ 43, 44, 53, 42,255, 41,231,227,225, 57,226,224,229,230,228,255,
+108, 99,255, 85,255, 87,255, 83,255,255,255, 84, 88,255, 86,109,
+110,103, 98, 89, 90, 91, 92, 93, 94, 95,111, 96, 97,255,255,255,
+ 62, 63, 64, 60, 65, 66,255, 68,255,104,107,105,255, 67,255, 69,
+255,106,117, 74, 75, 76, 61, 77, 59, 78, 58, 80, 79, 81, 82,255
+};
+
+#define HIDKEY(X) (X < 128) ? MAC_NATIVE_TO_HID[X] : 0
+#else
+#define HIDKEY(X) X
+#endif
+
// Main thread interface
static bool icade_enabled;
static uint32_t icade_buttons;
@@ -63,14 +84,16 @@ static void handle_icade_event(unsigned keycode)
}
}
-void ios_input_enable_icade(bool on)
+void apple_input_enable_icade(bool on)
{
icade_enabled = on;
icade_buttons = 0;
}
-void ios_input_handle_key_event(unsigned keycode, bool down)
+void apple_input_handle_key_event(unsigned keycode, bool down)
{
+ keycode = HIDKEY(keycode);
+
if (icade_enabled)
handle_icade_event(keycode);
else if (keycode < MAX_KEYS)
@@ -78,7 +101,7 @@ void ios_input_handle_key_event(unsigned keycode, bool down)
}
// Game thread interface
-static bool ios_key_pressed(enum retro_key key)
+static bool apple_key_pressed(enum retro_key key)
{
if ((int)key >= 0 && key < RETROK_LAST)
return g_polled_input_data.keys[input_translate_rk_to_keysym(key)];
@@ -86,23 +109,23 @@ static bool ios_key_pressed(enum retro_key key)
return false;
}
-static bool ios_is_pressed(unsigned port_num, const struct retro_keybind *binds, unsigned key)
+static bool apple_is_pressed(unsigned port_num, const struct retro_keybind *binds, unsigned key)
{
- return ios_key_pressed(binds[key].key) || input_joypad_pressed(g_joydriver, port_num, binds, key);
+ return apple_key_pressed(binds[key].key) || input_joypad_pressed(g_joydriver, port_num, binds, key);
}
// Exported input driver
-static void *ios_input_init(void)
+static void *apple_input_init(void)
{
input_init_keyboard_lut(rarch_key_map_hidusage);
memset(&g_polled_input_data, 0, sizeof(g_polled_input_data));
return (void*)-1;
}
-static void ios_input_poll(void *data)
+static void apple_input_poll(void *data)
{
dispatch_sync(dispatch_get_main_queue(), ^{
- memcpy(&g_polled_input_data, &g_current_input_data, sizeof(ios_input_data_t));
+ memcpy(&g_polled_input_data, &g_current_input_data, sizeof(apple_input_data_t));
for (int i = 0; i != g_polled_input_data.touch_count; i ++)
{
@@ -115,18 +138,18 @@ static void ios_input_poll(void *data)
});
}
-static int16_t ios_input_state(void *data, const struct retro_keybind **binds, unsigned port, unsigned device, unsigned index, unsigned id)
+static int16_t apple_input_state(void *data, const struct retro_keybind **binds, unsigned port, unsigned device, unsigned index, unsigned id)
{
switch (device)
{
case RETRO_DEVICE_JOYPAD:
- return (id < RARCH_BIND_LIST_END) ? ios_is_pressed(port, binds[port], id) : false;
+ return (id < RARCH_BIND_LIST_END) ? apple_is_pressed(port, binds[port], id) : false;
case RETRO_DEVICE_ANALOG:
return input_joypad_analog(g_joydriver, port, index, id, binds[port]);
case RETRO_DEVICE_KEYBOARD:
- return ios_key_pressed(id);
+ return apple_key_pressed(id);
case RETRO_DEVICE_POINTER:
case RARCH_DEVICE_POINTER_SCREEN:
@@ -135,7 +158,7 @@ static int16_t ios_input_state(void *data, const struct retro_keybind **binds, u
if (index < g_polled_input_data.touch_count && index < MAX_TOUCHES)
{
- const ios_touch_data_t* touch = &g_polled_input_data.touches[index];
+ const apple_touch_data_t* touch = &g_polled_input_data.touches[index];
switch (id)
{
@@ -153,22 +176,23 @@ static int16_t ios_input_state(void *data, const struct retro_keybind **binds, u
}
}
-static bool ios_bind_button_pressed(void *data, int key)
+static bool apple_bind_button_pressed(void *data, int key)
{
const struct retro_keybind *binds = g_settings.input.binds[0];
- return (key >= 0 && key < RARCH_BIND_LIST_END) ? ios_is_pressed(0, binds, key) : false;
+ return (key >= 0 && key < RARCH_BIND_LIST_END) ? apple_is_pressed(0, binds, key) : false;
}
-static void ios_input_free_input(void *data)
+static void apple_input_free_input(void *data)
{
(void)data;
}
-static void ios_input_set_keybinds(void *data, unsigned device, unsigned port,
+static void apple_input_set_keybinds(void *data, unsigned device, unsigned port,
unsigned id, unsigned keybind_action)
{
(void)device;
+#ifdef IOS
if (keybind_action & (1ULL << KEYBINDS_ACTION_SET_DEFAULT_BINDS))
{
switch (device)
@@ -221,16 +245,17 @@ static void ios_input_set_keybinds(void *data, unsigned device, unsigned port,
break;
}
}
+#endif
}
-const input_driver_t input_ios = {
- ios_input_init,
- ios_input_poll,
- ios_input_state,
- ios_bind_button_pressed,
- ios_input_free_input,
- ios_input_set_keybinds,
- "ios_input",
+const input_driver_t input_apple = {
+ apple_input_init,
+ apple_input_poll,
+ apple_input_state,
+ apple_bind_button_pressed,
+ apple_input_free_input,
+ apple_input_set_keybinds,
+ "apple_input",
};
diff --git a/apple/iOS/input/ios_input.h b/apple/RetroArch/apple_input.h
similarity index 73%
rename from apple/iOS/input/ios_input.h
rename to apple/RetroArch/apple_input.h
index e21a9c2d57..bbecb639fd 100644
--- a/apple/iOS/input/ios_input.h
+++ b/apple/RetroArch/apple_input.h
@@ -13,8 +13,8 @@
* If not, see .
*/
-#ifndef __IOS_RARCH_INPUT_H__
-#define __IOS_RARCH_INPUT_H__
+#ifndef __APPLE_RARCH_INPUT_H__
+#define __APPLE_RARCH_INPUT_H__
// Input responder
#define MAX_TOUCHES 16
@@ -26,24 +26,24 @@ typedef struct
int16_t screen_x, screen_y;
int16_t fixed_x, fixed_y;
int16_t full_x, full_y;
-} ios_touch_data_t;
+} apple_touch_data_t;
typedef struct
{
- ios_touch_data_t touches[MAX_TOUCHES];
+ apple_touch_data_t touches[MAX_TOUCHES];
uint32_t touch_count;
uint32_t keys[MAX_KEYS];
uint32_t pad_buttons[MAX_PADS];
int16_t pad_axis[MAX_PADS][4];
-} ios_input_data_t;
+} apple_input_data_t;
-extern ios_input_data_t g_current_input_data; //< Main thread data
-extern ios_input_data_t g_polled_input_data; //< Game thread data
+extern apple_input_data_t g_current_input_data; //< Main thread data
+extern apple_input_data_t g_polled_input_data; //< Game thread data
// Main thread only
-void ios_input_enable_icade(bool on);
-void ios_input_handle_key_event(unsigned keycode, bool down);
+void apple_input_enable_icade(bool on);
+void apple_input_handle_key_event(unsigned keycode, bool down);
#endif
diff --git a/apple/iOS/input/keycode.h b/apple/RetroArch/keycode.h
similarity index 100%
rename from apple/iOS/input/keycode.h
rename to apple/RetroArch/keycode.h
diff --git a/apple/RetroArch/main.m b/apple/RetroArch/main.m
index 93eceef101..47fcb180c9 100644
--- a/apple/RetroArch/main.m
+++ b/apple/RetroArch/main.m
@@ -19,10 +19,10 @@
#import "RetroArch_Apple.h"
#include "rarch_wrapper.h"
+#include "apple_input.h"
+
#ifdef IOS
#import "views.h"
-#include "../iOS/input/ios_input.h"
-#include "../iOS/input/keycode.h"
#include "../iOS/input/BTStack/btpad.h"
#include "../iOS/input/BTStack/btdynamic.h"
#include "../iOS/input/BTStack/btpad.h"
@@ -30,6 +30,9 @@
#include "file.h"
+#define GSEVENT_TYPE_KEYDOWN 10
+#define GSEVENT_TYPE_KEYUP 11
+
//#define HAVE_DEBUG_FILELOG
static bool use_tv_mode;
@@ -179,9 +182,6 @@ static void handle_touch_event(NSArray* touches)
@implementation RApplication
-#define GSEVENT_TYPE_KEYDOWN 10
-#define GSEVENT_TYPE_KEYUP 11
-
- (void)sendEvent:(UIEvent *)event
{
[super sendEvent:event];
@@ -195,7 +195,7 @@ static void handle_touch_event(NSArray* touches)
int eventType = eventMem ? *(int*)&eventMem[8] : 0;
if (eventType == GSEVENT_TYPE_KEYDOWN || eventType == GSEVENT_TYPE_KEYUP)
- ios_input_handle_key_event(*(uint16_t*)&eventMem[0x3C], eventType == GSEVENT_TYPE_KEYDOWN);
+ apple_input_handle_key_event(*(uint16_t*)&eventMem[0x3C], eventType == GSEVENT_TYPE_KEYDOWN);
CFBridgingRelease(eventMem);
}
@@ -389,7 +389,7 @@ int main(int argc, char *argv[])
//
bool val;
- ios_input_enable_icade(config_get_bool(conf, "ios_use_icade", &val) && val);
+ apple_input_enable_icade(config_get_bool(conf, "ios_use_icade", &val) && val);
btstack_set_poweron(config_get_bool(conf, "ios_use_btstack", &val) && val);
use_tv_mode = config_get_bool(conf, "ios_tv_mode", & val) && val;
@@ -473,6 +473,21 @@ int main(int argc, char *argv[])
#pragma mark OSX
#ifdef OSX
+@interface RApplication : NSApplication
+@end
+
+@implementation RApplication
+
+- (void)sendEvent:(NSEvent *)event
+{
+ [super sendEvent:event];
+
+ if (event.type == GSEVENT_TYPE_KEYDOWN || event.type == GSEVENT_TYPE_KEYUP)
+ apple_input_handle_key_event(event.keyCode, event.type == GSEVENT_TYPE_KEYDOWN);
+}
+
+@end
+
@implementation RetroArch_OSX
+ (RetroArch_OSX*)get
{
@@ -492,7 +507,9 @@ int main(int argc, char *argv[])
[window.contentView setAutoresizesSubviews:YES];
RAGameView.get.frame = [window.contentView bounds];
- [window.contentView addSubview:RAGameView.get];
+ [window.contentView addSubview:RAGameView.get];
+
+ [window makeFirstResponder:RAGameView.get];
}
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
diff --git a/apple/RetroArch_OSX.xcodeproj/project.pbxproj b/apple/RetroArch_OSX.xcodeproj/project.pbxproj
index 5415abdf37..0ef357020a 100644
--- a/apple/RetroArch_OSX.xcodeproj/project.pbxproj
+++ b/apple/RetroArch_OSX.xcodeproj/project.pbxproj
@@ -277,7 +277,6 @@
"-DHAVE_ZLIB",
"-DWANT_MINIZ",
"-DSINC_LOWER_QUALITY",
- "-DHAVE_NULLINPUT",
);
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
@@ -333,7 +332,6 @@
"-DHAVE_ZLIB",
"-DWANT_MINIZ",
"-DSINC_LOWER_QUALITY",
- "-DHAVE_NULLINPUT",
);
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
diff --git a/apple/iOS/input/ios_joypad.c b/apple/iOS/input/ios_joypad.c
index 16211912bf..cc850e1496 100644
--- a/apple/iOS/input/ios_joypad.c
+++ b/apple/iOS/input/ios_joypad.c
@@ -14,7 +14,7 @@
*/
#include "input/input_common.h"
-#include "ios_input.h"
+#include "../../RetroArch/apple_input.h"
#include "BTStack/btpad.h"
#include "general.h"
diff --git a/apple/iOS/settings.m b/apple/iOS/settings.m
index acb2a53d9b..aac804486f 100644
--- a/apple/iOS/settings.m
+++ b/apple/iOS/settings.m
@@ -16,8 +16,8 @@
#import "../RetroArch/RetroArch_Apple.h"
#import "views.h"
-#include "input/ios_input.h"
-#include "input/keycode.h"
+#include "../RetroArch/apple_input.h"
+#include "../RetroArch/keycode.h"
#include "input/BTStack/btdynamic.h"
#include "input/BTStack/btpad.h"
diff --git a/config.def.h b/config.def.h
index 2df9370f1b..8535160b1b 100644
--- a/config.def.h
+++ b/config.def.h
@@ -73,7 +73,7 @@ enum
INPUT_WII,
INPUT_XINPUT,
INPUT_LINUXRAW,
- INPUT_IOS,
+ INPUT_APPLE,
INPUT_QNX,
INPUT_NULL
};
@@ -160,8 +160,8 @@ enum
#define INPUT_DEFAULT_DRIVER INPUT_WII
#elif defined(HAVE_XVIDEO)
#define INPUT_DEFAULT_DRIVER INPUT_X
-#elif defined(IOS)
-#define INPUT_DEFAULT_DRIVER INPUT_IOS
+#elif defined(IOS) || defined(OSX)
+#define INPUT_DEFAULT_DRIVER INPUT_APPLE
#elif defined(__BLACKBERRY_QNX__)
#define INPUT_DEFAULT_DRIVER INPUT_QNX
#else
diff --git a/driver.c b/driver.c
index 1df27f5d99..790e23e1f6 100644
--- a/driver.c
+++ b/driver.c
@@ -155,8 +155,8 @@ static const input_driver_t *input_drivers[] = {
#if defined(__linux__) && !defined(ANDROID)
&input_linuxraw,
#endif
-#ifdef IOS
- &input_ios,
+#if defined(IOS) || defined(OSX) //< Don't use __APPLE__ as it breaks basic SDL builds
+ &input_apple,
#endif
#ifdef __BLACKBERRY_QNX__
&input_qnx,
diff --git a/driver.h b/driver.h
index 6c72137ea6..f29ec720e2 100644
--- a/driver.h
+++ b/driver.h
@@ -525,7 +525,7 @@ extern const input_driver_t input_xenon360;
extern const input_driver_t input_gx;
extern const input_driver_t input_xinput;
extern const input_driver_t input_linuxraw;
-extern const input_driver_t input_ios;
+extern const input_driver_t input_apple;
extern const input_driver_t input_qnx;
extern const input_driver_t input_null;
diff --git a/griffin/griffin.c b/griffin/griffin.c
index f8d2584b3e..324223cb40 100644
--- a/griffin/griffin.c
+++ b/griffin/griffin.c
@@ -254,8 +254,9 @@ INPUT
#elif defined(ANDROID)
#include "../android/native/jni/input_autodetect.c"
#include "../android/native/jni/input_android.c"
-#elif defined(IOS)
-#include "../apple/iOS/input/ios_input.c"
+#elif defined(IOS) || defined(OSX)
+#include "../apple/RetroArch/apple_input.c"
+#ifdef IOS
#include "../apple/iOS/input/ios_joypad.c"
#include "../apple/iOS/input/BTStack/btdynamic.c"
#include "../apple/iOS/input/BTStack/wiimote.c"
@@ -263,6 +264,7 @@ INPUT
#include "../apple/iOS/input/BTStack/btpad_ps3.c"
#include "../apple/iOS/input/BTStack/btpad_wii.c"
#include "../apple/iOS/input/BTStack/btpad_queue.c"
+#endif
#elif defined(__BLACKBERRY_QNX__)
#include "../blackberry-qnx/qnx_input.c"
#endif
diff --git a/settings.c b/settings.c
index bf841401a4..1c6d656016 100644
--- a/settings.c
+++ b/settings.c
@@ -131,8 +131,8 @@ const char *config_get_default_input(void)
return "gx";
case INPUT_LINUXRAW:
return "linuxraw";
- case INPUT_IOS:
- return "ios_input";
+ case INPUT_APPLE:
+ return "apple_input";
case INPUT_QNX:
return "qnx_input";
case INPUT_NULL: