diff --git a/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2JoystickCalibration.java b/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2JoystickCalibration.java index ad2bf04e..dc789fa4 100644 --- a/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2JoystickCalibration.java +++ b/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2JoystickCalibration.java @@ -91,10 +91,16 @@ public class Apple2JoystickCalibration implements Apple2MenuView { if (variant == Apple2SettingsMenu.TouchDeviceVariant.JOYSTICK) { final int x = ((int) (cxy & 0xFF00) >> 8) - 128; final int y = ((int) (cxy & 0x00FF) >> 0) - 128; - t = "X:" + x + " Y:" + y; + t = "X: " + x + " Y: " + y; } else { - char c = (char) ((cxy & 0xFF0000) >> 16); - t = "Key:" + c; + char ascii = (char) ((cxy & 0xFF000000) >> 24); + int scancode = (char) ((cxy & 0x00FF0000) >> 16); + + if (ascii == Apple2KeyboardSettingsMenu.ICONTEXT_NONACTION || scancode == 0) { + // ... + } else { + t = "Key: " + Apple2KeypadChooser.asciiRepresentation(mActivity, ascii); + } } final String axisText = t; diff --git a/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2KeyboardSettingsMenu.java b/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2KeyboardSettingsMenu.java index 0b2e297a..5e1f0a3e 100644 --- a/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2KeyboardSettingsMenu.java +++ b/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2KeyboardSettingsMenu.java @@ -29,6 +29,15 @@ public class Apple2KeyboardSettingsMenu extends Apple2AbstractMenu { private final static String TAG = "KeyboardSettingsMenu"; // These settings must match native side + public final static int kLT = 8; + public final static int kTAB = 9; + public final static int kDN = 10; + public final static int kUP = 11; + public final static int kRET = 13; + public final static int kRT = 21; + public final static int kESC = 27; + public final static int kDEL = 127; + public final static int MOUSETEXT_BEGIN = 0x80; public final static int MOUSETEXT_CLOSEDAPPLE = MOUSETEXT_BEGIN/*+0x00*/; public final static int MOUSETEXT_OPENAPPLE = MOUSETEXT_BEGIN + 0x01; diff --git a/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2KeypadChooser.java b/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2KeypadChooser.java index 991a45c6..dbe6b8a9 100644 --- a/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2KeypadChooser.java +++ b/Android/app/src/main/java/org/deadc0de/apple2ix/Apple2KeypadChooser.java @@ -15,7 +15,6 @@ import android.content.Context; import android.os.Handler; import android.util.Log; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.TextView; @@ -89,7 +88,7 @@ public class Apple2KeypadChooser implements Apple2MenuView { return; } - String asciiStr = asciiRepresentation(ascii); + String asciiStr = asciiRepresentation(mActivity, ascii); Log.d(TAG, "ascii:'" + asciiStr + "' scancode:" + scancode); if (ascii == ' ') { ascii = Apple2KeyboardSettingsMenu.ICONTEXT_VISUAL_SPACE; @@ -198,31 +197,41 @@ public class Apple2KeypadChooser implements Apple2MenuView { Apple2Preferences.sync(mActivity, Apple2Preferences.PREF_DOMAIN_TOUCHSCREEN); } - private String asciiRepresentation(char ascii) { + public static String asciiRepresentation(Apple2Activity activity, char ascii) { switch (ascii) { case Apple2KeyboardSettingsMenu.MOUSETEXT_OPENAPPLE: - return mActivity.getResources().getString(R.string.key_open_apple); + return activity.getResources().getString(R.string.key_open_apple); case Apple2KeyboardSettingsMenu.MOUSETEXT_CLOSEDAPPLE: - return mActivity.getResources().getString(R.string.key_closed_apple); + return activity.getResources().getString(R.string.key_closed_apple); + case Apple2KeyboardSettingsMenu.kUP: case Apple2KeyboardSettingsMenu.MOUSETEXT_UP: - return mActivity.getResources().getString(R.string.key_up); + return activity.getResources().getString(R.string.key_up); + case Apple2KeyboardSettingsMenu.kLT: case Apple2KeyboardSettingsMenu.MOUSETEXT_LEFT: - return mActivity.getResources().getString(R.string.key_left); + return activity.getResources().getString(R.string.key_left); + case Apple2KeyboardSettingsMenu.kRT: case Apple2KeyboardSettingsMenu.MOUSETEXT_RIGHT: - return mActivity.getResources().getString(R.string.key_right); + return activity.getResources().getString(R.string.key_right); + case Apple2KeyboardSettingsMenu.kDN: case Apple2KeyboardSettingsMenu.MOUSETEXT_DOWN: - return mActivity.getResources().getString(R.string.key_down); + return activity.getResources().getString(R.string.key_down); case Apple2KeyboardSettingsMenu.ICONTEXT_CTRL: - return mActivity.getResources().getString(R.string.key_ctrl); + return activity.getResources().getString(R.string.key_ctrl); + case Apple2KeyboardSettingsMenu.kESC: case Apple2KeyboardSettingsMenu.ICONTEXT_ESC: - return mActivity.getResources().getString(R.string.key_esc); + return activity.getResources().getString(R.string.key_esc); + case Apple2KeyboardSettingsMenu.kRET: case Apple2KeyboardSettingsMenu.ICONTEXT_RETURN: - return mActivity.getResources().getString(R.string.key_ret); + return activity.getResources().getString(R.string.key_ret); case Apple2KeyboardSettingsMenu.ICONTEXT_NONACTION: - return mActivity.getResources().getString(R.string.key_none); + return activity.getResources().getString(R.string.key_none); case ' ': case Apple2KeyboardSettingsMenu.ICONTEXT_VISUAL_SPACE: - return mActivity.getResources().getString(R.string.key_space); + return activity.getResources().getString(R.string.key_space); + case Apple2KeyboardSettingsMenu.kDEL: + return activity.getResources().getString(R.string.key_del); + case Apple2KeyboardSettingsMenu.kTAB: + return activity.getResources().getString(R.string.key_tab); default: return "" + ascii; } diff --git a/Android/app/src/main/res/values-de/strings.xml b/Android/app/src/main/res/values-de/strings.xml index ba240d42..6c5c35c5 100644 --- a/Android/app/src/main/res/values-de/strings.xml +++ b/Android/app/src/main/res/values-de/strings.xml @@ -213,5 +213,7 @@ Swipe right fire Button to fire on swipe left Button to fire on swipe right + [DEL] + [TAB] diff --git a/Android/app/src/main/res/values-es/strings.xml b/Android/app/src/main/res/values-es/strings.xml index 2e2b5718..14d0e67f 100644 --- a/Android/app/src/main/res/values-es/strings.xml +++ b/Android/app/src/main/res/values-es/strings.xml @@ -213,5 +213,7 @@ Swipe right fire Button to fire on swipe left Button to fire on swipe right + [DEL] + [TAB] diff --git a/Android/app/src/main/res/values-fr/strings.xml b/Android/app/src/main/res/values-fr/strings.xml index 9862b10e..19f1e224 100644 --- a/Android/app/src/main/res/values-fr/strings.xml +++ b/Android/app/src/main/res/values-fr/strings.xml @@ -213,5 +213,7 @@ Swipe right fire Button to fire on swipe left Button to fire on swipe right + [DEL] + [TAB] diff --git a/Android/app/src/main/res/values/strings.xml b/Android/app/src/main/res/values/strings.xml index 2a7a1d0b..26930712 100644 --- a/Android/app/src/main/res/values/strings.xml +++ b/Android/app/src/main/res/values/strings.xml @@ -213,5 +213,7 @@ Swipe right fire Button to fire on swipe right Button to fire on swipe left + [DEL] + [TAB] diff --git a/Android/jni/jnihooks.c b/Android/jni/jnihooks.c index 050a90bf..efd00ee2 100644 --- a/Android/jni/jnihooks.c +++ b/Android/jni/jnihooks.c @@ -617,17 +617,13 @@ void Java_org_deadc0de_apple2ix_Apple2Preferences_nativePrefsSync(JNIEnv *env, j jlong Java_org_deadc0de_apple2ix_Apple2JoystickCalibration_nativePollJoystick(JNIEnv *env, jclass cls) { jlong cxy = 0; - uint8_t c = apple_ii_64k[0][0xC000]; - if (c | 0x80) { - c = keys_apple2ASCII(c, NULL); - } else { - c = ' '; - } + long c = keys_consumeLastKey(); cxy |= (c << 16); cxy |= ((joy_x & 0xFF) << 8); cxy |= ((joy_y & 0xFF) << 0); + // last_ascii | last_scancode | joy_x | joy_y return cxy; } diff --git a/src/keys.c b/src/keys.c index a06f522c..96ad7e88 100644 --- a/src/keys.c +++ b/src/keys.c @@ -17,6 +17,7 @@ static int next_key = -1; static int last_scancode = -1; +static int last_ascii = -1; bool caps_lock = true; // default enabled because so much breaks otherwise bool use_system_caps_lock = false; @@ -217,7 +218,6 @@ void keys_handleInput(int scancode, bool is_pressed, bool is_ascii) { SCOPE_TRACE_INTERFACE("keys_handleInput: scancode:%d is_pressed:%d is_ascii:%d", scancode, is_pressed, is_ascii); if (is_ascii) { - last_scancode = -1; if (!is_pressed) { return; } @@ -226,6 +226,7 @@ void keys_handleInput(int scancode, bool is_pressed, bool is_ascii) { scancode -= 32; } } + last_scancode = keys_ascii2Scancode(scancode); next_key = scancode; } else if (scancode >= 0) { assert(scancode < 0x80); @@ -283,6 +284,7 @@ void keys_handleInput(int scancode, bool is_pressed, bool is_ascii) { ) { do { + last_ascii = next_key; int current_key = next_key; next_key = -1; @@ -459,6 +461,26 @@ void keys_handleInput(int scancode, bool is_pressed, bool is_ascii) { #endif } +long keys_consumeLastKey(void) { + + apple_ii_64k[0][0xC000] = 0x00; + apple_ii_64k[1][0xC000] = 0x00; + + int scancode = last_scancode; + int ascii = last_ascii; + + if (scancode < 0 || ascii < 0) { + scancode = 0; + ascii = 0; + } + + assert(scancode < 256); + assert(ascii < 256); + + long scankey = (((uint8_t)ascii) << 8) | (((uint8_t)scancode) << 0); + return scankey; +} + #ifdef INTERFACE_CLASSIC int c_rawkey() { diff --git a/src/keys.h b/src/keys.h index 9b97bfcf..82be3ace 100644 --- a/src/keys.h +++ b/src/keys.h @@ -148,6 +148,7 @@ bool c_keys_is_interface_key(int key); bool keys_isShifted(void); int keys_ascii2Scancode(uint8_t ch); void keys_handleInput(int scan_or_key, bool is_pressed, bool is_ascii); +long keys_consumeLastKey(void); int keys_scancode2ASCII(int scancode, bool is_shifted, bool is_ctrl); uint8_t keys_apple2ASCII(uint8_t c, OUTPARM font_mode_t *mode);