diff --git a/lime/_backend/native/NativeCFFI.hx b/lime/_backend/native/NativeCFFI.hx
index 0f8f83e13..fe80409d6 100644
--- a/lime/_backend/native/NativeCFFI.hx
+++ b/lime/_backend/native/NativeCFFI.hx
@@ -85,6 +85,8 @@ class NativeCFFI {
@:cffi private static function lime_joystick_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_jpeg_decode_bytes (data:Dynamic, decodeData:Bool, buffer:Dynamic):Dynamic;
@:cffi private static function lime_jpeg_decode_file (path:String, decodeData:Bool, buffer:Dynamic):Dynamic;
+ @:cffi private static function lime_key_code_from_scan_code (scanCodeA:Int, scanCodeB:Int):Dynamic;
+ @:cffi private static function lime_key_code_to_scan_code (keyCodeA:Int, keyCodeB:Int):Dynamic;
@:cffi private static function lime_key_event_manager_register (callback:Dynamic, eventObject:Dynamic):Void;
@:cffi private static function lime_lzma_compress (data:Dynamic, bytes:Dynamic):Dynamic;
@:cffi private static function lime_lzma_decompress (data:Dynamic, bytes:Dynamic):Dynamic;
diff --git a/lime/ui/KeyCode.hx b/lime/ui/KeyCode.hx
index 64f775d36..f9e64e94c 100644
--- a/lime/ui/KeyCode.hx
+++ b/lime/ui/KeyCode.hx
@@ -1,6 +1,11 @@
package lime.ui;
+import lime._backend.native.NativeCFFI;
+
+@:access(lime._backend.native.NativeCFFI)
+
+
@:enum abstract KeyCode(Int) from Int to Int from UInt to UInt {
@@ -241,6 +246,38 @@ package lime.ui;
var EJECT = 0x40000119;
var SLEEP = 0x4000011A;
+ @:from public static function fromScanCode (scanCode:ScanCode):KeyCode {
+
+ #if (lime_cffi && !macro)
+ var code:Int = scanCode;
+ #if neko
+ var code:Float = code;
+ var code:Int = Std.int (code);
+ #end
+ var code:Int = NativeCFFI.lime_key_code_from_scan_code (((code:Int) >> 16) & 0xFFFF, (code:Int) & 0xFFFF);
+ return code;
+ #else
+ return KeyCode.UNKNOWN;
+ #end
+
+ }
+
+ @:to private static function toScanCode (keyCode:KeyCode):ScanCode {
+
+ #if (lime_cffi && !macro)
+ var code:Int = keyCode;
+ #if neko
+ var code:Float = code;
+ var code:Int = Std.int (code);
+ #end
+ var code:Int = NativeCFFI.lime_key_code_to_scan_code (((code:Int) >> 16) & 0xFFFF, (code:Int) & 0xFFFF);
+ return code;
+ #else
+ return ScanCode.UNKNOWN;
+ #end
+
+ }
+
@:op(A > B) private static inline function gt (a:KeyCode, b:KeyCode):Bool { return (a:Int) > (b:Int); }
@:op(A >= B) private static inline function gte (a:KeyCode, b:KeyCode):Bool { return (a:Int) >= (b:Int); }
@:op(A < B) private static inline function lt (a:KeyCode, b:KeyCode):Bool { return (a:Int) < (b:Int); }
diff --git a/lime/ui/ScanCode.hx b/lime/ui/ScanCode.hx
new file mode 100644
index 000000000..d6362fc4d
--- /dev/null
+++ b/lime/ui/ScanCode.hx
@@ -0,0 +1,269 @@
+package lime.ui;
+
+
+import lime._backend.native.NativeCFFI;
+
+@:access(lime._backend.native.NativeCFFI)
+@:access(lime.ui.KeyCode)
+
+
+@:enum abstract ScanCode(Int) from Int to Int from UInt to UInt {
+
+
+ var UNKNOWN = 0;
+ var BACKSPACE = 42;
+ var TAB = 43;
+ var RETURN = 40;
+ var ESCAPE = 41;
+ var SPACE = 44;
+ //var EXCLAMATION = 0x21;
+ //var QUOTE = 0x22;
+ //var HASH = 0x23;
+ //var DOLLAR = 0x24;
+ //var PERCENT = 0x25;
+ //var AMPERSAND = 0x26;
+ var SINGLE_QUOTE = 52;
+ //var LEFT_PARENTHESIS = 0x28;
+ //var RIGHT_PARENTHESIS = 0x29;
+ //var ASTERISK = 0x2A;
+ //var PLUS = 0x2B;
+ var COMMA = 54;
+ var MINUS = 45;
+ var PERIOD = 55;
+ var SLASH = 56;
+ var NUMBER_0 = 39;
+ var NUMBER_1 = 30;
+ var NUMBER_2 = 31;
+ var NUMBER_3 = 32;
+ var NUMBER_4 = 33;
+ var NUMBER_5 = 34;
+ var NUMBER_6 = 35;
+ var NUMBER_7 = 36;
+ var NUMBER_8 = 37;
+ var NUMBER_9 = 38;
+ //var COLON = 0x3A;
+ var SEMICOLON = 51;
+ //var LESS_THAN = 0x3C;
+ var EQUALS = 46;
+ //var GREATER_THAN = 0x3E;
+ //var QUESTION = 0x3F;
+ //var AT = 0x40;
+ var LEFT_BRACKET = 47;
+ var BACKSLASH = 49;
+ var RIGHT_BRACKET = 48;
+ //var CARET = 0x5E;
+ //var UNDERSCORE = 0x5F;
+ var GRAVE = 53;
+ var A = 4;
+ var B = 5;
+ var C = 6;
+ var D = 7;
+ var E = 8;
+ var F = 9;
+ var G = 10;
+ var H = 11;
+ var I = 12;
+ var J = 13;
+ var K = 14;
+ var L = 15;
+ var M = 16;
+ var N = 17;
+ var O = 18;
+ var P = 19;
+ var Q = 20;
+ var R = 21;
+ var S = 22;
+ var T = 23;
+ var U = 24;
+ var V = 25;
+ var W = 26;
+ var X = 27;
+ var Y = 28;
+ var Z = 29;
+ var DELETE = 76;
+ var CAPS_LOCK = 57;
+ var F1 = 58;
+ var F2 = 59;
+ var F3 = 60;
+ var F4 = 61;
+ var F5 = 62;
+ var F6 = 63;
+ var F7 = 64;
+ var F8 = 65;
+ var F9 = 66;
+ var F10 = 67;
+ var F11 = 68;
+ var F12 = 69;
+ var PRINT_SCREEN = 70;
+ var SCROLL_LOCK = 71;
+ var PAUSE = 72;
+ var INSERT = 73;
+ var HOME = 74;
+ var PAGE_UP = 75;
+ var END = 77;
+ var PAGE_DOWN = 78;
+ var RIGHT = 79;
+ var LEFT = 80;
+ var DOWN = 81;
+ var UP = 82;
+ var NUM_LOCK = 83;
+ var NUMPAD_DIVIDE = 84;
+ var NUMPAD_MULTIPLY = 85;
+ var NUMPAD_MINUS = 86;
+ var NUMPAD_PLUS = 87;
+ var NUMPAD_ENTER = 88;
+ var NUMPAD_1 = 89;
+ var NUMPAD_2 = 90;
+ var NUMPAD_3 = 91;
+ var NUMPAD_4 = 92;
+ var NUMPAD_5 = 93;
+ var NUMPAD_6 = 94;
+ var NUMPAD_7 = 95;
+ var NUMPAD_8 = 96;
+ var NUMPAD_9 = 97;
+ var NUMPAD_0 = 98;
+ var NUMPAD_PERIOD = 99;
+ var APPLICATION = 101;
+ var POWER = 102;
+ var NUMPAD_EQUALS = 103;
+ var F13 = 104;
+ var F14 = 105;
+ var F15 = 106;
+ var F16 = 107;
+ var F17 = 108;
+ var F18 = 109;
+ var F19 = 110;
+ var F20 = 111;
+ var F21 = 112;
+ var F22 = 113;
+ var F23 = 114;
+ var F24 = 115;
+ var EXECUTE = 116;
+ var HELP = 117;
+ var MENU = 118;
+ var SELECT = 119;
+ var STOP = 120;
+ var AGAIN = 121;
+ var UNDO = 122;
+ var CUT = 123;
+ var COPY = 124;
+ var PASTE = 125;
+ var FIND = 126;
+ var MUTE = 127;
+ var VOLUME_UP = 128;
+ var VOLUME_DOWN = 129;
+ var NUMPAD_COMMA = 133;
+ //var NUMPAD_EQUALS_AS400 = 134;
+ var ALT_ERASE = 153;
+ var SYSTEM_REQUEST = 154;
+ var CANCEL = 155;
+ var CLEAR = 156;
+ var PRIOR = 157;
+ var RETURN2 = 158;
+ var SEPARATOR = 159;
+ var OUT = 160;
+ var OPER = 161;
+ var CLEAR_AGAIN = 162;
+ var CRSEL = 163;
+ var EXSEL = 164;
+ var NUMPAD_00 = 176;
+ var NUMPAD_000 = 177;
+ var THOUSAND_SEPARATOR = 178;
+ var DECIMAL_SEPARATOR = 179;
+ var CURRENCY_UNIT = 180;
+ var CURRENCY_SUBUNIT = 181;
+ var NUMPAD_LEFT_PARENTHESIS = 182;
+ var NUMPAD_RIGHT_PARENTHESIS = 183;
+ var NUMPAD_LEFT_BRACE = 184;
+ var NUMPAD_RIGHT_BRACE = 185;
+ var NUMPAD_TAB = 186;
+ var NUMPAD_BACKSPACE = 187;
+ var NUMPAD_A = 188;
+ var NUMPAD_B = 189;
+ var NUMPAD_C = 190;
+ var NUMPAD_D = 191;
+ var NUMPAD_E = 192;
+ var NUMPAD_F = 193;
+ var NUMPAD_XOR = 194;
+ var NUMPAD_POWER = 195;
+ var NUMPAD_PERCENT = 196;
+ var NUMPAD_LESS_THAN = 197;
+ var NUMPAD_GREATER_THAN = 198;
+ var NUMPAD_AMPERSAND = 199;
+ var NUMPAD_DOUBLE_AMPERSAND = 200;
+ var NUMPAD_VERTICAL_BAR = 201;
+ var NUMPAD_DOUBLE_VERTICAL_BAR = 202;
+ var NUMPAD_COLON = 203;
+ var NUMPAD_HASH = 204;
+ var NUMPAD_SPACE = 205;
+ var NUMPAD_AT = 206;
+ var NUMPAD_EXCLAMATION = 207;
+ var NUMPAD_MEM_STORE = 208;
+ var NUMPAD_MEM_RECALL = 209;
+ var NUMPAD_MEM_CLEAR = 210;
+ var NUMPAD_MEM_ADD = 211;
+ var NUMPAD_MEM_SUBTRACT = 212;
+ var NUMPAD_MEM_MULTIPLY = 213;
+ var NUMPAD_MEM_DIVIDE = 214;
+ var NUMPAD_PLUS_MINUS = 215;
+ var NUMPAD_CLEAR = 216;
+ var NUMPAD_CLEAR_ENTRY = 217;
+ var NUMPAD_BINARY = 218;
+ var NUMPAD_OCTAL = 219;
+ var NUMPAD_DECIMAL = 220;
+ var NUMPAD_HEXADECIMAL = 221;
+ var LEFT_CTRL = 224;
+ var LEFT_SHIFT = 225;
+ var LEFT_ALT = 226;
+ var LEFT_META = 227;
+ var RIGHT_CTRL = 228;
+ var RIGHT_SHIFT = 229;
+ var RIGHT_ALT = 230;
+ var RIGHT_META = 231;
+ var MODE = 257;
+ var AUDIO_NEXT = 258;
+ var AUDIO_PREVIOUS = 259;
+ var AUDIO_STOP = 260;
+ var AUDIO_PLAY = 261;
+ var AUDIO_MUTE = 262;
+ var MEDIA_SELECT = 263;
+ var WWW = 264;
+ var MAIL = 265;
+ var CALCULATOR = 266;
+ var COMPUTER = 267;
+ var APP_CONTROL_SEARCH = 268;
+ var APP_CONTROL_HOME = 269;
+ var APP_CONTROL_BACK = 270;
+ var APP_CONTROL_FORWARD = 271;
+ var APP_CONTROL_STOP = 272;
+ var APP_CONTROL_REFRESH = 273;
+ var APP_CONTROL_BOOKMARKS = 274;
+ var BRIGHTNESS_DOWN = 275;
+ var BRIGHTNESS_UP = 276;
+ var DISPLAY_SWITCH = 277;
+ var BACKLIGHT_TOGGLE = 278;
+ var BACKLIGHT_DOWN = 279;
+ var BACKLIGHT_UP = 280;
+ var EJECT = 281;
+ var SLEEP = 282;
+
+ @:from public static function fromKeyCode (keyCode:KeyCode):ScanCode {
+
+ return KeyCode.toScanCode (keyCode);
+
+ }
+
+ @:to private static function toKeyCode (scanCode:ScanCode):KeyCode {
+
+ return KeyCode.fromScanCode (scanCode);
+
+ }
+
+ @:op(A > B) private static inline function gt (a:ScanCode, b:ScanCode):Bool { return (a:Int) > (b:Int); }
+ @:op(A >= B) private static inline function gte (a:ScanCode, b:ScanCode):Bool { return (a:Int) >= (b:Int); }
+ @:op(A < B) private static inline function lt (a:ScanCode, b:ScanCode):Bool { return (a:Int) < (b:Int); }
+ @:op(A <= B) private static inline function lte (a:ScanCode, b:ScanCode):Bool { return (a:Int) <= (b:Int); }
+ @:op(A + B) private static inline function plus (a:ScanCode, b:Int):ScanCode { return (a:Int) + b; }
+
+
+}
\ No newline at end of file
diff --git a/project/Build.xml b/project/Build.xml
index 5bb77ac72..b70257555 100644
--- a/project/Build.xml
+++ b/project/Build.xml
@@ -191,6 +191,7 @@
+
diff --git a/project/include/ui/KeyCode.h b/project/include/ui/KeyCode.h
new file mode 100644
index 000000000..16aaa9aba
--- /dev/null
+++ b/project/include/ui/KeyCode.h
@@ -0,0 +1,24 @@
+#ifndef LIME_UI_KEY_CODE_H
+#define LIME_UI_KEY_CODE_H
+
+
+#include
+
+
+namespace lime {
+
+
+ class KeyCode {
+
+ public:
+
+ static int32_t FromScanCode (int32_t keyCode);
+ static int32_t ToScanCode (int32_t keyCode);
+
+ };
+
+
+}
+
+
+#endif
\ No newline at end of file
diff --git a/project/src/ExternalInterface.cpp b/project/src/ExternalInterface.cpp
index 9f3b423ee..a42603395 100644
--- a/project/src/ExternalInterface.cpp
+++ b/project/src/ExternalInterface.cpp
@@ -35,6 +35,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -1077,6 +1078,22 @@ namespace lime {
}
+ value lime_key_code_from_scan_code (int codeA, int codeB) {
+
+ int32_t code = (codeA << 16) | codeB;
+ return alloc_int32 (KeyCode::FromScanCode (code));
+
+ }
+
+
+ value lime_key_code_to_scan_code (int codeA, int codeB) {
+
+ int32_t code = (codeA << 16) | codeB;
+ return alloc_int32 (KeyCode::ToScanCode (code));
+
+ }
+
+
void lime_key_event_manager_register (value callback, value eventObject) {
KeyEvent::callback = new AutoGCRoot (callback);
@@ -1779,6 +1796,8 @@ namespace lime {
DEFINE_PRIME1 (lime_joystick_get_num_trackballs);
DEFINE_PRIME3 (lime_jpeg_decode_bytes);
DEFINE_PRIME3 (lime_jpeg_decode_file);
+ DEFINE_PRIME2 (lime_key_code_from_scan_code);
+ DEFINE_PRIME2 (lime_key_code_to_scan_code);
DEFINE_PRIME2v (lime_key_event_manager_register);
DEFINE_PRIME0 (lime_locale_get_system_locale);
DEFINE_PRIME2 (lime_lzma_compress);
diff --git a/project/src/backend/sdl/SDLKeyCode.cpp b/project/src/backend/sdl/SDLKeyCode.cpp
new file mode 100644
index 000000000..ecb990f84
--- /dev/null
+++ b/project/src/backend/sdl/SDLKeyCode.cpp
@@ -0,0 +1,22 @@
+#include
+#include
+
+
+namespace lime {
+
+
+ int32_t KeyCode::FromScanCode (int32_t scanCode) {
+
+ return SDL_GetKeyFromScancode ((SDL_Scancode)scanCode);
+
+ }
+
+
+ int32_t KeyCode::ToScanCode (int32_t keyCode) {
+
+ return SDL_GetScancodeFromKey ((SDL_Keycode)keyCode);
+
+ }
+
+
+}
\ No newline at end of file