/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef AGS_SHARED_AC_KEYCODE_H #define AGS_SHARED_AC_KEYCODE_H #include "ags/shared/core/platform.h" #include "ags/shared/core/types.h" namespace AGS3 { #define EXTENDED_KEY_CODE ('\0') #define EXTENDED_KEY_CODE_MACOS ('?') // Constant used to define Alt+Key codes #define AGS_EXT_KEY_SHIFT 300 #define AGS_EXT_KEY_ALPHA(key) (AGS_EXT_KEY_SHIFT + (key - eAGSKeyCodeCtrlA) + 1) // These are based on eKeyCode values in AGS Script. // The actual values are based on scan codes of the old backend (allegro 3 and/or 4), // which in turn mostly match ASCII values (at least for ones below 128), including // Ctrl + letter combination codes. // More codes are added at much higher ranges, for example Alt + letter combo codes // are defined as 300 + letter's order. // It should be specifically noted that eAGSKeyCode is directly conversible to ASCII // at the range of 1 - 128, and AGS script makes use of this. // Another important thing to note is that letter codes are always sent into script // callbacks (like "on_key_pressed") in capitalized form, and that's how they are // declared in script API (that's why in these callbacks user would have to check // the Shift key state if they want to know if it's A or Shift + A). enum eAGSKeyCode { eAGSKeyCodeNone = 0, eAGSKeyCodeCtrlA = 1, eAGSKeyCodeCtrlB = 2, eAGSKeyCodeCtrlC = 3, eAGSKeyCodeCtrlD = 4, eAGSKeyCodeCtrlE = 5, eAGSKeyCodeCtrlF = 6, eAGSKeyCodeCtrlG = 7, eAGSKeyCodeCtrlH = 8, eAGSKeyCodeCtrlI = 9, eAGSKeyCodeCtrlJ = 10, eAGSKeyCodeCtrlK = 11, eAGSKeyCodeCtrlL = 12, eAGSKeyCodeCtrlM = 13, eAGSKeyCodeCtrlN = 14, eAGSKeyCodeCtrlO = 15, eAGSKeyCodeCtrlP = 16, eAGSKeyCodeCtrlQ = 17, eAGSKeyCodeCtrlR = 18, eAGSKeyCodeCtrlS = 19, eAGSKeyCodeCtrlT = 20, eAGSKeyCodeCtrlU = 21, eAGSKeyCodeCtrlV = 22, eAGSKeyCodeCtrlW = 23, eAGSKeyCodeCtrlX = 24, eAGSKeyCodeCtrlY = 25, eAGSKeyCodeCtrlZ = 26, eAGSKeyCodeBackspace = 8, // matches Ctrl + H eAGSKeyCodeTab = 9, // matches Ctrl + I eAGSKeyCodeReturn = 13, // matches Ctrl + M eAGSKeyCodeEscape = 27, /* printable chars - from eAGSKeyCodeSpace to eAGSKeyCode_z */ eAGSKeyCodeSpace = 32, eAGSKeyCodeExclamationMark = 33, eAGSKeyCodeDoubleQuote = 34, eAGSKeyCodeHash = 35, eAGSKeyCodeDollar = 36, eAGSKeyCodePercent = 37, eAGSKeyCodeAmpersand = 38, eAGSKeyCodeSingleQuote = 39, eAGSKeyCodeOpenParenthesis = 40, eAGSKeyCodeCloseParenthesis = 41, eAGSKeyCodeAsterisk = 42, eAGSKeyCodePlus = 43, eAGSKeyCodeComma = 44, eAGSKeyCodeHyphen = 45, eAGSKeyCodePeriod = 46, eAGSKeyCodeForwardSlash = 47, eAGSKeyCode0 = 48, eAGSKeyCode1 = 49, eAGSKeyCode2 = 50, eAGSKeyCode3 = 51, eAGSKeyCode4 = 52, eAGSKeyCode5 = 53, eAGSKeyCode6 = 54, eAGSKeyCode7 = 55, eAGSKeyCode8 = 56, eAGSKeyCode9 = 57, eAGSKeyCodeColon = 58, eAGSKeyCodeSemiColon = 59, eAGSKeyCodeLessThan = 60, eAGSKeyCodeEquals = 61, eAGSKeyCodeGreaterThan = 62, eAGSKeyCodeQuestionMark = 63, eAGSKeyCodeAt = 64, // '@' /* Notice that default letter codes match capital ASCII letters */ eAGSKeyCodeA = 65, // 'A' eAGSKeyCodeB = 66, // 'B', etc eAGSKeyCodeC = 67, eAGSKeyCodeD = 68, eAGSKeyCodeE = 69, eAGSKeyCodeF = 70, eAGSKeyCodeG = 71, eAGSKeyCodeH = 72, eAGSKeyCodeI = 73, eAGSKeyCodeJ = 74, eAGSKeyCodeK = 75, eAGSKeyCodeL = 76, eAGSKeyCodeM = 77, eAGSKeyCodeN = 78, eAGSKeyCodeO = 79, eAGSKeyCodeP = 80, eAGSKeyCodeQ = 81, eAGSKeyCodeR = 82, eAGSKeyCodeS = 83, eAGSKeyCodeT = 84, eAGSKeyCodeU = 85, eAGSKeyCodeV = 86, eAGSKeyCodeW = 87, eAGSKeyCodeX = 88, eAGSKeyCodeY = 89, eAGSKeyCodeZ = 90, // 'Z' eAGSKeyCodeOpenBracket = 91, eAGSKeyCodeBackSlash = 92, eAGSKeyCodeCloseBracket = 93, eAGSKeyCodeCaret = 94, // '^' eAGSKeyCodeUnderscore = 95, eAGSKeyCodeBackquote = 96, // '`' /* Small ASCII letter codes are declared here for consistency, but unused in script callbacks */ eAGSKeyCode_a = 97, // 'a' eAGSKeyCode_b = 98, // 'b', etc eAGSKeyCode_c = 99, eAGSKeyCode_d = 100, eAGSKeyCode_e = 101, eAGSKeyCode_f = 102, eAGSKeyCode_g = 103, eAGSKeyCode_h = 104, eAGSKeyCode_i = 105, eAGSKeyCode_j = 106, eAGSKeyCode_k = 107, eAGSKeyCode_l = 108, eAGSKeyCode_m = 109, eAGSKeyCode_n = 110, eAGSKeyCode_o = 111, eAGSKeyCode_p = 112, eAGSKeyCode_q = 113, eAGSKeyCode_r = 114, eAGSKeyCode_s = 115, eAGSKeyCode_t = 116, eAGSKeyCode_u = 117, eAGSKeyCode_v = 118, eAGSKeyCode_w = 119, eAGSKeyCode_x = 120, eAGSKeyCode_y = 121, eAGSKeyCode_z = 122, // 'z' /* extended symbol codes */ eAGSKeyCodeF1 = AGS_EXT_KEY_SHIFT + 59, eAGSKeyCodeF2 = AGS_EXT_KEY_SHIFT + 60, eAGSKeyCodeF3 = AGS_EXT_KEY_SHIFT + 61, eAGSKeyCodeF4 = AGS_EXT_KEY_SHIFT + 62, eAGSKeyCodeF5 = AGS_EXT_KEY_SHIFT + 63, eAGSKeyCodeF6 = AGS_EXT_KEY_SHIFT + 64, eAGSKeyCodeF7 = AGS_EXT_KEY_SHIFT + 65, eAGSKeyCodeF8 = AGS_EXT_KEY_SHIFT + 66, eAGSKeyCodeF9 = AGS_EXT_KEY_SHIFT + 67, eAGSKeyCodeF10 = AGS_EXT_KEY_SHIFT + 68, eAGSKeyCodeF11 = AGS_EXT_KEY_SHIFT + 133, eAGSKeyCodeF12 = AGS_EXT_KEY_SHIFT + 134, eAGSKeyCodeHome = AGS_EXT_KEY_SHIFT + 71, eAGSKeyCodeUpArrow = AGS_EXT_KEY_SHIFT + 72, eAGSKeyCodePageUp = AGS_EXT_KEY_SHIFT + 73, eAGSKeyCodeLeftArrow = AGS_EXT_KEY_SHIFT + 75, eAGSKeyCodeNumPad5 = AGS_EXT_KEY_SHIFT + 76, eAGSKeyCodeRightArrow = AGS_EXT_KEY_SHIFT + 77, eAGSKeyCodeEnd = AGS_EXT_KEY_SHIFT + 79, eAGSKeyCodeDownArrow = AGS_EXT_KEY_SHIFT + 80, eAGSKeyCodePageDown = AGS_EXT_KEY_SHIFT + 81, eAGSKeyCodeInsert = AGS_EXT_KEY_SHIFT + 82, eAGSKeyCodeDelete = AGS_EXT_KEY_SHIFT + 83, // [sonneveld] These are only used by debugging and abort keys. // They're based on allegro4 codes ... eAGSKeyCodeAltV = AGS_EXT_KEY_ALPHA(eAGSKeyCodeV), eAGSKeyCodeAltX = AGS_EXT_KEY_ALPHA(eAGSKeyCodeX), eAGSKeyCodeAltY = AGS_EXT_KEY_ALPHA(eAGSKeyCodeY), eAGSKeyCodeAltZ = AGS_EXT_KEY_ALPHA(eAGSKeyCodeZ), // The beginning of "service key list": mod keys and other special keys // not normally intended to affect the default game logic eAGSKeyCode_FirstServiceKey = 391, // not certain if necessary anymore (and not certain what was the origin of this value) eAGSKeyCodeAltTab = AGS_EXT_KEY_SHIFT + 99, // Mod-key codes // *probably* made-up numbers, not derived from allegro scan codes. eAGSKeyCodeLShift = 403, eAGSKeyCodeRShift = 404, eAGSKeyCodeLCtrl = 405, eAGSKeyCodeRCtrl = 406, eAGSKeyCodeLAlt = 407, // [sonneveld] // The following are the AGS_EXT_KEY_SHIFT, derived from applying arithmetic to the original keycodes. // These do not have a corresponding ags key enum, do not appear in the manual and may not be accessible because of OS contraints. eAGSKeyCodeRAlt = 420, // TODO: judging that above works (at least on Win), following might also work, // but idk which ones may be necessary; still keeping here this excerpt from an old code // if they'd want to be restored (also add them to script API then!). // Also see allegro 4's keyboard.h, where these were declared. /* case 392: __allegro_KEY_PRTSCR case 393: __allegro_KEY_PAUSE case 394: __allegro_KEY_ABNT_C1 // The ABNT_C1 (Brazilian) key case 395: __allegro_KEY_YEN) case 396: __allegro_KEY_KANA case 397: __allegro_KEY_CONVERT case 398: __allegro_KEY_NOCONVERT case 400: __allegro_KEY_CIRCUMFLEX case 402: __allegro_KEY_KANJI case 421: __allegro_KEY_LWIN case 422: __allegro_KEY_RWIN case 423: __allegro_KEY_MENU case 424: __allegro_KEY_SCRLOCK case 425: __allegro_KEY_NUMLOCK case 426: __allegro_KEY_CAPSLOCK */ // Mask defines the key code position if packed in the int32; // takes only 12 bits, as minimal necessary to accommodate historical codes. eAGSKeyMask = 0x0FFF }; // AGS key modifiers enum eAGSKeyMod { eAGSModLShift = 0x00010000, eAGSModRShift = 0x00020000, eAGSModLCtrl = 0x00040000, eAGSModRCtrl = 0x00080000, eAGSModLAlt = 0x00100000, eAGSModRAlt = 0x00200000, eAGSModNum = 0x00400000, eAGSModCaps = 0x00800000, // Mask defines the key mod position if packed in the int32; // the upper 8 bits are reserved for "input type" codes; // potentially may take 4 bits below (4th pos), as KeyMask takes only 12. eAGSModMask = 0x00FF0000 }; // Combined key code and a textual representation in UTF-8 struct KeyInput { const static size_t UTF8_ARR_SIZE = 5; eAGSKeyCode Key = eAGSKeyCodeNone; // actual key code eAGSKeyCode CompatKey = eAGSKeyCodeNone; // old-style key code, combined with mods int Mod = 0; // key modifiers int UChar = 0; // full character value (supports unicode) char Text[UTF8_ARR_SIZE]{}; // character in a string format KeyInput() = default; }; // AGS own mouse button codes; // These correspond to MouseButton enum in script and plugin API (sans special values) enum eAGSMouseButton { kMouseNone = 0, kMouseLeft = 1, kMouseRight = 2, kMouseMiddle = 3, kNumMouseButtons }; // Tells if the AGS keycode refers to the modifier key (ctrl, alt, etc) inline bool IsAGSModKey(eAGSKeyCode keycode) { return (keycode >= eAGSKeyCodeLShift && keycode <= eAGSKeyCodeLAlt) || keycode == eAGSKeyCodeRAlt; } // Tells if the AGS keycode refers to the service key (modifier, PrintScreen and similar); // this lets distinct keys that normally should not affect the game inline bool IsAGSServiceKey(eAGSKeyCode keycode) { return keycode >= eAGSKeyCode_FirstServiceKey; } // Converts eAGSKeyCode to script API code, for "on_key_press" and similar callbacks eAGSKeyCode AGSKeyToScriptKey(eAGSKeyCode keycode); // Converts eAGSKeyCode to ASCII text representation with the range check; returns 0 on failure // Not unicode compatible. char AGSKeyToText(eAGSKeyCode keycode); } // namespace AGS3 #endif