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