Send different VK codes for left and right ctrl/alt/shift keys. Fixes #318

This commit is contained in:
Cameron Gutman 2017-11-06 23:38:48 -08:00
parent 3f118dae93
commit 1f6b1dc2fe
2 changed files with 36 additions and 33 deletions

View File

@ -597,19 +597,19 @@ public class Game extends Activity implements SurfaceHolder.Callback,
}; };
// Returns true if the key stroke was consumed // Returns true if the key stroke was consumed
private boolean handleSpecialKeys(short translatedKey, boolean down) { private boolean handleSpecialKeys(int androidKeyCode, boolean down) {
int modifierMask = 0; int modifierMask = 0;
// Mask off the high byte if (androidKeyCode == KeyEvent.KEYCODE_CTRL_LEFT ||
translatedKey &= 0xff; androidKeyCode == KeyEvent.KEYCODE_CTRL_RIGHT) {
if (translatedKey == KeyboardTranslator.VK_CONTROL) {
modifierMask = KeyboardPacket.MODIFIER_CTRL; modifierMask = KeyboardPacket.MODIFIER_CTRL;
} }
else if (translatedKey == KeyboardTranslator.VK_SHIFT) { else if (androidKeyCode == KeyEvent.KEYCODE_SHIFT_LEFT ||
androidKeyCode == KeyEvent.KEYCODE_SHIFT_RIGHT) {
modifierMask = KeyboardPacket.MODIFIER_SHIFT; modifierMask = KeyboardPacket.MODIFIER_SHIFT;
} }
else if (translatedKey == KeyboardTranslator.VK_ALT) { else if (androidKeyCode == KeyEvent.KEYCODE_ALT_LEFT ||
androidKeyCode == KeyEvent.KEYCODE_ALT_RIGHT) {
modifierMask = KeyboardPacket.MODIFIER_ALT; modifierMask = KeyboardPacket.MODIFIER_ALT;
} }
@ -621,7 +621,7 @@ public class Game extends Activity implements SurfaceHolder.Callback,
} }
// Check if Ctrl+Shift+Z is pressed // Check if Ctrl+Shift+Z is pressed
if (translatedKey == KeyboardTranslator.VK_Z && if (androidKeyCode == KeyEvent.KEYCODE_Z &&
(modifierFlags & (KeyboardPacket.MODIFIER_CTRL | KeyboardPacket.MODIFIER_SHIFT)) == (modifierFlags & (KeyboardPacket.MODIFIER_CTRL | KeyboardPacket.MODIFIER_SHIFT)) ==
(KeyboardPacket.MODIFIER_CTRL | KeyboardPacket.MODIFIER_SHIFT)) (KeyboardPacket.MODIFIER_CTRL | KeyboardPacket.MODIFIER_SHIFT))
{ {
@ -702,7 +702,7 @@ public class Game extends Activity implements SurfaceHolder.Callback,
} }
// Let this method take duplicate key down events // Let this method take duplicate key down events
if (handleSpecialKeys(translated, true)) { if (handleSpecialKeys(keyCode, true)) {
return true; return true;
} }
@ -742,7 +742,7 @@ public class Game extends Activity implements SurfaceHolder.Callback,
return super.onKeyUp(keyCode, event); return super.onKeyUp(keyCode, event);
} }
if (handleSpecialKeys(translated, false)) { if (handleSpecialKeys(keyCode, false)) {
return true; return true;
} }
@ -1181,7 +1181,8 @@ public class Game extends Activity implements SurfaceHolder.Callback,
public void keyboardEvent(boolean buttonDown, short keyCode) { public void keyboardEvent(boolean buttonDown, short keyCode) {
short keyMap = KeyboardTranslator.translate(keyCode); short keyMap = KeyboardTranslator.translate(keyCode);
if (keyMap != 0) { if (keyMap != 0) {
if (handleSpecialKeys(keyMap, buttonDown)) { // handleSpecialKeys() takes the Android keycode
if (handleSpecialKeys(keyCode, buttonDown)) {
return; return;
} }

View File

@ -18,22 +18,15 @@ public class KeyboardTranslator {
public static final int VK_9 = 57; public static final int VK_9 = 57;
public static final int VK_A = 65; public static final int VK_A = 65;
public static final int VK_Z = 90; public static final int VK_Z = 90;
public static final int VK_ALT = 18;
public static final int VK_NUMPAD0 = 96; public static final int VK_NUMPAD0 = 96;
public static final int VK_BACK_SLASH = 92; public static final int VK_BACK_SLASH = 92;
public static final int VK_CAPS_LOCK = 20; public static final int VK_CAPS_LOCK = 20;
public static final int VK_CLEAR = 12; public static final int VK_CLEAR = 12;
public static final int VK_COMMA = 44; public static final int VK_COMMA = 44;
public static final int VK_CONTROL = 17;
public static final int VK_BACK_SPACE = 8; public static final int VK_BACK_SPACE = 8;
public static final int VK_EQUALS = 61; public static final int VK_EQUALS = 61;
public static final int VK_ESCAPE = 27; public static final int VK_ESCAPE = 27;
public static final int VK_F1 = 112; public static final int VK_F1 = 112;
public static final int VK_PERIOD = 46;
public static final int VK_INSERT = 155;
public static final int VK_OPEN_BRACKET = 91;
public static final int VK_WINDOWS = 524;
public static final int VK_MINUS = 45;
public static final int VK_END = 35; public static final int VK_END = 35;
public static final int VK_HOME = 36; public static final int VK_HOME = 36;
public static final int VK_NUM_LOCK = 144; public static final int VK_NUM_LOCK = 144;
@ -43,7 +36,6 @@ public class KeyboardTranslator {
public static final int VK_CLOSE_BRACKET = 93; public static final int VK_CLOSE_BRACKET = 93;
public static final int VK_SCROLL_LOCK = 145; public static final int VK_SCROLL_LOCK = 145;
public static final int VK_SEMICOLON = 59; public static final int VK_SEMICOLON = 59;
public static final int VK_SHIFT = 16;
public static final int VK_SLASH = 47; public static final int VK_SLASH = 47;
public static final int VK_SPACE = 32; public static final int VK_SPACE = 32;
public static final int VK_PRINTSCREEN = 154; public static final int VK_PRINTSCREEN = 154;
@ -64,10 +56,9 @@ public class KeyboardTranslator {
public static short translate(int keycode) { public static short translate(int keycode) {
int translated; int translated;
/* There seems to be no clean mapping between Android key codes // This is a poor man's mapping between Android key codes
* and what Nvidia sends over the wire. If someone finds one, // and Windows VK_* codes. For all defined VK_ codes, see:
* I'll happily delete this code :) // https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
*/
if (keycode >= KeyEvent.KEYCODE_0 && if (keycode >= KeyEvent.KEYCODE_0 &&
keycode <= KeyEvent.KEYCODE_9) { keycode <= KeyEvent.KEYCODE_9) {
translated = (keycode - KeyEvent.KEYCODE_0) + VK_0; translated = (keycode - KeyEvent.KEYCODE_0) + VK_0;
@ -87,8 +78,11 @@ public class KeyboardTranslator {
else { else {
switch (keycode) { switch (keycode) {
case KeyEvent.KEYCODE_ALT_LEFT: case KeyEvent.KEYCODE_ALT_LEFT:
translated = 0xA4;
break;
case KeyEvent.KEYCODE_ALT_RIGHT: case KeyEvent.KEYCODE_ALT_RIGHT:
translated = VK_ALT; translated = 0xA5;
break; break;
case KeyEvent.KEYCODE_BACKSLASH: case KeyEvent.KEYCODE_BACKSLASH:
@ -108,8 +102,11 @@ public class KeyboardTranslator {
break; break;
case KeyEvent.KEYCODE_CTRL_LEFT: case KeyEvent.KEYCODE_CTRL_LEFT:
translated = 0xA2;
break;
case KeyEvent.KEYCODE_CTRL_RIGHT: case KeyEvent.KEYCODE_CTRL_RIGHT:
translated = VK_CONTROL; translated = 0xA3;
break; break;
case KeyEvent.KEYCODE_DEL: case KeyEvent.KEYCODE_DEL:
@ -129,12 +126,11 @@ public class KeyboardTranslator {
break; break;
case KeyEvent.KEYCODE_FORWARD_DEL: case KeyEvent.KEYCODE_FORWARD_DEL:
// Nvidia maps period to delete translated = 0x2e;
translated = VK_PERIOD;
break; break;
case KeyEvent.KEYCODE_INSERT: case KeyEvent.KEYCODE_INSERT:
translated = -1; translated = 0x2d;
break; break;
case KeyEvent.KEYCODE_LEFT_BRACKET: case KeyEvent.KEYCODE_LEFT_BRACKET:
@ -142,8 +138,11 @@ public class KeyboardTranslator {
break; break;
case KeyEvent.KEYCODE_META_LEFT: case KeyEvent.KEYCODE_META_LEFT:
translated = 0x5b;
break;
case KeyEvent.KEYCODE_META_RIGHT: case KeyEvent.KEYCODE_META_RIGHT:
translated = VK_WINDOWS; translated = 0x5c;
break; break;
case KeyEvent.KEYCODE_MINUS: case KeyEvent.KEYCODE_MINUS:
@ -187,8 +186,11 @@ public class KeyboardTranslator {
break; break;
case KeyEvent.KEYCODE_SHIFT_LEFT: case KeyEvent.KEYCODE_SHIFT_LEFT:
translated = 0xA0;
break;
case KeyEvent.KEYCODE_SHIFT_RIGHT: case KeyEvent.KEYCODE_SHIFT_RIGHT:
translated = VK_SHIFT; translated = 0xA1;
break; break;
case KeyEvent.KEYCODE_SLASH: case KeyEvent.KEYCODE_SLASH: