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