hedgewars/uKeyNames.pas
changeset 14832 769189675b6c
child 14843 9f6b650a6812
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hedgewars/uKeyNames.pas	Thu Apr 25 19:42:19 2019 +0200
@@ -0,0 +1,297 @@
+(*
+ * Hedgewars, a free turn based strategy game
+ * Copyright (c) 2004-2019 Andrey Korotaev <unC0Rr@gmail.com>
+ *
+ * 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; version 2 of the License
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *)
+
+unit uKeyNames;
+interface
+uses uConsts;
+
+type TKeyNames = array [0..cKeyMaxIndex] of string[15];
+
+procedure populateKeyNames(var KeyArray: TKeyNames);
+
+implementation
+
+procedure populateKeyNames(var KeyArray: TKeyNames);
+begin
+(*
+ This is a mapping from SDL scancodes to Hedgewars key identifiers.
+ Hedgewars key identifiers are strings with a maximum length of 15
+ and are used internally to identify keys in the engine and in settings.ini.
+*)
+    KeyArray[4] := 'a';
+    KeyArray[5] := 'b';
+    KeyArray[6] := 'c';
+    KeyArray[7] := 'd';
+    KeyArray[8] := 'e';
+    KeyArray[9] := 'f';
+    KeyArray[10] := 'g';
+    KeyArray[11] := 'h';
+    KeyArray[12] := 'i';
+    KeyArray[13] := 'j';
+    KeyArray[14] := 'k';
+    KeyArray[15] := 'l';
+    KeyArray[16] := 'm';
+    KeyArray[17] := 'n';
+    KeyArray[18] := 'o';
+    KeyArray[19] := 'p';
+    KeyArray[20] := 'q';
+    KeyArray[21] := 'r';
+    KeyArray[22] := 's';
+    KeyArray[23] := 't';
+    KeyArray[24] := 'u';
+    KeyArray[25] := 'v';
+    KeyArray[26] := 'w';
+    KeyArray[27] := 'x';
+    KeyArray[28] := 'y';
+    KeyArray[29] := 'z';
+    KeyArray[30] := '1';
+    KeyArray[31] := '2';
+    KeyArray[32] := '3';
+    KeyArray[33] := '4';
+    KeyArray[34] := '5';
+    KeyArray[35] := '6';
+    KeyArray[36] := '7';
+    KeyArray[37] := '8';
+    KeyArray[38] := '9';
+    KeyArray[39] := '0';
+    KeyArray[40] := 'return';
+    KeyArray[41] := 'escape';
+    KeyArray[42] := 'backspace';
+    KeyArray[43] := 'tab';
+    KeyArray[44] := 'space';
+    KeyArray[45] := '-';
+    KeyArray[46] := '=';
+    KeyArray[47] := '[';
+    KeyArray[48] := ']';
+    KeyArray[49] := '\';
+    KeyArray[50] := '#';
+    KeyArray[51] := ';';
+    KeyArray[52] := '''';
+    KeyArray[53] := '`';
+    KeyArray[54] := ',';
+    KeyArray[55] := '.';
+    KeyArray[56] := '/';
+    KeyArray[57] := 'capslock';
+    KeyArray[58] := 'f1';
+    KeyArray[59] := 'f2';
+    KeyArray[60] := 'f3';
+    KeyArray[61] := 'f4';
+    KeyArray[62] := 'f5';
+    KeyArray[63] := 'f6';
+    KeyArray[64] := 'f7';
+    KeyArray[65] := 'f8';
+    KeyArray[66] := 'f9';
+    KeyArray[67] := 'f10';
+    KeyArray[68] := 'f11';
+    KeyArray[69] := 'f12';
+    KeyArray[70] := 'printscreen';
+    KeyArray[71] := 'scrolllock';
+    KeyArray[72] := 'pause';
+    KeyArray[73] := 'insert';
+    KeyArray[74] := 'home';
+    KeyArray[75] := 'pageup';
+    KeyArray[76] := 'delete';
+    KeyArray[77] := 'end';
+    KeyArray[78] := 'pagedown';
+    KeyArray[79] := 'right';
+    KeyArray[80] := 'left';
+    KeyArray[81] := 'down';
+    KeyArray[82] := 'up';
+    KeyArray[83] := 'numlock';
+    KeyArray[84] := 'keypad_/';
+    KeyArray[85] := 'keypad_*';
+    KeyArray[86] := 'keypad_-';
+    KeyArray[87] := 'keypad_+';
+    KeyArray[88] := 'keypad_enter';
+    KeyArray[89] := 'keypad_1';
+    KeyArray[90] := 'keypad_2';
+    KeyArray[91] := 'keypad_3';
+    KeyArray[92] := 'keypad_4';
+    KeyArray[93] := 'keypad_5';
+    KeyArray[94] := 'keypad_6';
+    KeyArray[95] := 'keypad_7';
+    KeyArray[96] := 'keypad_8';
+    KeyArray[97] := 'keypad_9';
+    KeyArray[98] := 'keypad_0';
+    KeyArray[99] := 'keypad_.';
+    KeyArray[101] := 'menu';
+    KeyArray[102] := 'power';
+    KeyArray[103] := 'keypad_=';
+    KeyArray[104] := 'f13';
+    KeyArray[105] := 'f14';
+    KeyArray[106] := 'f15';
+    KeyArray[107] := 'f16';
+    KeyArray[108] := 'f17';
+    KeyArray[109] := 'f18';
+    KeyArray[110] := 'f19';
+    KeyArray[111] := 'f20';
+    KeyArray[112] := 'f21';
+    KeyArray[113] := 'f22';
+    KeyArray[114] := 'f23';
+    KeyArray[115] := 'f24';
+    KeyArray[116] := 'execute';
+    KeyArray[117] := 'help';
+    KeyArray[118] := 'menu';
+    KeyArray[119] := 'select';
+    KeyArray[120] := 'stop';
+    KeyArray[121] := 'again';
+    KeyArray[122] := 'undo';
+    KeyArray[123] := 'cut';
+    KeyArray[124] := 'copy';
+    KeyArray[125] := 'paste';
+    KeyArray[126] := 'find';
+    KeyArray[127] := 'mute';
+    KeyArray[128] := 'volumeup';
+    KeyArray[129] := 'volumedown';
+    KeyArray[133] := 'keypad_,';
+    KeyArray[134] := 'keypad_=_(as400';
+    KeyArray[153] := 'alterase';
+    KeyArray[154] := 'sysreq';
+    KeyArray[155] := 'cancel';
+    KeyArray[156] := 'clear';
+    KeyArray[157] := 'prior';
+    KeyArray[158] := 'return2';
+    KeyArray[159] := 'separator';
+    KeyArray[160] := 'out';
+    KeyArray[161] := 'oper';
+    KeyArray[162] := 'clear_/_again';
+    KeyArray[163] := 'crsel';
+    KeyArray[164] := 'exsel';
+    KeyArray[176] := 'keypad_00';
+    KeyArray[177] := 'keypad_000';
+    KeyArray[178] := 'thousandssepara';
+    KeyArray[179] := 'decimalseparato';
+    KeyArray[180] := 'currencyunit';
+    KeyArray[181] := 'currencysubunit';
+    KeyArray[182] := 'keypad_(';
+    KeyArray[183] := 'keypad_)';
+    KeyArray[184] := 'keypad_{';
+    KeyArray[185] := 'keypad_}';
+    KeyArray[186] := 'keypad_tab';
+    KeyArray[187] := 'keypad_backspac';
+    KeyArray[188] := 'keypad_a';
+    KeyArray[189] := 'keypad_b';
+    KeyArray[190] := 'keypad_c';
+    KeyArray[191] := 'keypad_d';
+    KeyArray[192] := 'keypad_e';
+    KeyArray[193] := 'keypad_f';
+    KeyArray[194] := 'keypad_xor';
+    KeyArray[195] := 'keypad_^';
+    KeyArray[196] := 'keypad_%';
+    KeyArray[197] := 'keypad_<';
+    KeyArray[198] := 'keypad_>';
+    KeyArray[199] := 'keypad_&';
+    KeyArray[200] := 'keypad_&&';
+    KeyArray[201] := 'keypad_|';
+    KeyArray[202] := 'keypad_||';
+    KeyArray[203] := 'keypad_:';
+    KeyArray[204] := 'keypad_#';
+    KeyArray[205] := 'keypad_space';
+    KeyArray[206] := 'keypad_@';
+    KeyArray[207] := 'keypad_!';
+    KeyArray[208] := 'keypad_memstore';
+    KeyArray[209] := 'keypad_memrecal';
+    KeyArray[210] := 'keypad_memclear';
+    KeyArray[211] := 'keypad_memadd';
+    KeyArray[212] := 'keypad_memsubtr';
+    KeyArray[213] := 'keypad_memmulti';
+    KeyArray[214] := 'keypad_memdivid';
+    KeyArray[215] := 'keypad_+/-';
+    KeyArray[216] := 'keypad_clear';
+    KeyArray[217] := 'keypad_clearent';
+    KeyArray[218] := 'keypad_binary';
+    KeyArray[219] := 'keypad_octal';
+    KeyArray[220] := 'keypad_decimal';
+    KeyArray[221] := 'keypad_hexadeci';
+    KeyArray[224] := 'left_ctrl';
+    KeyArray[225] := 'left_shift';
+    KeyArray[226] := 'left_alt';
+    KeyArray[227] := 'left_gui';
+    KeyArray[228] := 'right_ctrl';
+    KeyArray[229] := 'right_shift';
+    KeyArray[230] := 'right_alt';
+    KeyArray[231] := 'right_gui';
+    KeyArray[257] := 'modeswitch';
+    KeyArray[258] := 'audionext';
+    KeyArray[259] := 'audioprev';
+    KeyArray[260] := 'audiostop';
+    KeyArray[261] := 'audioplay';
+    KeyArray[262] := 'audiomute';
+    KeyArray[263] := 'mediaselect';
+    KeyArray[264] := 'www';
+    KeyArray[265] := 'mail';
+    KeyArray[266] := 'calculator';
+    KeyArray[267] := 'computer';
+    KeyArray[268] := 'ac_search';
+    KeyArray[269] := 'ac_home';
+    KeyArray[270] := 'ac_back';
+    KeyArray[271] := 'ac_forward';
+    KeyArray[272] := 'ac_stop';
+    KeyArray[273] := 'ac_refresh';
+    KeyArray[274] := 'ac_bookmarks';
+    KeyArray[275] := 'brightnessdown';
+    KeyArray[276] := 'brightnessup';
+    KeyArray[277] := 'displayswitch';
+    KeyArray[278] := 'kbdillumtoggle';
+    KeyArray[279] := 'kbdillumdown';
+    KeyArray[280] := 'kbdillumup';
+    KeyArray[281] := 'eject';
+    KeyArray[282] := 'sleep';
+    KeyArray[283] := 'app1';
+    KeyArray[284] := 'app2';
+    KeyArray[285] := 'audiorewind';
+    KeyArray[286] := 'audiofastforwar';
+
+end;
+
+(*
+The Hedgewars key identifiers were obtained with the following algorithm:
+
+Basically:
+- For each SDL scancode, do:
+   - Take the printable SDL scancode key name (with SDL_GetScancodeName)
+   - Replace spaces with underscores
+   - Lowercase it
+   - Cap string length to 15 characters
+- Manually fix duplicates
+
+See also:
+
+https://wiki.libsdl.org/SDLScancodeLookup
+https://wiki.libsdl.org/SDL_Scancode
+
+NOTE: For compability reasons, existing identifiers should not be renamed.
+
+Old code snippet:
+
+    for i := 0 to cKeyMaxIndex - 5 do
+        begin
+        s := shortstring(SDL_GetScancodeName(TSDL_Scancode(i)));
+
+        for t := 1 to Length(s) do
+            if s[t] = ' ' then
+                s[t] := '_';
+        KeyArray[i] := LowerCase(s);
+        if s = '''' then
+            WriteLnToConsole('    KeyArray['+IntToStr(i)+']'+' := '';')
+        else if s <> '' then
+            WriteLnToConsole('    KeyArray[SDL_SCANCODE_'+KeyArray[i]+']'+' := '''+KeyArray[i]+''';');
+        end;
+*)
+
+end.