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