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