keymap.pas 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2016 by Free Pascal development team
  4. keymap.library functions for Amiga OS 4.x
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$PACKRECORDS 2}
  12. unit keymap;
  13. interface
  14. uses
  15. exec, inputevent;
  16. type
  17. PKeyMap = ^TKeyMap;
  18. TKeyMap = record
  19. km_LoKeyMapTypes: PByte;
  20. km_LoKeyMap: PLongWord;
  21. km_LoCapsable: PByte;
  22. km_LoRepeatable: PByte;
  23. km_HiKeyMapTypes: PByte;
  24. km_HiKeyMap: PLongWord;
  25. km_HiCapsable: PByte;
  26. km_HiRepeatable: PByte;
  27. end;
  28. PKeymapNode = ^TKeyMapNode;
  29. TKeyMapNode = record
  30. kn_Node: TNode; // including name of keymap
  31. kn_KeyMap: TKeyMap;
  32. end;
  33. // the structure of keymap.resource
  34. PKeyMapResource = ^TKeyMapResource;
  35. TKeyMapResource = record
  36. kr_Node: TNode;
  37. kr_List: TList; // a list of KeyMapNodes
  38. end;
  39. const
  40. // Key Map Types
  41. KC_NOQUAL = 0;
  42. KC_VANILLA = 7; // note that SHIFT+ALT+CTRL is VANILLA
  43. KCB_SHIFT = 0;
  44. KCF_SHIFT = $01;
  45. KCB_ALT = 1;
  46. KCF_ALT = $02;
  47. KCB_CONTROL = 2;
  48. KCF_CONTROL = $04;
  49. KCB_DOWNUP = 3;
  50. KCF_DOWNUP = $08;
  51. KCB_DEAD = 5; // may be dead or modified by dead key:
  52. KCF_DEAD = $20; // use dead prefix bytes
  53. KCB_STRING = 6;
  54. KCF_STRING = $40;
  55. KCB_NOP = 7;
  56. KCF_NOP = $80;
  57. // Dead Prefix Bytes
  58. DPB_MOD = 0;
  59. DPF_MOD = $01;
  60. DPB_DEAD = 3;
  61. DPF_DEAD = $08;
  62. DP_2DINDEXMASK = $0f; // mask for index for 1st of two dead keys
  63. DP_2DFACSHIFT = 4; // shift for factor for 1st of two dead keys
  64. // Some useful definitions for rawkey codes which are assumed
  65. // to be the same on all keyboards so no call of MapRawKey()
  66. //is necessary. These are the keydown codes only.
  67. RAWKEY_SPACE = $40;
  68. RAWKEY_BACKSPACE = $41;
  69. RAWKEY_TAB = $42;
  70. RAWKEY_ENTER = $43; // Numeric pad
  71. RAWKEY_RETURN = $44;
  72. RAWKEY_ESC = $45;
  73. RAWKEY_DEL = $46;
  74. RAWKEY_INSERT = $47; // Not on classic keyboards
  75. RAWKEY_PAGEUP = $48; // Not on classic keyboards
  76. RAWKEY_PAGEDOWN = $49; // Not on classic keyboards
  77. RAWKEY_F11 = $4B; // Not on classic keyboards
  78. RAWKEY_CRSRUP = $4C;
  79. RAWKEY_CRSRDOWN = $4D;
  80. RAWKEY_CRSRRIGHT = $4E;
  81. RAWKEY_CRSRLEFT = $4F;
  82. RAWKEY_F1 = $50;
  83. RAWKEY_F2 = $51;
  84. RAWKEY_F3 = $52;
  85. RAWKEY_F4 = $53;
  86. RAWKEY_F5 = $54;
  87. RAWKEY_F6 = $55;
  88. RAWKEY_F7 = $56;
  89. RAWKEY_F8 = $57;
  90. RAWKEY_F9 = $58;
  91. RAWKEY_F10 = $59;
  92. RAWKEY_HELP = $5F;
  93. RAWKEY_LSHIFT = $60;
  94. RAWKEY_RSHIFT = $61;
  95. RAWKEY_CAPSLOCK = $62;
  96. RAWKEY_LCTRL = $63; // Right Ctrl is the same for now
  97. RAWKEY_LALT = $64;
  98. RAWKEY_RALT = $65;
  99. RAWKEY_LCOMMAND = $66; // LAmiga|LWin|LApple|LMeta
  100. RAWKEY_RCOMMAND = $67; // RAmiga|RWin|RApple|RMeta
  101. RAWKEY_MENU = $6B; // Not on classic keyboards
  102. // Menu|Win|Compose
  103. // Dont use, its reserved
  104. RAWKEY_PRINTSCR = $6D; // Not on classic keyboards
  105. RAWKEY_BREAK = $6E; // Not on classic keyboards
  106. // Pause/Break
  107. RAWKEY_F12 = $6F; // Not on classic keyboards
  108. RAWKEY_HOME = $70; // Not on classic keyboards
  109. RAWKEY_END = $71; // Not on classic keyboards
  110. { The following keys can exist on CDTV, CD32 and "multimedia" keyboards:
  111. Rawkey |CD32 color&key |CDTV key |Comment
  112. ---------------+-------------------+----------+-----------
  113. = $72 Stop |Blue Stop |Stop |
  114. = $73 Play/Pause|Grey Play/Pause|Play/Pause|
  115. = $74 Prev Track|Charcoal Reverse |<< REW |
  116. = $75 Next Track|Charcoal Forward |>> FF |
  117. = $76 Shuffle |Green Shuffle | |Random Play
  118. = $77 Repeat |Yellow Repeat | |}
  119. RAWKEY_MEDIA_STOP = $72;
  120. RAWKEY_MEDIA_PLAY_PAUSE = $73;
  121. RAWKEY_MEDIA_PREV_TRACK = $74;
  122. RAWKEY_MEDIA_NEXT_TRACK = $75;
  123. RAWKEY_MEDIA_SHUFFLE = $76;
  124. RAWKEY_MEDIA_REPEAT = $77;
  125. // Extended raw keys (via IECLASS_EXTENDEDRAWKEY)
  126. RAWKEY_F13 = $0103;
  127. RAWKEY_F14 = $0104;
  128. RAWKEY_F15 = $0105;
  129. // Tags for keymap.library/ObtainKeyMapInfo()
  130. KEYMAPINFO_KEYMAPNODE = TAG_USER + 0; // (struct KeyMapNode *)
  131. KEYMAPINFO_GETCLASSICKEYBOARD = TAG_USER + 1; // Private, dont use
  132. KEYMAPINFO_SETCLASSICKEYBOARD = TAG_USER + 2; // Private, dont use
  133. // The following tags were added in V51
  134. KEYMAPINFO_INFOTEXT_ENGLISH = TAG_USER + 3; // (^STRPTR)
  135. KEYMAPINFO_INFOTEXT_LOCAL = TAG_USER + 4; // (^STRPTR)
  136. KEYMAPINFO_INFOTEXT_CHARSET = TAG_USER + 5; // (PLongWord)
  137. KEYMAPINFO_CLASSIC_ONLY = TAG_USER + 6; // (PLongWord)
  138. KEYMAPINFO_PC_ONLY = TAG_USER + 7; // (PLongWord)
  139. KEYMAPINFO_SETCHARSET = TAG_USER + 8; // (LongWord)
  140. // Tags for keymap.library/ObtainRawKeyInfo() (V51.7)
  141. RKI_SET_TYPE = TAG_USER + 0; // (LongWord)
  142. RKI_SET_VALUE = TAG_USER + 1; // (LongWord)
  143. RKI_GET_RAWKEY = TAG_USER + 2; // (PLongWord)
  144. RKI_GET_EXT_RAWKEY = TAG_USER + 3; // (PLongWord)
  145. RKI_GET_PS2_SET1 = TAG_USER + 4; // (PLongWord)
  146. RKI_GET_PS2_SET2 = TAG_USER + 5; // (PLongWord)
  147. RKI_GET_USB = TAG_USER + 6; // (PLongWord)
  148. RKI_GET_FLAGS = TAG_USER + 7; // (PLongWord)
  149. RKI_GET_NAME = TAG_USER + 8; // (^STRPTR)
  150. // Types for RKI_SET_TYPE
  151. RKITYPE_RAWKEY = 1; // Amiga 8bit rawkey code
  152. RKITYPE_EXT_RAWKEY = 2; // Amiga 16bit extended rawkey code
  153. RKITYPE_PS2_SET1 = 3; // PS/2 Set1 make or break code
  154. RKITYPE_PS2_SET2 = 4; // PS/2 Set2 make or break code
  155. RKITYPE_USB = 5; // USB HID Usage page and ID code (down)
  156. RKITYPE_USB_UPCODE = 6; // USB HID Usage page and ID code (up)
  157. // Tags for keymap.library/KeyMapControlTagList() (V53.8)
  158. KMCTRL_SetAltAmigaSwap = TAG_USER + 0; // (BOOL)
  159. KMCTRL_GetAltAmigaSwap = TAG_USER + 1; // (PBOOL)
  160. var
  161. KeymapBase: PLibrary = nil;
  162. const
  163. KEYMAPNAME: PChar = 'keymap.library';
  164. IKeymap: PInterface = nil;
  165. function KeymapObtain(): LongWord; syscall IKeymap 60;
  166. function KeymapRelease(): LongWord; syscall IKeymap 64;
  167. procedure KeymapExpunge(); syscall IKeymap 68;
  168. function KeymapClone(): PInterface; syscall IKeymap 72;
  169. procedure SetKeyMapDefault(KeyMap: PKeyMap); syscall IKeymap 76;
  170. function AskKeyMapDefault: PKeyMap; syscall IKeymap 80;
  171. function MapRawKey(Event: PInputEvent; Buffer: PChar; Length: LongInt; KeyMap: PKeyMap): SmallInt; syscall IKeymap 84;
  172. function MapANSI(TheString: PChar; Count: LongInt; Buffer: PChar; Length: LongInt; KeyMap: PKeyMap): LongInt; syscall IKeymap 88;
  173. function OpenKeyMapHandleA(const Filename: STRPTR; const TagList: PTagItem): APTR; syscall IKeymap 92;
  174. // 96 OpenKeyMapHandle
  175. procedure CloseKeyMapHandle(Handle: APTR); syscall IKeymap 100;
  176. function ObtainKeyMapInfoA(Handle: APTR; const TagList: PTagItem): APTR; syscall IKeymap 104;
  177. // 108 ObtainKeyMapInfo
  178. function ReleaseKeyMapInfoA(Handle: APTR; const TagList: PTagItem): APTR; syscall IKeymap 112;
  179. // 116 ReleaseKeyMapInfoA
  180. function ObtainRawKeyInfoA(const TagList: PTagItem): APTR; syscall IKeymap 120;
  181. // 124 ObtainRawKeyInfo
  182. function KeyMapControlTagList(const TagList: PTagItem): APTR; syscall IKeymap 128;
  183. // KeyMapControlTags
  184. implementation
  185. const
  186. { Change VERSION and LIBVERSION to proper values }
  187. LIBVERSION: LongWord = 0;
  188. initialization
  189. KeymapBase := OpenLibrary(KEYMAPNAME,LIBVERSION);
  190. if Assigned(KeymapBase) then
  191. IKeymap := GetInterface(PLibrary(KeymapBase), 'main', 1, nil);
  192. finalization
  193. if Assigned(IKeymap) then
  194. DropInterface(IKeymap);
  195. if Assigned(KeymapBase) then
  196. CloseLibrary(KeymapBase);
  197. end.