keymap.pas 8.1 KB

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