From 33241abad2f8b827342f253427b67e2e7a82f218 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2012 16:05:07 +0100 Subject: [PATCH 1/5] (Android) Pass source to setup_keycode_lut too --- android/native/jni/input_android.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/android/native/jni/input_android.c b/android/native/jni/input_android.c index 64a38c326a..3f59dbe36d 100644 --- a/android/native/jni/input_android.c +++ b/android/native/jni/input_android.c @@ -114,7 +114,7 @@ static void get_device_name(char *buf, size_t size, int id) (*vm)->DetachCurrentThread(vm); } -static void setup_keycode_lut(unsigned port, unsigned id) +static void setup_keycode_lut(unsigned port, unsigned id, int source) { char msg[128]; msg[0] = 0; @@ -388,13 +388,22 @@ static void setup_keycode_lut(unsigned port, unsigned id) RARCH_LOG("Device %d: %s, port: %d.\n", id, name_buf, port); + unsigned timeout_val = 30; + if (msg[0] == 0) { - snprintf(msg, sizeof(msg), "HID [%s] unbound.\n", name_buf); - msg_queue_push(g_extern.msg_queue, msg, 0, 120); + if (source == AINPUT_SOURCE_TOUCHSCREEN) + snprintf(msg, sizeof(msg), "RetroPad #%d is: Touchscreen.\n", port); + else if (source == AINPUT_SOURCE_MOUSE) + snprintf(msg, sizeof(msg), "RetroPad #%d is: Mouse.\n", port); + else if (source == AINPUT_SOURCE_KEYBOARD) + snprintf(msg, sizeof(msg), "RetroPad #%d is: Keyboard.\n", port); + else + snprintf(msg, sizeof(msg), "HID [%s] unbound.\n", name_buf); + timeout_val = 120; } - else - msg_queue_push(g_extern.msg_queue, msg, 0, 30); + + msg_queue_push(g_extern.msg_queue, msg, 0, timeout_val); } static void *android_input_init(void) @@ -470,7 +479,7 @@ static void android_input_poll(void *data) if(state_id == -1) { state_id = state_device_ids[id] = pads_connected++; - setup_keycode_lut(state_id, id); + setup_keycode_lut(state_id, id, source); } int action = 0; From ef42f6b58cce8d2f5259ddfc8b399c4f1eb41a0c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2012 16:07:11 +0100 Subject: [PATCH 2/5] (Android) Don't push message to queue if message is empty --- android/native/jni/input_android.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/native/jni/input_android.c b/android/native/jni/input_android.c index 3f59dbe36d..173da20d69 100644 --- a/android/native/jni/input_android.c +++ b/android/native/jni/input_android.c @@ -403,7 +403,8 @@ static void setup_keycode_lut(unsigned port, unsigned id, int source) timeout_val = 120; } - msg_queue_push(g_extern.msg_queue, msg, 0, timeout_val); + if (msg[0] != 0) + msg_queue_push(g_extern.msg_queue, msg, 0, timeout_val); } static void *android_input_init(void) From 7855a25502717a370abec347d7a45c873a359cc7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2012 16:36:28 +0100 Subject: [PATCH 3/5] (Android) Can now grab current IME string from Java and pass it to native --- android/native/jni/main.c | 8 ++++++++ .../phoenix/src/org/retroarch/browser/ModuleActivity.java | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/android/native/jni/main.c b/android/native/jni/main.c index 3c65803094..480d086b0a 100644 --- a/android/native/jni/main.c +++ b/android/native/jni/main.c @@ -249,6 +249,7 @@ static int android_app_set_argv(char** argv) char rom_path[PATH_MAX]; char libretro_path[PATH_MAX]; char config_file[PATH_MAX]; + char current_ime[PATH_MAX]; struct jni_params in_params; struct jni_out_params_char out_args; @@ -289,6 +290,12 @@ static int android_app_set_argv(char** argv) strlcpy(out_args.in, "CONFIGFILE", sizeof(out_args.in)); jni_get(&in_params, &out_args); + // Current IME + out_args.out = current_ime; + out_args.out_sizeof = sizeof(current_ime); + strlcpy(out_args.in, "IME", sizeof(out_args.in)); + jni_get(&in_params, &out_args); + (*in_params.java_vm)->DetachCurrentThread(in_params.java_vm); @@ -297,6 +304,7 @@ static int android_app_set_argv(char** argv) RARCH_LOG("Libretro path: [%s].\n", libretro_path); RARCH_LOG("Display Refresh rate: %.2f Hz.\n", refreshrate); RARCH_LOG("Config file: [%s].\n", config_file); + RARCH_LOG("Current IME: [%s].\n", current_ime); int argc = 0; diff --git a/android/phoenix/src/org/retroarch/browser/ModuleActivity.java b/android/phoenix/src/org/retroarch/browser/ModuleActivity.java index 1329fbfabf..ae96a33f33 100644 --- a/android/phoenix/src/org/retroarch/browser/ModuleActivity.java +++ b/android/phoenix/src/org/retroarch/browser/ModuleActivity.java @@ -7,6 +7,7 @@ import java.io.*; import android.content.*; import android.app.*; import android.os.*; +import android.provider.Settings; import android.widget.*; import android.view.*; import android.view.inputmethod.*; @@ -48,7 +49,7 @@ public class ModuleActivity extends Activity implements AdapterView.OnItemClickL static private final int ACTIVITY_LOAD_ROM = 0; static private String libretro_path; - public float getRefreshRate() + private final float getRefreshRate() { final WindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE); final Display display = wm.getDefaultDisplay(); @@ -107,12 +108,14 @@ public class ModuleActivity extends Activity implements AdapterView.OnItemClickL case ACTIVITY_LOAD_ROM: if(data.getStringExtra("PATH") != null) { + String current_ime = Settings.Secure.getString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); Toast.makeText(this, "Loading: ["+ data.getStringExtra("PATH") + "]...", Toast.LENGTH_SHORT).show(); myIntent = new Intent(this, NativeActivity.class); myIntent.putExtra("ROM", data.getStringExtra("PATH")); myIntent.putExtra("LIBRETRO", libretro_path); myIntent.putExtra("REFRESHRATE", Float.toString(getRefreshRate())); myIntent.putExtra("CONFIGFILE", ""); + myIntent.putExtra("IME", current_ime); startActivity(myIntent); } break; From 9f361de651c702238ecb9265b2a95f1271b92326 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2012 17:39:04 +0100 Subject: [PATCH 4/5] (Android) Autoconfigures IME app ccpcreations Wiimote pad 1 now --- android/native/jni/android_general.h | 4 +- android/native/jni/input_android.c | 113 ++++++++++++++++----------- android/native/jni/main.c | 7 +- 3 files changed, 71 insertions(+), 53 deletions(-) diff --git a/android/native/jni/android_general.h b/android/native/jni/android_general.h index a358f5692f..1522165218 100644 --- a/android/native/jni/android_general.h +++ b/android/native/jni/android_general.h @@ -23,11 +23,9 @@ struct droid { struct android_app* app; - unsigned width; - unsigned height; bool window_ready; float disp_refresh_rate; - jobject class_loader_obj; + char current_ime[PATH_MAX]; }; extern struct droid g_android; diff --git a/android/native/jni/input_android.c b/android/native/jni/input_android.c index 173da20d69..9a21ecaeaf 100644 --- a/android/native/jni/input_android.c +++ b/android/native/jni/input_android.c @@ -116,8 +116,12 @@ static void get_device_name(char *buf, size_t size, int id) static void setup_keycode_lut(unsigned port, unsigned id, int source) { + // Hack - we have to add '1' to the bit mask here because + // RETRO_DEVICE_ID_JOYPAD_B is 0 + char msg[128]; - msg[0] = 0; + char name_buf[256]; + msg[0] = name_buf[0] = 0; if (port > MAX_PADS) { @@ -126,18 +130,68 @@ static void setup_keycode_lut(unsigned port, unsigned id, int source) return; } - char name_buf[256]; - - g_settings.input.dpad_emulation[port] = DPAD_EMULATION_LSTICK; - - get_device_name(name_buf, sizeof(name_buf), id); - /* eight 8-bit values are packed into one uint64_t * one for each of the 8 pads */ uint8_t shift = 8 + (port * 8); - // Hack - we have to add '1' to the bit mask here because - // RETRO_DEVICE_ID_JOYPAD_B is 0 + g_settings.input.dpad_emulation[port] = DPAD_EMULATION_LSTICK; + + char *current_ime = g_android.current_ime; + + if (strstr(current_ime, "com.ccpcreations.android.WiiUseAndroid")) + { + // Player 1 + switch (port) + { + case 0: + snprintf(msg, sizeof(msg), "RetroPad #%d is: Wiimote (IME).\n", port); + snprintf(name_buf, sizeof(name_buf), "ccpcreations WiiUse"); + g_settings.input.dpad_emulation[port] = DPAD_EMULATION_NONE; + keycode_lut[AKEYCODE_DPAD_UP] |= ((RETRO_DEVICE_ID_JOYPAD_UP+1) << shift); + keycode_lut[AKEYCODE_DPAD_DOWN] |= ((RETRO_DEVICE_ID_JOYPAD_DOWN+1) << shift); + keycode_lut[AKEYCODE_DPAD_LEFT] |= ((RETRO_DEVICE_ID_JOYPAD_LEFT+1) << shift); + keycode_lut[AKEYCODE_DPAD_RIGHT]|= ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1) << shift); + keycode_lut[AKEYCODE_1] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift); + keycode_lut[AKEYCODE_2] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift); + keycode_lut[AKEYCODE_3] |= ((RETRO_DEVICE_ID_JOYPAD_UP+1) << shift); + keycode_lut[AKEYCODE_4] |= ((RETRO_DEVICE_ID_JOYPAD_DOWN+1) << shift); + keycode_lut[AKEYCODE_5] |= ((RETRO_DEVICE_ID_JOYPAD_LEFT+1) << shift); + keycode_lut[AKEYCODE_6] |= ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1) << shift); + keycode_lut[AKEYCODE_M] |= ((RETRO_DEVICE_ID_JOYPAD_SELECT+1) << shift); + keycode_lut[AKEYCODE_P] |= ((RETRO_DEVICE_ID_JOYPAD_START+1) << shift); + keycode_lut[AKEYCODE_E] |= ((RETRO_DEVICE_ID_JOYPAD_Y+1) << shift); + keycode_lut[AKEYCODE_B] |= ((RETRO_DEVICE_ID_JOYPAD_X+1) << shift); + keycode_lut[AKEYCODE_F] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift); + keycode_lut[AKEYCODE_G] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift); + keycode_lut[AKEYCODE_C] |= ((RETRO_DEVICE_ID_JOYPAD_L+1) << shift); + keycode_lut[AKEYCODE_LEFT_BRACKET] |= ((RETRO_DEVICE_ID_JOYPAD_L2+1) << shift); + keycode_lut[AKEYCODE_RIGHT_BRACKET] |= ((RETRO_DEVICE_ID_JOYPAD_R2+1) << shift); + keycode_lut[AKEYCODE_Z] |= ((RETRO_DEVICE_ID_JOYPAD_R+1) << shift); + keycode_lut[AKEYCODE_H] |= ((RARCH_RESET+1) << shift); + keycode_lut[AKEYCODE_W] |= ((RETRO_DEVICE_ID_JOYPAD_UP+1) << shift); + keycode_lut[AKEYCODE_S] |= ((RETRO_DEVICE_ID_JOYPAD_DOWN+1) << shift); + keycode_lut[AKEYCODE_A] |= ((RETRO_DEVICE_ID_JOYPAD_LEFT+1) << shift); + keycode_lut[AKEYCODE_D] |= ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1) << shift); + keycode_lut[AKEYCODE_C] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift); + keycode_lut[AKEYCODE_Z] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift); + + case 1: + case 2: + case 3: + case 4: + default: + break; + } + shift = 8; + for(int i = 0; i < MAX_PADS; i++) + { + keycode_lut[AKEYCODE_BACK] |= ((RARCH_QUIT_KEY+1) << shift); + shift += 8; + } + goto do_exit; + } + + get_device_name(name_buf, sizeof(name_buf), id); if (strstr(name_buf, "Logitech")) { @@ -158,41 +212,6 @@ static void setup_keycode_lut(unsigned port, unsigned id, int source) keycode_lut[AKEYCODE_BUTTON_12] |= ((RETRO_DEVICE_ID_JOYPAD_R3+1) << shift); } } - -#if 0 - // com.ccpcreations.android.WiiUseAndroid IME driver - - // Player 1 - - keycode_lut[AKEYCODE_DPAD_UP] |= ((RETRO_DEVICE_ID_JOYPAD_UP+1) << shift); - keycode_lut[AKEYCODE_DPAD_DOWN] |= ((RETRO_DEVICE_ID_JOYPAD_DOWN+1) << shift); - keycode_lut[AKEYCODE_DPAD_LEFT] |= ((RETRO_DEVICE_ID_JOYPAD_LEFT+1) << shift); - keycode_lut[AKEYCODE_DPAD_RIGHT]|= ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1) << shift); - keycode_lut[AKEYCODE_1] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift); - keycode_lut[AKEYCODE_2] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift); - keycode_lut[AKEYCODE_3] |= ((RETRO_DEVICE_ID_JOYPAD_UP+1) << shift); - keycode_lut[AKEYCODE_4] |= ((RETRO_DEVICE_ID_JOYPAD_DOWN+1) << shift); - keycode_lut[AKEYCODE_5] |= ((RETRO_DEVICE_ID_JOYPAD_LEFT+1) << shift); - keycode_lut[AKEYCODE_6] |= ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1) << shift); - keycode_lut[AKEYCODE_M] |= ((RETRO_DEVICE_ID_JOYPAD_SELECT+1) << shift); - keycode_lut[AKEYCODE_P] |= ((RETRO_DEVICE_ID_JOYPAD_START+1) << shift); - keycode_lut[AKEYCODE_E] |= ((RETRO_DEVICE_ID_JOYPAD_Y+1) << shift); - keycode_lut[AKEYCODE_B] |= ((RETRO_DEVICE_ID_JOYPAD_X+1) << shift); - keycode_lut[AKEYCODE_F] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift); - keycode_lut[AKEYCODE_G] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift); - keycode_lut[AKEYCODE_C] |= ((RETRO_DEVICE_ID_JOYPAD_L+1) << shift); - keycode_lut[AKEYCODE_LEFT_BRACKET] |= ((RETRO_DEVICE_ID_JOYPAD_L2+1) << shift); - keycode_lut[AKEYCODE_RIGHT_BRACKET] |= ((RETRO_DEVICE_ID_JOYPAD_R2+1) << shift); - keycode_lut[AKEYCODE_Z] |= ((RETRO_DEVICE_ID_JOYPAD_R+1) << shift); - keycode_lut[AKEYCODE_H] |= ((RARCH_RESET+1) << shift); - keycode_lut[AKEYCODE_W] |= ((RETRO_DEVICE_ID_JOYPAD_UP+1) << shift); - keycode_lut[AKEYCODE_S] |= ((RETRO_DEVICE_ID_JOYPAD_DOWN+1) << shift); - keycode_lut[AKEYCODE_A] |= ((RETRO_DEVICE_ID_JOYPAD_LEFT+1) << shift); - keycode_lut[AKEYCODE_D] |= ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1) << shift); - keycode_lut[AKEYCODE_C] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift); - keycode_lut[AKEYCODE_Z] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift); -#endif - else if (strstr(name_buf, "HuiJia USB GamePad")) { snprintf(msg, sizeof(msg), "RetroPad #%d is: HuiJia USB Gamepad.\n", port); @@ -386,7 +405,9 @@ static void setup_keycode_lut(unsigned port, unsigned id, int source) keycode_lut[AKEYCODE_ESCAPE] |= ((RARCH_QUIT_KEY+1) << shift); keycode_lut[AKEYCODE_BACK] |= ((RARCH_QUIT_KEY+1) << shift); - RARCH_LOG("Device %d: %s, port: %d.\n", id, name_buf, port); +do_exit: + if (name_buf[0] != 0) + RARCH_LOG("Device %d: %s, port: %d.\n", id, name_buf, port); unsigned timeout_val = 30; @@ -398,7 +419,7 @@ static void setup_keycode_lut(unsigned port, unsigned id, int source) snprintf(msg, sizeof(msg), "RetroPad #%d is: Mouse.\n", port); else if (source == AINPUT_SOURCE_KEYBOARD) snprintf(msg, sizeof(msg), "RetroPad #%d is: Keyboard.\n", port); - else + else if (name_buf[0] != 0) snprintf(msg, sizeof(msg), "HID [%s] unbound.\n", name_buf); timeout_val = 120; } diff --git a/android/native/jni/main.c b/android/native/jni/main.c index 480d086b0a..3d5fbed0db 100644 --- a/android/native/jni/main.c +++ b/android/native/jni/main.c @@ -249,7 +249,6 @@ static int android_app_set_argv(char** argv) char rom_path[PATH_MAX]; char libretro_path[PATH_MAX]; char config_file[PATH_MAX]; - char current_ime[PATH_MAX]; struct jni_params in_params; struct jni_out_params_char out_args; @@ -291,8 +290,8 @@ static int android_app_set_argv(char** argv) jni_get(&in_params, &out_args); // Current IME - out_args.out = current_ime; - out_args.out_sizeof = sizeof(current_ime); + out_args.out = g_android.current_ime; + out_args.out_sizeof = sizeof(g_android.current_ime); strlcpy(out_args.in, "IME", sizeof(out_args.in)); jni_get(&in_params, &out_args); @@ -304,7 +303,7 @@ static int android_app_set_argv(char** argv) RARCH_LOG("Libretro path: [%s].\n", libretro_path); RARCH_LOG("Display Refresh rate: %.2f Hz.\n", refreshrate); RARCH_LOG("Config file: [%s].\n", config_file); - RARCH_LOG("Current IME: [%s].\n", current_ime); + RARCH_LOG("Current IME: [%s].\n", g_android.current_ime); int argc = 0; From e2163317d700a0709d93b358e41269ae37c1f113 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 31 Dec 2012 17:50:47 +0100 Subject: [PATCH 5/5] (Android/RARCH_CONSOLE) Move DPAD_EMULATION enums to general.h - makes it easier from maintenance perspective --- android/native/jni/input_android.c | 8 -------- console/rarch_console_input.h | 8 -------- general.h | 10 +++++++++- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/android/native/jni/input_android.c b/android/native/jni/input_android.c index 9a21ecaeaf..1dd66bb7f1 100644 --- a/android/native/jni/input_android.c +++ b/android/native/jni/input_android.c @@ -26,14 +26,6 @@ #define MAX_PADS 8 #define MAX_TOUCH 8 -enum -{ - DPAD_EMULATION_NONE = 0, - DPAD_EMULATION_LSTICK, - DPAD_EMULATION_RSTICK, - DPAD_EMULATION_LAST -}; - enum { AKEYCODE_ESCAPE = 111, AKEYCODE_BREAK = 121, diff --git a/console/rarch_console_input.h b/console/rarch_console_input.h index 7fbf036f4e..51636a6ca8 100644 --- a/console/rarch_console_input.h +++ b/console/rarch_console_input.h @@ -27,14 +27,6 @@ enum keybind_set_id KEYBIND_DEFAULT }; -enum -{ - DPAD_EMULATION_NONE = 0, - DPAD_EMULATION_LSTICK, - DPAD_EMULATION_RSTICK, - DPAD_EMULATION_LAST -}; - extern uint64_t rarch_default_keybind_lut[RARCH_FIRST_META_KEY]; extern char rarch_default_libretro_keybind_name_lut[RARCH_FIRST_META_KEY][32]; extern char rarch_dpad_emulation_name_lut[KEYBIND_DEFAULT][32]; diff --git a/general.h b/general.h index afd2969832..292d87bebe 100644 --- a/general.h +++ b/general.h @@ -92,6 +92,14 @@ #define MAX_PLAYERS 8 +enum dpad_emu_enums +{ + DPAD_EMULATION_NONE = 0, + DPAD_EMULATION_LSTICK, + DPAD_EMULATION_RSTICK, + DPAD_EMULATION_LAST +}; + // All config related settings go here. struct settings { @@ -173,7 +181,7 @@ struct settings struct retro_keybind binds[MAX_PLAYERS][RARCH_BIND_LIST_END]; float axis_threshold; int joypad_map[MAX_PLAYERS]; - unsigned dpad_emulation[MAX_PLAYERS]; + enum dpad_emu_enums dpad_emulation[MAX_PLAYERS]; #ifdef RARCH_CONSOLE unsigned currently_selected_controller_no; unsigned map_dpad_to_stick;