1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738 |
- {Set tabsize to 4.}
- {****************************************************************************
- $Id$
- KBDCALLS interface unit
- Free Pascal Runtime Library for OS/2
- Copyright (c) 1999-2000 by Florian Kl„mpfl
- Copyright (c) 1999-2000 by Daniel Mantione
- Copyright (c) 1999-2000 by Tomas Hajny
- The Free Pascal runtime library is distributed under the Library GNU Public
- License v2. So is this unit. The Library GNU Public License requires you to
- distribute the source code of this unit with any product that uses it.
- Because the EMX library isn't under the LGPL, we grant you an exception to
- this, and that is, when you compile a program with the Free Pascal Compiler,
- you do not need to ship source code with that program, AS LONG AS YOU ARE
- USING UNMODIFIED CODE! If you modify this code, you MUST change the next
- line:
- <This is an official, unmodified Free Pascal source code file.>
- Send us your modified files, we can work together if you want!
- Free Pascal 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
- Library GNU General Public License for more details.
- You should have received a copy of the Library GNU General Public License
- along with Free Pascal; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA.
- ****************************************************************************}
- unit KbdCalls;
- { Interface library to KBDCALLS.DLL (through EMXWRAP.DLL)
- Variant records and aliases for some record types created to maintain highest
- possible level of compatibility with other existing OS/2 compilers.
- Changelog:
- People:
- TH - Tomas Hajny ([email protected] on Internet)
- Date: Description of change: Changed by:
- - First released version 1.0 TH
- Coding style:
- I have tried to use the same coding style as Daniel Mantione in unit
- DOSCALLS, although I can't say I would write it the same way otherwise
- (I would write much more spaces myself, at least). Try to use it as well,
- please. Original note by Daniel Mantione follows:
- It may be well possible that coding style feels a bit strange to you.
- Nevertheless I friendly ask you to try to make your changes not look all
- to different. To make life easier, set your IDE to use tab characters,
- turn optimal fill, autoindent and backspace unindents on and set a
- tabsize of 4.}
- {***************************************************************************}
- interface
- {***************************************************************************}
- {$IFDEF FPC}
- {$PACKRECORDS 1}
- {$ENDIF FPC}
- const
- {return codes / error constants (those marked with * shouldn't occur under
- normal conditions)}
- No_Error = 0;
- Error_Invalid_Parameter = 87;
- Error_Sem_TimeOut =121;
- Error_Kbd_Parameter =373;
- Error_Kbd_No_Device =374; {*}
- Error_Kbd_Invalid_IOWait =375; {*}
- Error_Kbd_Invalid_Length =376;
- Error_Kbd_Invalid_Echo_Mask =377;
- Error_Kbd_Invalid_Input_Mask =378;
- Error_Kbd_Smg_Only =407; {*}
- Error_Kbd_Invalid_ASCIIZ =408;
- Error_Kbd_Invalid_Mask =409;
- Error_Kbd_Register =410;
- Error_Kbd_Deregister =411;
- Error_Kbd_Invalid_Handle =439;
- Error_Kbd_No_more_Handle =440;
- Error_Kbd_Cannot_Create_KCB =441;
- Error_Kbd_Codepage_Load_Incompl =442; {*}
- Error_Kbd_Invalid_CodePage_ID =443; {*}
- Error_Kbd_No_CodePage_Support =444; {*}
- Error_Kbd_Focus_Required =445;
- Error_Kbd_Focus_Already_Active =446; {*}
- Error_Kbd_Keyboard_Busy =447;
- Error_Kbd_Invalid_CodePage =448;
- Error_Kbd_Unable_To_Focus =449; {*}
- Error_Kbd_Detached =464;
- Error_Kbd_No_Console =500; {*}
- Error_Kbd_Extended_SG =504;
- {FnMask}
- kr_KbdCharIn =$00000001;
- kr_KbdPeek =$00000002;
- kr_KbdFlushBuffer =$00000004;
- kr_KbdGetStatus =$00000008;
- kr_KbdSetStatus =$00000010;
- kr_KbdStringIn =$00000020;
- kr_KbdOpen =$00000040;
- kr_KbdClose =$00000080;
- kr_KbdGetFocus =$00000100;
- kr_KbdFreeFocus =$00000200;
- kr_KbdGetCP =$00000400;
- kr_KbdSetCP =$00000800;
- kr_KbdXLate =$00001000;
- kr_KbdSetCustXT =$00002000;
- {WaitFlag}
- IO_Wait =0;
- {KbdCharIn: wait for a character if one is not available}
- {KbdGetFocus: wait for the focus}
- {KbdStringIn: in binary input mode, wait until CharBuf is full, in }
- { ASCII input mode wait until a carriage return is pressed}
- IO_NoWait =1;
- {KbdCharIn: immediate return if no character is available}
- {KbdGetFocus: do not wait for the focus}
- {KbdStringIn: send an immediate return if no characters are available,}
- { if characters available, send them (up to the maximum }
- { length); not supported in ASCII input mode }
- {TKbdInfo.fsMask}
- Keyboard_Echo_On =$0001; {echo is on}
- Keyboard_Echo_Off =$0002; {echo is off}
- Keyboard_Binary_Mode =$0004; {binary mode is on}
- Keyboard_ASCII_Mode =$0008; {ASCII mode is on}
- Keyboard_Modify_State =$0010; {shift state is modified}
- Keyboard_Modify_Interim =$0020; {interim character flags are modified}
- Keyboard_Modify_TurnAround =$0040; {turn-around character is modified}
- Keyboard_2B_TurnAround =$0080; {length of the turn-around character }
- {(meaningful only if }
- {Keyboard_Modify_TurnAround bit is on)}
- Keyboard_Shift_Report =$0100; {shift return is on}
- {TKbdInfo.fsState/TKbdKeyInfo.fsState/TKbdTrans.fsState}
- KbdStF_RightShift =$0001;
- KbdStF_LeftShift =$0002;
- KbdStF_Control =$0004;
- KbdStF_Alt =$0008;
- KbdStF_ScrollLock_On =$0010;
- KbdStF_Numlock_On =$0020;
- KbdStF_Capslock_On =$0040;
- KbdStF_Insert_On =$0080;
- KbdStF_LeftControl =$0100;
- KbdStF_LeftAlt =$0200;
- KbdStF_RightControl =$0400;
- KbdStF_RightAlt =$0800;
- KbdStF_ScrollLock =$1000;
- KbdStF_NumLock =$2000;
- KbdStF_CapsLock =$4000;
- KbdStF_SysReq =$8000;
- {TKbdTrans.fbStatus}
- KbdTrF_Shift_Key_In =$01; {shift status returned}
- {without character }
- KbdTrF_Extended_Key_In =$02; {extended key code }
- {from the keyboard,}
- {not a character }
- KbdTrF_Conversion_Request =$20; {immediate conversion}
- {requested }
- KbdTrF_Final_Char_In =$40; {either $40 or $80 or both}
- KbdTrF_Interim_Char_In =$80; {must be present }
- {TKbdHWID.idKbd}
- Keyboard_Undetermined =$0000; {undetermined keyboard type}
- Keyboard_AT_Compatible =$0001; {PC-AT Standard Keyboard}
- Keyboard_Enhanced_101 =$AB41; {101 Key Enhanced Keyboard}
- Keyboard_Enhanced_102 =$AB41; {102 Key Enhanced Keyboard}
- Keyboard_Enhanced_88_89 =$AB54; {88 and 89 Key Enhanced Keyboards}
- Keyboard_Enhanced_122 =$AB85; {122 Key Enhanced Keyboard}
- Keyboard_AT_Compatable=Keyboard_AT_Compatible;
- Keyboard_SpaceSaver=Keyboard_Enhanced_88_89;
- type
- {TKbdKeyInfo - record type for character data for KbdCharIn and KbdPeek}
- (* #pragma pack(2) ??? *)
- TKbdKeyInfo=record
- chChar:char; {ASCII character code; the scan code received}
- {from the keyboard is translated to the ASCII}
- {character code }
- case boolean of
- false:(
- chScan:byte; {scan Code received from the keyboard}
- fbStatus:byte; {state of the keystroke event, see KbdTrF_* constants}
- bNlsShift:byte; {NLS shift status (always 0?)}
- fsState:word; {shift key status, see KbdStF_* constants}
- Time:cardinal); {time stamp indicating when a key was pressed,}
- {specified in milliseconds from the time }
- {the system was started }
- true:(
- chScan2:char; (* should be chScan, fbStatus and bNlsShift, *)
- fbStatus2:byte; (* but this construct is unsupported currently *)
- bNlsShift2:char);
- end;
- PKbdKeyInfo=^TKbdKeyInfo;
- KbdKeyInfo=TKbdKeyInfo; {for better compatibility with other compilers}
- {record type for KbdStringIn}
- TStringInBuf=record
- cb:word; {length of the input buffer, maximum length is 255}
- cchIn:word; {number of bytes actually read into the buffer}
- end;
- PStringInBuf=^TStringInBuf;
- StringInBuf=TStringInBuf;
- {TKbdInfo record type, for KbdSet/GetStatus}
- TKbdInfo=record
- cb, {total length in bytes, 10 is the only valid value }
- fsMask, {see TKbdInfo.fsMask constants, higher bits reserved}
- {and set to 0 }
- chTurnAround, {definition of the turn-around character, in ASCII }
- {and extended-ASCII format, the turn-around character}
- {is defined as the carriage return, in ASCII format }
- {only, the turn-around character is defined in the }
- {low-order byte; usually $000D }
- fsInterim, {interim character flags: bits 0-4 and 6 - reserved }
- { and set to 0,}
- { bit 5 - application}
- { requested }
- { immediate }
- { conversion }
- { bit 7 - interim }
- { character }
- { flag is on }
- { bits 8-15 - NLS shift }
- { state }
- fsState:word; {shift state, see TKbdInfo.fsState constants}
- end;
- PKbdInfo=^TKbdInfo;
- KbdInfo=TKbdInfo;
- {record type for KbdGetHWID}
- TKbdHWID=record
- cb, {length in bytes, on input length of the TKbdHWID}
- {record (at least 2), on output the actual number}
- {of bytes returned }
- idKbd, {keyboard type: $0000 = undetermined keyboard type}
- { $0001 = PC-AT Standard Keyboard }
- { $AB41 = 101 Key Enhanced Keyboard }
- { $AB41 = 102 Key Enhanced Keyboard }
- { $AB54 = 88 and 89 Key Enhanced }
- { Keyboards }
- { $AB85 = 122 Key Enhanced Keyboard }
- {- see Keyboard_* constants }
- usReserved1, {reserved, returned set to zero (secondary ID?)}
- usReserved2:word; {reserved, returned set to zero}
- end;
- PKbdHWID=^TKbdHWID;
- KbdHWID=TKbdHWID;
- {record type for KbdXlate}
- (* #pragma pack(2) ???*)
- TKbdTrans=record
- case boolean of
- false:(
- CharData:TKbdKeyInfo);
- true:(
- chChar:char; {ASCII character code; the scan code received}
- {from the keyboard is translated to the ASCII}
- {character code }
- case boolean of
- false:(
- chScan, {scan Code received from the keyboard}
- fbStatus, {state of the keystroke event,}
- {see KbdTrF_* constants }
- bNlsShift:byte; {NLS shift status (always 0?)}
- fsState:word; {shift key status, see KbdStF_* constants}
- Time:cardinal; {time stamp indicating when a key was pressed,}
- {specified in milliseconds from the time }
- {the system was started }
- fsDD:word; {device driver returned flag, }
- {see KbdDDFlagWord notes below}
- fsXlate:word; {translation flag: 0 - translation incomplete,}
- { 1 - translation complete }
- fsShift:word; {identifies the state of translation across }
- {successive calls, initially the value should }
- {be zero; it may take several calls to this }
- {function to complete a character, the value }
- {should not be changed unless a new translation}
- {is required (that is, reset value to zero) }
- sZero:word); {reserved, set to 0}
- true:(
- chScan2, (* should be chScan, fbStatus and bNlsShift, *)
- fbStatus2, (* but this construct is unsupported currently *)
- bNlsShift2:char));
- end;
- PKbdTrans=^TKbdTrans;
- KbdTrans=TKbdTrans;
- {KbdDDFlagWord notes:
- bits 15-14 Available. These bits are available for communication between
- monitors; they are not used by the physical device driver. The
- monitor applications coordinate the use of these flags.
- Bits 13-10 Reserved, set to zero. Monitors must pass these flags as is.
- They must set these flags to 0 in packets they create.
- Bit 9 Accented. This key is translated using the previous key passed,
- which is an accent key. Where an accent key is pressed, and the
- following key does not use the accent, a packet containing the
- accent character itself is first passed with this bit set. The
- scan code field of MonFlagWord (see above) would be 0,
- indicating a non-key generated record. A valid packet
- containing that following keystroke is then passed without this
- bit set.
- Bit 8 Multimake. The translation process sees this scan code as
- a typematic repeat of a toggle key or a shift key. Because
- toggle and shift keys only change state on the first make after
- each key-break, no state information is changed. For example,
- the NumLock toggle bit in the shift status word is not changed,
- even though this can be the NumLock key. If this key is a valid
- character, it does not go into the Keyboard Input Buffer (KIB)
- once this bit is set.
- Bit 7 Secondary. The scan code prior to the one in this packet was
- the Secondary Key Prefix (see below).
- Bit 6 Key break. This record is generated by the release (the break)
- of the key involved.
- Bits 5-0 Key type. This numeric field flags the physical device driver
- and reports that this is a key that requires action. The number
- in this field is filled in during the translation of the scan
- code. The value allows the driver to act on keystrokes without
- regard for what scan codes the keyboard uses or character codes
- that the current translation process may be using. The
- following values are currently defined:
- - Value for keys that are always placed in the KIB.
- Zero = no special action, always place in KIB.
- - Values acted on prior to passing packet to monitors.
- Except for the final keystroke of the DUMP key sequences,
- all of these values are passed on to the monitors. They
- are not placed in the KIB. The XlatedChar and XlatedScan
- fields are undefined for these values:
- 01h ACK. This scan code is a keyboard acknowledge.
- Personal Computer IBM* AT* attached keyboards
- set this value on an FAh scan code.
- 02h Secondary key prefix. This scan code is a prefix
- generated by the Enhanced Keyboard. It indicates
- that the next scan code coming is one of the
- secondary keys that exists on that keyboard.
- Usually set on an E0h scan code or an E1h scan
- code.
- 03h Kbd overrun. This scan code is an overrun
- indication from the keyboard. On an IBM Personal
- Computer AT-attached keyboard, this value would be
- set on an FFh scan code.
- 04h Resend. This scan code is a resend request from the
- keyboard. On an IBM Personal Computer AT-attached
- keyboard, this value would be set on an FEh scan
- code.
- 05h Reboot key. This scan code completes the multi-key
- restart sequence. On an IBM Personal Computer AT
- attached-keyboard, this value would be used when
- the Ctrl+Alt+Delete sequence is used.
- 06h Dump key. This scan code completes the multi-key
- Stand Alone Dump request sequence. On an IBM
- Personal Computer AT-attached keyboard, this value
- would be used on completion of the second
- consecutive press of Ctrl+Alt+NumLock or
- Ctrl+Alt+F10 without other keystrokes between the
- two presses.
- 07h-
- 0Ah See entries below.
- 0Bh Invalid accent combination. This scan code follows
- an accent scan code but the combination is not
- valid, and neither key is put in the KIB.
- (Note: This is set if the Canadian-French code
- pages are in use.)
- 0Ch System-defined hot keys.
- 0Dh
- -0Fh Reserved. Treated as undefined. See entry 3Fh.
- - Values acted on after passing packet to monitors. Except
- where noted, these values are placed in the KIB when the
- physical device driver is in binary mode; they are not
- placed in the KIB when the physical device driver is in
- ASCII mode. (Also listed are those that never get placed
- in the KIB.)
- 07h Shift key. This scan code translates as a shift key
- and affects the shift status fields of the CharData
- record, but does not generate a defined character.
- It is not placed in the KIB. The XlatedChar field
- is undefined. The scan code field is 0.
- 08h Pause key. This scan code is translated as the key
- sequence meaning pause. On an IBM Personal Computer
- AT-attached keyboard, this value is used when the
- Ctrl+NumLock sequence is used. The key itself is
- not placed in the KIB.
- 09h Pseudo-Pause key. This scan code is translated into
- the value that is treated as the Pause key when the
- physical device driver is in ASCII mode. On most
- keyboards, this would be when the Ctrl+S
- combination is used. The key itself is not placed
- in the KIB.
- 0Ah Wake-up key. This scan code follows a Pause key or
- Pseudo-Pause key, which causes the Pause state to
- end. The key itself is not placed in the KIB.
- 10h Accent key. This scan code is translated and used
- as a key to alter the translation of the next key
- to come in. The packet containing this value is
- passed when the accent key is pressed, but it is
- not put into the KIB, unless the Accented bit is
- ON. The next key determines this decision. If the
- next key is one that can be accented, then it is
- passed by itself with the Accented bit ON. If that
- next key cannot be accented by this accent, then
- two packets are passed. The first contains the
- character to print for the accent itself. It has
- the Accent key value and the Accented flag (which
- allows the packet to be put in the KIB). The second
- packet contains a regular translation of that
- following key.
- (Note: The two packets get passed for every
- language except Canadian-French - see entry 0Bh.)
- 11h Break key. This scan code is translated as the key
- sequence meaning break. On the IBM Personal
- Computer AT-attached keyboard, this value is used
- where the Ctrl+Break sequence is used.
- 12h Pseudo-Break key. This scan code is translated into
- the value that is treated as the Break key when the
- physical device driver is in ASCII mode. On most
- keyboards, this would be when the Ctrl+C
- combination is used. Notice that the event
- generated by this key is separate from the one
- generated by the Break key when in the binary mode.
- 13h Print Screen key. This scan code is translated as
- the key sequence meaning Print Screen. On an IBM
- Personal Computer AT-attached keyboard, this value
- is used where the Shift+PrtSc sequence is used.
- 14h Print Echo key. This scan code is translated as the
- key sequence meaning Print Echo. This value is used
- where the Ctrl+PrtSc sequence is used.
- 15h Pseudo-Print Echo key. This scan code is translated
- into the value that is treated as the Print Echo
- key when the physical device driver is in ASCII
- mode. On most keyboards, this would show as the
- Ctrl+P combination.
- 16h Print-Flush key. This scan code is translated into
- the key sequence Print-Flush. This value is used
- where the Ctrl+Alt+PrtSc sequence is used.
- 17h
- -2Fh Reserved, set to zero. Treated as undefined. See
- entry 3Fh.
- - Values for packets not generated by a keystroke:
- 30h
- -37h Reserved.
- 38h
- -3Eh Reserved. Treated as undefined. See entry 3Fh.
- - Value for keys the translation process does not recognize:
- 3Fh Undefined. This scan code, or its combination with
- the current shift state, is not recognized in the
- translation process.
- }
- {header of TXLateTbl}
- TXHeader=record
- XTableID:word; {code page number}
- XTableFlags1:word; {bits 0-2 determine which shift key or key }
- {combination affects Char3 of each TXLateKeyDef }
- {element, bits 7-10 determine which shift key or}
- {key combination causes Char5 to be used in each}
- {TXLateKeyDef element }
- {bit 0 - ShiftAlt (use Shift+Alt instead of }
- { Ctrl+Alt) }
- {bit 1 - AltGrafL (use left Alt key as }
- { Alt+Graphics) }
- {bit 2 - AltGrafR (use right Alt key as }
- { Alt+Graphics) }
- {bit 3 - ShiftLock (treat Caps Lock as }
- { ShiftLock) }
- {bit 4 - DefaultTable (default table for the }
- { language) }
- {bit 5 - ShiftToggle (1 = toggle ShiftLock, }
- { 0 = latch it) }
- {bit 6 - AccentPass (pass accent and non-accent }
- { key through; 1 = pass on accent keys}
- { and beep, 0 = beep only }
- {bit 7 - CapsShift (Caps+Shift uses Char5) }
- {bit 8 - MachDep (machine-dependent table) }
- {bits 9-10 reserved }
- {bits 11-15 reserved }
- XTableFlags2:word; {reserved, set to zero}
- KbdType:word; {keyboard type, 1 for extended (all common types)}
- KbdSubType:word; {reserved}
- XtableLen:word; {length of table}
- EntryCount:word; {number of KeyDef entries}
- EntryWidth:word; {width of KeyDef entries}
- Country:word; {language ID}
- TableTypeID:word; {the table type; 1st byte (type): 01X 00X }
- { 2nd byte (sub-type): 00X reserved}
- SubCountryID:cardinal;
- {sub-language identifier}
- Reserved:array[1..8] of word;
- end;
- PXHeader=^TXHeader;
- {element of TXLateTbl, not all entries are used (unused entries are zero)}
- TXLateKeyDef=record
- XlateOp:word; {translate operation specifier; }
- {bits 0- 6 - AccentFlags (see Notes 1 and 8)}
- {bits 7-15 - KeyType (see Note 2) }
- Char1:char;
- Char2:char;
- Char3:char;
- Char4:char;
- Char5:char;
- end;
- PXLateKeyDef=^TXLateKeyDef;
- {record type for character definition in TAccentEntry}
- TKeyCode=record
- CharCode:char;
- ScanCode:byte;
- end;
- {accent entry definitions for TAccentTable, see Notes 1 and 9}
- TAccentEntry=record
- NonAccent:TKeyCode; {char/scan code when}
- {not used as accent }
- CtlAccent:TKeyCode; {char/scan code when}
- {used with Ctrl key }
- AltAccent:TKeyCode; {char/scan code when}
- {used with Alt key }
- Maps:array[1..20] of TKeyCode; {from char-to-char for translation}
- end;
- PAccentEntry=^TAccentEntry;
- {table of accent key definitions for TXLateTbl}
- TAccentTable=array[1..7] of TAccentEntry;
- PAccentTable=^TAccentTable;
- {record type for SetCustXT, one element for each possible scan code
- (entries are in scan code order, based on the remapped scan codes
- returned by the keyboard controller)}
- TXLateTbl=record
- XHeader:TXHeader;
- KeyDefs:array [1..127] of TXLateKeyDef;
- AccentTbl:TAccentTable;
- end;
- PXLateTbl=^TXLateTbl;
- {Remarks for TXLateTbl record type:
- The request changes the device driver resident code page for the system
- and updates the zero entry of the Code Page Control Block.
- * Note 1
- The AccentFlags field of the KeyDef record has seven flags that are
- individually set if a corresponding entry in the accent table applies to this
- scan code. If the key pressed immediately before the current one was an
- accent key and the bit for that accent is set in the AccentFlags field for
- the current key, the corresponding AccentTable entry is searched for the
- replacement character value to use. If no replacement is found and bit 6 of
- the XlateFlags1 field is set, the not-an-accent beep is sounded and the
- accent character and current character are passed as two separate
- characters. Also see Note 8.
- * Note 2
- The KeyType field of the KeyDef record currently has the following values
- defined. The remaining values up to 1Fh are undefined. The effect of each
- type of shift is defined below. Except where otherwise noted, when no
- shifts are active, Char1 is the translated character. (See Note 3.) Notice
- that any of the Alt, Alt+Char, Alt+Shift, or Alt+Gr keys (or all of them) can
- be present on a keyboard based on the AltGrafL and AltGrafR bits in the
- XTableFlags1 flag word in the table header.
- 01h AlphaKey. Alphabetical character key:
- Shift Uses Char2. If Caps Lock, uses Char1.
- Caps Lock Uses Char2. If Shift, uses Char1.
- Ctrl Set standard control code for this key's Char1 value.
- See Note 4.
- Alt Standard extended code. See Note 7.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 02h SpecKey. Special nonalphabetic character key, no Caps Lock or Alt:
- Shift Uses Char2.
- Caps Lock No effect, only depends on Shift, or Ctrl.
- Ctrl See Note 4.
- Alt Marked undefined.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 03h SpecKeyC. Special nonalphabetic character key with Caps Lock. See
- Note 15.
- Shift Uses Char2. If Caps Lock, uses Char1.
- Caps Lock Uses Char2. If Shift, uses Char1.
- Ctrl See Note 4.
- Alt Uses Char4, if not zero. See Note 7.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 04h SpecKeyA. Special nonalphabetic character key with Alt (no Caps
- Lock):
- Shift Uses Char2.
- Caps Lock No effect; depends on Shift, Ctrl, or Alt only.
- Ctrl See Notes 5 and 9.
- Alt See Notes 7 and 10.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 05h SpecKeyCA. Special nonalphabetic character key with Caps Lock and
- Alt:
- Shift Uses Char2. If Caps Lock, uses Char1.
- Caps Lock Uses Char2. If Shift, uses Char1.
- Ctrl See Note 4.
- Alt See Note 7.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 06h FuncKey. Function keys. Char1 = n in Fn; Char2 ignored. Sets
- extended codes 58+Char1, if no shift; if F11 or F12, uses 139 and 140.
- Shift Sets extended codes 83+Char1. F11 and F12 use 141
- and 142, respectively.
- Caps Lock No effect on function keys.
- Ctrl Sets extended codes 93+Char1. F11 and F12 use 143
- and 144, respectively.
- Alt Sets extended codes 103+Char1. F11 and F12 use 145
- and 146, respectively.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 07h PadKey. Keypad keys (see Note 5 for definition of Char1). Note that
- nonshifted use of these keys is fixed to the extended codes:
- Shift Uses Char2, unless Num Lock. See Note 5.
- Caps Lock No effect on pad keys, unless Num Lock. See Note 5.
- Ctrl Sets extended codes. See Note 5.
- Alt Used to build a character. See Note 5.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 08h SpecCtlKey. Special action keys, when used with Ctrl pressed:
- Shift No effect on these keys.
- Caps Lock No effect on these keys.
- Ctrl Uses Char2.
- Alt See Note 7.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 09h PrtSc. Print Screen key; sets Char1 normally (see Note 17):
- Shift Signal the Print Screen function.
- Caps Lock No effect on this key.
- Ctrl Sets extended code and signals the Print Echo function.
- Alt Marked undefined.
- Alt+Char Uses Char3, if it is not 0.
- Alt+Shift Uses Char3, if it is not 0.
- Alt+Gr Uses Char3, if it is not 0.
- 0Ah SysReq. System Request key; treated like a shift key. See Note 6.
- 0Bh AccentKey. Keys that affect the next key pressed (also known as
- dead keys). Char1 is an index into the AccentTbl field of the
- XlateTable, selecting the AccentEntry that corresponds to this key.
- Char2 and Char3 do the same for the shifted Accent character. See
- Note 15.
- Shift Uses Char2 to index to applicable AccentEntry.
- Caps Lock No effect on this key.
- Ctrl Uses CtlAccent character from AccentEntry. See Note 8.
- Alt Uses AltAccent character from AccentEntry. See Note 8.
- Alt+Char Uses Char3 to index to applicable AccentEntry.
- Alt+Shift Uses Char3 to index to applicable AccentEntry.
- Alt+Gr Uses Char3 to index to applicable AccentEntry.
- Note: Key types 0Ch - 13h set Char1 and Char2 to mask values as defined
- in Note 6.
- 0Ch ShiftKeys. Shift or Ctrl key, sets and clears flags. Char1 holds the
- bits in the lower byte of the shift status word to set when the
- key is down and clear when the key is released. Char2 does the
- same thing for the upper byte of the shift status word unless the
- secondary key prefix (hex E0) is seen immediately prior to this key,
- in which case Char3 is used in place of Char2.
- 0Dh ToggleKey. General toggle key (like Caps Lock). Char1 holds the
- bits in the lower byte of the shift status word to toggle on the
- first make of the key after it is pressed. Char2 holds the bits in
- the upper byte of the shift status word to set when the key is
- down and clear when the key is released unless the secondary key
- prefix (hex E0) is seen immediately prior to this key, in which case
- Char3 is used in place of Char2.
- 0Eh AltKey. Treated just like ShiftKeys above, but has its own key
- type, because when seen, the accumulator used for Alt+PadKey
- entry is zeroed to prepare such entry (see Note 5). Sometimes this
- key is treated as the AltC/S/G key (that is, either Alt+Char,
- Alt+Shift, or Alt+Gr) if one of the AltGraf bits is on in XTableFlags1.
- 0Fh Num Lock. Normally behaves like ToggleKey, but the physical
- keyboard device driver sets a pause screen indication when this
- key is used with the Ctrl key pressed. The pause is cleared on the
- following keystroke if that stroke is a character-generating key.
- 10h Caps Lock. This key is treated as a type 0Dh toggle key. It has a
- separate entry here so that it can be processed like a Shift Lock
- key when that flag is set in the XTableFlags1 word in the header.
- When treated as a Shift Lock, the Caps Lock flag in the shift
- status word is set on on any make of this key, and only cleared
- when the left or right shift key is pressed. Char2 and Char3 are
- processed the same as ToggleKey.
- 11h Scroll Lock. Normally behaves like ToggleKey but has a separate
- entry here. When used with Ctrl, it can be recognized as
- Ctrl+Break.
- 12h XShiftKey. Extended Shift Key (for Country support). See Note 9.
- 13h XToggleKey. Extended Toggle Key (for Country support). See Note 9.
- 14h SpecKeyCS. Special key 1 for country keyboard processing. See Note 15.
- Shift Uses Char2.
- Caps Lock Uses Char4.
- Ctrl See Note 4.
- Alt See Note 7.
- Alt+Char Uses Char3.
- Alt+Shift Uses Char3.
- Alt+Gr Uses Char3.
- Caps+Shift Uses Char5.
- 15h SpecKeyAS. Special key 2 for country keyboard processing. See Note 15.
- Shift Uses Char2.
- Caps Lock No effect on this key.
- Ctrl See Note 4.
- Alt Uses Char 4. See Note 14.
- Alt+Char Uses Char 3. See Note 14.
- Alt+Shift Uses Char 3. See Note 14.
- Alt+Gr Uses Char 3. See Note 14.
- 1Ah Extended Extended key. This corresponds to the BIOS level support
- provided for INT 16h, Functions 20h, 21h, and 22h.
- Shift Uses Char2.
- Caps Lock No effect on this key.
- Ctrl Uses Char4.
- Alt Uses Char5.
- Alt+Char Uses Char 3, if not 0.
- Alt+Shift Uses Char 3, if not 0.
- Alt+Gr Uses Char 3, if not 0.
- 16h-
- 1FFh Reserved, except for 1Ah, the Extended Extended key (see above).
- * Note 3
- Undefined Character Code. Any key combination that does not fall into any
- of the defined categories. For example, the Ctrl key pressed along with a
- key that has no defined control mapping is mapped to the value 0, and the
- key type is set in the KeyPacket record indicating undefined translation.
- The KeyPacket record passed to the monitors, if installed, contain the
- original scan code in the ScanCode field and the 0 in the Character field for
- this key. Notice that no character data records with an undefined character
- code are placed in the keyboard input buffer.
- * Note 4
- Ctrl Key. The six possible situations that can occur when a key is pressed
- with only the Ctrl+shift key are shown below:
- - The key pressed is an AlphaKey character. In this case, the Ctrl plus
- Char1 combination defines one of the standard defined control codes
- (all numbers are decimal):
- Ctrl- Mapping Code Name Ctrl- Mapping Code Name
- ----- ------- --------- ----- ------- ---------
- a 1 SOH n 14 SO
- b 2 STX o 15 SI
- c 3 ETX p 16 DLE
- d 4 EOT q 17 DC1
- e 5 ENQ r 18 DC2
- f 6 ACK s 19 DC3
- g 7 BEL t 20 DC4
- h 8 BS u 21 NAK
- i 9 HT v 22 SYN
- j 10 LF w 23 ETB
- k 11 VT x 24 CAN
- l 12 FF y 25 EM
- m 13 CR z 26 SUB
- Notice that any key defined as AlphaKey uses the Char1 code value
- minus 96 (ASCII code for a) plus 1 to set the mapping shown above.
- Any scan code defined as AlphaKey must assign to Char1 one of the
- allowed lower case letters.
- - The key pressed is a nonalpha character, such as [, but is not an action
- key, such as Enter, Backspace, or an arrow key. This is a
- SpecKey[C][A] in the list of key types in the previous example. In this
- case, with one exception, the mapping is based on the scan code of the
- key. Though the key can be relabeled, the Ctrl+Char combination is
- always mapped based on the scan code of the key using the following
- table (all numbers are decimal):
- }(*
- Scan US Kbd Mapped Name of
- Code Legend Value New Code
- ---- ------ ------ --------
- 3 2 @ 0 Null
- 7 6 ^ 30 RS
- 12 - _ 31 US (see Note below)
- 26 [ { 27 Esc
- 27 ] } 29 GS
- 43 \ | 28 FS
- *){
- Note: The mapping for the hyphen character (-) is the one exception.
- The scan code for it is ignored; only the ASCII code for hyphen
- (decimal 45) is looked for in Char1 when mapping the Ctrl+-
- combination. This is because there can be more than one
- occurrence of the hyphen (-) key on the keyboard. The Ctrl+-
- (PadKey minus) combination produces character/scan code values
- of 00/8Eh, respectively.
- - The key pressed is an action key such as Enter, Backspace, or an arrow
- key. These keys generate special values when used in conjunction with
- the Ctrl key. Those actions are defined in other notes where they
- apply. Two particular keys in this category are:
- Ctrl+Enter = LF(010)
- Ctrl+Backspace = Del(127)
- - The key pressed is a function key, F1 - F12. See the FuncKey
- description in Note 2.
- - The key pressed is an accent key. See Note 8.
- - The key is not defined in conjunction with Ctrl. In this case, the key
- is treated as undefined, as described in Note 3.
- * Note 5
- PadKey. The pad keys have several uses that depend on various shift
- states. Some of them are based on their position on the keyboard. Because
- keyboard layouts change, the hard-coded assumed positions of the keypad
- keys, with the offset value that must be coded into Char1, are defined
- below. Any remapping must use the Char1 values shown below for the keys
- that correspond to the pad keys given by the Legend or Char2 values:
- US Kbd Scan Char1 Char2
- Legend Code Required US Kbd With Ctrl
- ------- ---- --------- ------- -----------
- Home 7 71 Decimal 0 ASCII 7 Decimal 119
- Up 8 72 " 1 " 8 " 141
- PgUp 9 73 " 2 " 9 " 132
- - 74 " 3 " - " 142
- Left 4 75 " 4 " 4 " 115
- 5 76 " 5 " 5 " 143
- Right 6 77 " 6 " 6 " 116
- + 78 " 7 " + " 144
- End 1 79 " 8 " 1 " 117
- Down 2 80 " 9 " 2 " 145
- PgDn 3 81 " 10 " 3 " 118
- Ins 0 82 " 11 " 0 " 146
- Del . 83 " 12 " . " 147
- Notice that when Num Lock is off, or if Shift is active and Num Lock on, the
- code returned is the extended code. The code returned corresponds to the
- Legends above (Home, PgUp, and so forth). When Num Lock is on, or if
- Shift is active and Num Lock is off, the code returned is Char2. Notice that
- the + and - keys also return Char2 when the shift key is down.
- When the Alt key is used with the PadKeys, the absolute value of the
- pressed key (looked up using the required Char1 value) is added to the
- accumulated value of any of the previous numeric keys pressed, without
- releasing the Alt key. Before adding the new number to the accumulated
- value, that accumulation is multiplied by ten, with overflow beyond 255
- ignored. When Alt is released, the accumulation becomes a Character code
- and is passed along with a scan code of zero. Notice that if any key other
- than the 10 numeric keys is pressed, the accumulated value is reset to zero.
- When the keypad *, -, or + keys are pressed while the Alt key is down, the
- extended characters 55, 74, and 78 (decimal) are returned, respectively.
- When AltGraphics is used with the PadKeys, the Char3 value is returned if it
- is nonzero, and if an AltGraf bit is set in XTableFlags1; otherwise, it is
- treated the same as the Alt key.
- On the Enhanced keyboard, the secondary keypad keys return, as an
- extended character, the scan code of the key plus 80 (decimal) when
- pressed in conjunction with the Alt key. The secondary / key returns an
- extended character of 164, when pressed in conjunction with the Alt key.
- * Note 6
- State Key. Each state key entry has Char1, Char2, and Char3 defined as
- follows:
- - Char1. A mask to set the appropriate bit in the low byte of the
- keyboard Shift Flags when the state key is pressed. When the state
- key is a toggle key, the set bit is toggled each additional time the key
- is pressed. When the state key is not a toggle key, the set bit is
- cleared when the key is released.
- - Char2. A mask to set the appropriate bit in the high byte of the
- Keyboard Shift Flags when the key is pressed.
- - Char3. Used in place of Char2 when the secondary key prefix is seen
- immediately prior to this key.
- The masks are shown below (numbers are in hex):
- Key Char1 Char2 Char3
- ----------- ----- ----- -----
- Right Shift 01 00 00
- Left Shift 02 00 00
- Ctrl Shift 04 01 04
- Alt Shift 08 02 08
- Scroll Lock 10 10 10
- Num Lock 20 20 20
- Caps Lock 40 40 40
- SysReq 00 80 80
- Notice that the INS key is not treated as a state key, but as a pad key.
- Also, SysReq is included here because it is treated as a shift key.
- * Note 7
- Alt Character. Most of the keys defined in a category that allows the Alt
- key (AlphaKey, SpecKeyA, SpecKeyCA) return a value called an extended
- character. This value is a character code of 00H or E0H, with a second byte
- (using the ScanCode field of the CharData record) defining the extended
- code. In most cases, this value is the scan code of the key. Since the
- legend on these keys can be remapped on a foreign language keyboard, the
- Alt-based extended code is hard to define in a general sense. The following
- rules are used:
- - AlphaKey. The extended code is derived from Char1 (the lower-case
- character) as it was originally mapped on the PC keyboard. The
- original scan code value is the extended code that a character returns.
- These keys can be moved and will still return their original Alt
- extended codes.
- - SpecKeyA and SpecKeyCA. This category is used for all keys that are
- not an alphabetic character or an action code (like Enter or Backspace,
- the only exception being the Tab key, which is treated as a character).
- On foreign keyboards, these keys can be moved around and can have
- new values assigned to them, such as special punctuation symbols.
- Therefore, the Alt mappings must be based on the real scan code as
- any keys defined by the SpecKey_ classification will have only an Alt
- mapping, if it is in one of the positions defined below. In that case,
- the Alt extended code is as shown:
- }(*
- Scan US Kbd Alt Scan US Kbd Alt
- Code Legend Value Code Legend Value
- ---- ------ ----- ---- ------ -----
- 2 1 ! 120 15 Tab 165
- 3 2 @ 121 26 [ { 26
- 4 3 # 122 27 ] } 27
- 5 4 $ 123 28 Enter 28
- 6 5 % 124 39 ; : 39
- 7 6 ^ 125 40 ' " 40
- 8 7 & 126 41 ' ~ 41
- 9 8 * 127 43 \ | 43 (equals W.T.C. key number 42)
- 10 9 ( 128 51 , < 51
- 11 0 ) 129 52 . > 52
- 12 - _ 130 53 / ? 53
- 13 = + 131
- *){
- The secondary / key returns an extended character of 164 when
- pressed while Alt is down.
- - FuncKey. Defined in Note 2.
- - SpecCtlKey. The Alt+ values of the Escape, Backspace, and Enter keys
- are extended characters equaling 1, 14, and 28 (decimal), respectively.
- When AltGraphics is used, the Char3 value is returned if it is nonzero and if
- an AltGraf bit is set in XTableFlags1. Otherwise, it is treated the same as
- the Alt key.
- * Note 8
- Accent Key. When an accent key is pressed with Ctrl or Alt, it is treated as
- a regular key. The character it translates to is the one in the CtlAccent or
- AltAccent field of the AccentEntry pointed to by the Char5 value of the
- KeyDef. If the key being defined has no defined value with Ctrl or Alt, it
- should have zeros in the field of the undefined combination.
- When an accent key is pressed by itself (or with Right Shift, Left Shift, or
- AltGraphics), it is not translated immediately. The Char1 (or Char2, when
- Left or Right Shift or AltGraphics is used) index in the KeyDef record is
- used with the next key received to check if the next key has an accent
- mapping. If that next key has no mapping for this accent (that is, if it has
- no bit set in its AccentFlags), or if that next key is not found in this
- accent's AccentEntry, then the character value in the NonAccent field of the
- AccentEntry is used as the character to display. It is followed by the
- translation of that next key after the not-an-accent beep is sounded.
- Notice that if a key doesn't change when a Left or Right Shift key is
- pressed, it should use the same value for Char1 and Char2 so the accent
- applies in both the shifted and nonshifted cases. If the accent value is
- undefined when used with a shift key or AltGraphics, the value in Char2 or
- Char3 should be 0.
- Any accent key that doesn't have an Alt or Ctrl mapping should put zeros in
- the AltAccent and CtlAccent fields of its AccentEntry. If the value in the
- table is between 1 and 7, then the key is considered an accent key and
- further accent key processing is indicated. See Note 1 for more information.
- * Note 9
- Extended State Key. For special Country support, the keyboard device
- driver maintains another byte of shift status. Key types 12h and 13h are
- provided for manipulation of that byte. The other fields of the KeyDef are:
- - Char1. A mask in which bits that are on define the field being used for
- the Char2 value. Only bits in the NLS shift status byte that correspond
- to the bits in this byte are altered by the Char2 value.
- - Char2. For KeyType 12h (Extended Shift), the value to OR into the
- byte when the make code is seen. Also, the inverted value is ANDed
- when the break code is seen. For KeyType 13h (Extended Toggle), the
- value XORed into the byte on each make code seen (break code
- ignored).
- - Char3. Use in place of the Char2 when the secondary key prefix (hex
- E0) is seen immediately prior to this key.
- For example, Char1 or Char2 can define single shift status bits to
- set/clear/toggle. Char2 can be a set of coded bits, delineated by Char1, that
- are set to a numeric value when the key is pressed and cleared to zero
- when released (or on the next press, if toggled). The whole byte can be
- set to Char2 when Char1 has all bits on.
- * Note 10
- Space Key. The key treated as the space character should have a flag set
- in its AccentFlags field for each possible accent (that is, for each defined
- AccentEntry in the AccentTable). And each AccentEntry should have the
- Space character defined as one of its accented characters, with the
- translation having the same value as the accent character itself. The reason
- for this is that, by definition, an Accent Key followed by the space
- character maps to the accent character alone. If the table is not set up as
- just described, a not-an-accent beep is sounded whenever the accent key
- followed by a space is pressed.
- Notice that the space key is defined as a SpecKeyA (type 4) because its
- use, in conjunction with the Alt key, is allowed. In this case, and when
- used with the Ctrl key, it returns the ASCII space character. This works
- correctly, except in the case of the diaresis accent (double-dot) in code
- page 437. The space is treated as an invalid character and the beep result
- occurs, with the diaresis represented by double quotation marks. The
- characters displayed depend upon the language in effect when the invalid
- diaresis is encountered. For some languages, the character substituted is
- the double-quotation marks; for others, the character used is the F9h
- character.
- * Note 11
- KbdType identifies the hardware-specific keyboard used by this table. The
- values and allowable types are the same as those specified in IOCTL call
- KBD_GETKEYBDTYPE (1 means extended keyboard, which is used for all common
- keyboard types).
- * Note 12
- The DefaultTable flag in XtableFlags1 is used by the KEYB utility in loading
- code pages when changing from one language to another. It identifies the
- default code page to KEYB, should KEYB not find one or both CODEPAGE=
- defined code pages.
- * Note 13
- The Language IDs and Subcountry IDs used are as follows:
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³Keyboard Layout ³Keyboard Layout ³Country ³
- ³Country Code ³SubCountry Code ³ ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ AR ³ 785 ³Arabic-speaking ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ BE ³ 120 ³Belgium ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ CF ³ 058 ³Canadian-French ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ CS ³ 243 ³Czech Republic ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ CS ³ 245 ³Czech Republic ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ DK ³ 159 ³Denmark ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ SU ³ 153 ³Finland ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ FR ³ 120 ³France ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ FR ³ 189 ³France ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ GR ³ 129 ³Germany ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ HE ³ 972 ³Hebrew-speaking ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ HU ³ 208 ³Hungary ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ IS ³ 197 ³Iceland ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ IT ³ 141 ³Italy ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ IT ³ 142 ³Italy ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ LA ³ 171 ³Latin-American ³
- ³ ³ ³Spanish ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ NL ³ 143 ³Netherlands ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ NO ³ 155 ³Norway ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ PL ³ 214 ³Poland ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ PO ³ 163 ³Portugal ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ SP ³ 172 ³Spain ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ SV ³ 153 ³Sweden ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ SF ³ 150F ³Swiss-French ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ SG ³ 150G ³Swiss-German ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ TR ³ 179 ³Turkey ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ UK ³ 166 ³United Kingdom ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ UK ³ 168 ³United Kingdom ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ US ³ 103 ³United States ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´
- ³ YU ³ 234 ³Former Yugoslavia ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
- * Note 14
- Keytype 15. When the Alt or Alt+Shift keys are pressed, both XlatedChar
- and XlatedScan in the CharData record will have the same value.
- * Note 15
- If the Charx value is in the range of 1-7, then Charx identifies an accent
- key. Otherwise, Charx is treated as a valid ASCII character. This does not
- apply to Ctrl+Charx sequences.
- Note 16
- If Alt+Gr, Alt+Shift, or Alt+Ctrl are pressed, and Char3 is 0, the Alt key is
- used to translate to a valid result.
- Note 17
- The * key on the keypad of the Enhanced keyboard, although producing the
- same scan code/character as that of the IBM Personal Computer AT*
- keyboard, is treated differently because a dedicated Print Screen key exists
- on the Enhanced keyboard. The following scan codes/characters are
- returned by the physical keyboard device driver for the Enhanced keyboard
- * key on the keypad:
- Unshifted 37H/2AH
- Shifted 37H/2AH
- Ctrl 96H/00
- Alt 37H/00
- * Note 18
- Size. The code page described here has the following dimensions:
- Xlate Header = 40
- 127 KeyDefs @ 7 bytes = 889
- 7 AccentEntries @ 46 bytes = 322
- ----
- 1251 bytes
- If more than 6 AccentEntries are needed, then the following format is used:
- In the first 6 AccentEntries, the length is set at 20, with unused elements
- set to zero. For each AccentEntry of 7 and greater, up to 120 element pairs
- may exist, and the length is dynamic.
- For each AccentEntry of 7 and greater, the first byte in the record will
- contain the LENGTH of the AccentEntry record. The LENGTH value is defined
- as the total length in bytes of the AccentEntry record including the LENGTH
- byte.
- The record is defined as follows:
- AccEnt <l,a,b,c,d,e,f,c1,s1,c2,s2..c120,s120>
- where....
- l is the total length in bytes of the AccEnt including itself.
- a &b are the scan code &char to use when the key following this accent
- is not affected by the accent so the accent itself must be used.
- c &d are the scan code &char to use when Ctl+[accent] is pressed.
- e &f do the same for Alt+[accent].
- c1,s1 - c120,s120 are the char/scan code mapping for accented translation.
- Adding more than 7 accents will make the standard 1251-byte table an
- extended variable size.
- }
- {Register a keyboard subsystem within a session.}
- {ModuleName - dynamic link module name, maximum length is 8 bytes, ProcName is
- a dynamic link entry point name of a routine that receives control when any of
- the registered functions are called. Maximum length is 32 bytes, FnMask - see
- KR_* constants}
- {Possible return codes:
- 0 No_Error
- 408 Error_Kbd_Invalid_ASCIIZ
- 409 Error_Kbd_Invalid_Mask
- 410 Error_Kbd_Register
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * There can be only one KbdRegister call outstanding for each session without
- an intervening KbdDeRegister. KbdDeRegister must be issued by the same
- process that issued the KbdRegister.}
- function KbdRegister(ModuleName,ProcName:PChar;FnMask:cardinal):word; cdecl;
- function KbdRegister(ModuleName,ProcName:string;FnMask:cardinal):word;
- {Deregister a keyboard subsystem previously registered within a session - only
- the process that issued the KbdRegister may issue KbdDeRegister.}
- {Possible return codes:
- 0 No_Error
- 411 Error_Kbd_Deregister
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- function KbdDeRegister:word; cdecl;
- {Return a character data record from the keyboard.}
- {Key - see TKbdKeyInfo record type, WaitFlag - see IO_Wait and IO_NoWait
- constants, KbdHandle is the default keyboard (0) or a logical keyboard.}
- {Possible return codes are:
- 0 No_Error
- 375 Error_Kbd_Invalid_IOWait
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * On an enhanced keyboard, the secondary enter key returns the normal
- character 0Dh and a scan code of E0h.
- * Double-byte character codes (DBCS) require two function calls to obtain the
- entire code.
- * If shift report is set with KbdSetStatus, the CharData record returned
- reflects changed shift information only.
- * Extended ASCII codes are identified with the status byte, bit 1 on and the
- ASCII character code being either 00h or E0h. Both conditions must be
- satisfied for the character to be an extended keystroke. For extended
- ASCII codes, the scan code byte returned is the second code (extended
- code). Usually the extended ASCII code is the scan code of the primary key
- that was pressed.
- * A thread in the foreground session that repeatedly polls the keyboard with
- KbdCharIn (with no wait), can prevent all regular priority class threads
- from executing. If polling must be used and a minimal amount of other
- processing is being performed, the thread should periodically yield to the
- CPU by issuing a DosSleep call for an interval of at least 5 milliseconds.}
- function KbdCharIn(var Key:TKbdKeyInfo;WaitFlag,KbdHandle:word):word; cdecl;
- {Return any available character data record from the keyboard
- without removing it from the buffer.}
- {Key - see TKbdKeyInfo record type, KbdHandle is the default keyboard (0)
- or a logical keyboard.}
- {Possible return codes are:
- 0 No_Error
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * On an enhanced keyboard, the secondary enter key returns the normal
- character 0Dh and a scan code of E0h.
- * Double-byte character codes (DBCS) require two function calls to obtain the
- entire code.
- * If shift report is set with KbdSetStatus the CharData record returned,
- reflects changed shift information only.
- * Extended ASCII codes are identified with the status byte, bit 1 on and the
- ASCII character code being either 00h or E0h. Both conditions must be
- satisfied for the character to be an extended keystroke. For extended
- ASCII codes, the scan code byte returned is the second code (extended
- code). Usually the extended ASCII code is the scan code of the primary key
- that was pressed.
- * A thread in the foreground session that repeatedly polls the keyboard with
- KbdCharIn (with no wait), can prevent all regular priority class threads
- from executing. If polling must be used and a minimal amount of other
- processing is being performed, the thread should periodically yield the CPU
- by issuing a DosSleep call for an interval of at least 5 milliseconds.}
- function KbdPeek(var Key:TKbdKeyInfo;KbdHandle:word):word; cdecl;
- {Read a character string (character codes only) from the keyboard.}
- {CharBuf is a buffer for returned characters, LenInOut - see TStringInBuf
- record type, WaitFlag - see IO_Wait and IO_NoWait constants, KbdHandle is the
- default keyboard (0) or a logical keyboard.}
- {Possible return codes are:
- 0 No_Error
- 375 Error_Kbd_Invalid_IOWait
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * The character strings may be optionally echoed on the display if echo mode
- is set. When echo is on each character is echoed as it is read from the
- keyboard. Echo mode and binary mode are mutually exclusive. Reference
- KbdSetStatus and KbdGetStatus for more information.
- * The default input mode is ASCII. In ASCII mode, 2-byte character codes only
- return in complete form. An extended ASCII code is returned in a 2-byte
- string. The first byte is 0Dh or E0h and the next byte is an extended code.
- * In input mode (binary, ASCII), the following returns can be set and
- retrieved with KbdSetStatus and KbdGetStatus:
- Turnaround Character
- Echo Mode
- Interim Character Flag
- Shift State
- * The received input length is also used by the KbdStringIn line edit
- functions for re-displaying and entering a caller specified string. On the
- next KbdStringIn call the received input length indicates the length of the
- input buffer that may be recalled by the user using the line editing keys.
- A value of 0 inhibits the line editing function for the current KbdStringIn
- request.
- * KbdStringIn completes when the handle has access to the physical keyboard
- (focus), or is equal to zero and no other handle has the focus.}
- function KbdStringIn(var CharBuf;var LenInOut:TStringInBuf;WaitFlag:word;
- KbdHandle:word):word; cdecl;
- function KbdStringIn(CharBuf:PChar;LenInOutP:PStringInBuf;WaitFlag:word;
- KbdHandle:word):word; cdecl;
- {Clear the keystroke buffer.}
- {KbdHandle is the default keyboard (0) or a logical keyboard.}
- {Possible return codes are:
- 0 No_Error
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * KbdFlushBuffer completes when the handle has access to the physical
- keyboard (focus), or is equal to zero and no other handle has the focus.}
- function KbdFlushBuffer(KbdHandle:word):word; cdecl;
- {Set the characteristics of the keyboard.}
- {Status - see TKbdInfo record type, KbdHandle is the default keyboard (0) or
- a logical keyboard.}
- {Possible return codes are:
- 0 No_Error
- 376 Error_Kbd_Invalid_length
- 377 Error_Kbd_Invalid_Echo_Mask
- 378 Error_Kbd_Invalid_Input_Mask
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * Shift return (bit 8 in sysstate) must be disabled in ASCII mode.
- * KbdSetStatus is ignored for a Vio-windowed application.}
- function KbdSetStatus(var Status:TKbdInfo;KbdHandle:word):word; cdecl;
- {Get the current state of the keyboard.}
- {Status - see TKbdInfo record type, KbdHandle is the default keyboard (0) or
- a logical keyboard.}
- {Possible return codes:
- 0 No_Error
- 376 Error_Kbd_Invalid_Length
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * The initial state of the keyboard is established by the system at
- application load time. Some default states may be modified by the
- application through KbdSetStatus. KbdGetStatus returns only those keyboard
- parameters initially set by KbdSetStatus. The returned parameters are:
- Input Mode, Interim Character Flags, Shift State, Echo State, TurnAround
- Character
- * KbdGetStatus completes only when the handle has access to the physical
- keyboard (focus) or the handle is 0 and no other handle has the focus.}
- function KbdGetStatus(var Status:TKbdInfo;KbdHandle:word):word; cdecl;
- {Set the code page used to translate key strokes received from the keyboard for
- current process.}
- {Reserved - reserved, must be set to 0, CodePage - code-page ID in the
- application's data area, must be equivalent to one of the code-page IDs
- specified on the CONFIG.SYS CODEPAGE= statement or 0, an error results
- otherwise, KbdHandle is the default keyboard (0) or a logical keyboard.}
- {Possible return codes:
- 0 No_Error
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 448 Error_Kbd_Invalid_CodePage
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * Keyboard code page support is not available without the DEVINFO=KBD
- statement in the CONFIG.SYS file.}
- function KbdSetCp(Reserved,CodePage,KbdHandle:word):word; cdecl;
- {Query the code page being used to translate scan codes to ASCII characters.}
- {Reserved must be set to 0. The keyboard support returns the current code
- page for a specified keyboard handle in CodePage, it is one of the code page
- IDs specified in the CONFIG.SYS CODEPAGE= statement or 0000. KbdHandle is
- the default keyboard (0) or a logical keyboard.}
- {Possible return codes:
- 0 No_Error
- 373 Error_Kbd_Parameter
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * CodePage is set to the currently active keyboard code page. A value of 0
- indicates the code page translation table in use is the ROM code page
- translation table provided by the hardware.}
- function KbdGetCp(Reserved:cardinal;var CodePage:word;KbdHandle:word):word;
- cdecl;
- {Create a new logical keyboard.}
- {Handle for the new logical keyboard returned in KbdHandle.}
- {Possible return codes:
- 0 No_Error
- 440 Error_Kbd_No_More_Handle
- 441 Error_Kbd_Cannot_Create_KCB
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * KbdOpen blocks while another thread has the keyboard focus (by way of
- KbdGetFocus) until the thread with the focus issues KbdFreeFocus.
- Therefore, to prevent KbdOpen from blocking, it is recommended that KbdOpen
- be issued only while the current thread has the focus. For example:
- KbdGetFocus wait until focus available on handle 0
- KbdOpen get a logical keyboard handle
- KbdFreeFocus give up the focus on handle 0}
- function KbdOpen(var KbdHandle:word):word; cdecl;
- {Close the existing logical keyboard identified by the keyboard handle}
- {KbdHandle is the default keyboard (0) or a logical keyboard}
- {Possible return codes:
- 0 No_Error
- 439 Error_Kbd_Invalid_Handle
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * KbdClose blocks while another thread has the keyboard focus (by way of
- KbdGetFocus) until the thread with the focus issues KbdFreeFocus.
- Therefore, to prevent KbdClose from blocking, it is recommended that
- KbdClose be issued only while the current thread has the focus. For
- example:
- KbdGetFocus wait until focus available on handle 0
- KbdClose close a logical keyboard handle
- KbdFreeFocus give up the focus on handle 0}
- function KbdClose(KbdHandle:word):word; cdecl;
- {Bind the logical keyboard to the physical keyboard.}
- {KbdHandle is the default keyboard (0) or a logical keyboard}
- {Possible return codes:
- 0 No_Error
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- function KbdGetFocus(WaitFlag,KbdHandle:word):word; cdecl;
- {Free the logical-to-physical keyboard bond created by KbdGetFocus.}
- {KbdHandle is the default keyboard (0) or a logical keyboard}
- {Possible return codes:
- 0 No_Error
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * KbdFreeFocus may be replaced by issuing KbdRegister. Unlike other keyboard
- subsystem functions, the replaced KbdFreeFocus is called only if there is
- an outstanding focus.}
- function KbdFreeFocus(KbdHandle:word):word; cdecl;
- {Synchronize access from a keyboard subsystem to the keyboard device driver.}
- {WaitFlag - see IO_Wait and IO_NoWait constants (wait / don't wait for access
- to the device driver.}
- {Possible return codes:
- 0 No_Error
- 121 Error_Sem_TimeOut}
- {Remarks:
- * KbdSynch blocks all other threads within a session until return from the
- subsystem to the router. To ensure proper synchronization, KbdSynch should
- be issued by a keyboard subsystem if it intends to issue a DosDevIOCtl or
- access dynamically shared data. KbdSynch does not protect globally shared
- data from threads in other sessions.}
- function KbdSynch (WaitFlag:word):word; cdecl;
- {Raise the priority of the foreground keyboard's thread.}
- {Possible return codes:
- 0 No_Error
- 447 Error_Kbd_Keyboard_Busy
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * KbdSetFgnd marks the current process that owns the keyboard. Threads in
- this process receive a priority boost. The previous foreground keyboard
- threads lose their priority boost.
- * This function should only be issued by a Keyboard Subsystem during
- KbdCharIn or KbdStringIn processing.}
- function KbdSetFgnd:word; cdecl;
- {Return the attached keyboard's hardware-generated identification value.}
- {HWID is a pointer to the caller's data area, see TKbdHWID, KbdHandle is the
- default keyboard (0) or a logical keyboard.}
- {Possible return codes:
- 0 No_Error
- 373 Error_Kbd_Parameter
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * In past OS/2 releases, all keyboards could be supported by knowing the
- hardware family information available with keyboard IOCTL 77h. However,
- with the addition of the 122-key keyboard, recognition was not containable
- by hardware family information alone. The 122-key keyboard has a number of
- differences from other keyboards. Therefore, applications performing
- keystroke specific functions may need to determine specifically which
- keyboard is attached.
- * This function is of particular usefulness for applications providing Custom
- Translate Tables and mapping keyboard layouts.}
- function KbdGetHWID(var HWID:TKbdHWID;KbdHandle:word):word; cdecl;
- {Undocumented in official IBM documentation}
- function KbdSetHWID(var HWID:TKbdHWID;KbdHandle:word):word; cdecl;
- function KbdSetHWID(HWIDP:PKbdHWID;KbdHandle:word):word; cdecl;
- {Translate scan codes with shift states into ASCII codes.}
- {TransData - see TKbdTransData, KbdHandle is the default keyboard (0) or a
- logical keyboard.}
- {Possible return codes:
- 0 No_Error
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * It may take several calls to complete a translation because of accent key
- combinations, or other complex operations.
- * The fsShift and sZero are for use by the keyboard translation routines.
- These fields are reserved and must only be accessed by the caller prior
- to starting a translation sequence and then they must be set to zero.
- The KbdXlate function is intended to be used for translating a particular
- scan code for a given shift state. The KbdXlate function is not intended
- to be a replacement for the OS/2 system keystroke translation function.}
- function KbdXlate(var TransData:TKbdTrans;KbdHandle:word):word; cdecl;
- {Install, on the specified handle, the translate table which this call points
- to. This translate table affects only this handle.}
- {XLateTbl is the translation table used to translate scan code to ASCII code
- for a specified handle (the format of the translation table is documented in
- the Set Code Page IOCTL 50h), KbdHandle is the default keyboard (0) or a
- logical keyboard.}
- {Possible return codes:
- 0 No_Error
- 377 Error_Kbd_Invalid_Echo_Mask
- 378 Error_Kbd_Invalid_Input_Mask
- 439 Error_Kbd_Invalid_Handle
- 445 Error_Kbd_Focus_Required
- 447 Error_Kbd_Keyboard_Busy
- 464 Error_Kbd_Detached
- 504 Error_Kbd_Extended_SG}
- {Remarks:
- * The translate table must be maintained in the caller's memory. No copy of
- the translate table is made by KbdSetCustXt.
- * KbdSetCp reverses the action of KbdSetCustXt and sets the handle equal to
- one of the system translate tables. If memory is dynamically allocated by
- the caller for the translate table and is freed before the KbdSetCp is
- performed, KbdSetCp and future translations may fail.}
- function KbdSetCustXt(var XLateTbl:TXLateTbl;KbdHandle:word):word; cdecl;
- function KbdSetCustXt(var CodePage:word;KbdHandle:word):word; cdecl;
- function KbdSetCustXt(var XLateTblP:pointer;KbdHandle:word):word; cdecl;
- (* Following routines are not supported
- (just have a look in some C header
- file - you probably won't find it there either).
- KbdInit (index 2)
- KbdLoadInstance (index 6)
- KbdSwitchFgnd (index 15)
- KbdShellInit (index 16)
- KbdFree (index 19)
- *)
- {***************************************************************************}
- implementation
- {***************************************************************************}
- function KbdRegister(ModuleName,ProcName:PChar;FnMask:cardinal):word; cdecl;
- external 'EMXWRAP' index 208;
- {external 'KBDCALLS' index 8;}
- function KbdRegister(ModuleName,ProcName:string;FnMask:cardinal):word;
- begin
- if byte(ModuleName[0])>8 then byte(ModuleName[0]):=8;
- ModuleName[Succ(byte(ModuleName[0]))]:=#0;
- if byte(ProcName[0])>32 then byte(ProcName[0]):=32;
- ProcName[Succ(byte(ProcName[0]))]:=#0;
- KbdRegister:=KbdRegister(@ModuleName[1],@ProcName[1],FnMask);
- end;
- function KbdDeRegister:word; cdecl;
- external 'EMXWRAP' index 220;
- {external 'KBDCALLS' index 20;}
- function KbdCharIn(var Key:TKbdKeyInfo;WaitFlag,KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 204;
- {external 'KBDCALLS' index 4;}
- function KbdPeek(var Key:TKbdKeyInfo;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 222;
- {external 'KBDCALLS' index 22;}
- function KbdStringIn(var CharBuf;var LenInOut:TStringInBuf;WaitFlag:word;
- KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 209;
- {external 'KBDCALLS' index 9;}
- function KbdStringIn(CharBuf:PChar;LenInOutP:PStringInBuf;WaitFlag:word;
- KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 209;
- {external 'KBDCALLS' index 9;}
- function KbdFlushBuffer(KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 213;
- {external 'KBDCALLS' index 13;}
- function KbdSetStatus(var Status:TKbdInfo;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 211;
- {external 'KBDCALLS' index 11;}
- function KbdGetStatus(var Status:TKbdInfo;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 210;
- {external 'KBDCALLS' index 10;}
- function KbdSetCp(Reserved,CodePage,KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 205;
- {external 'KBDCALLS' index 5;}
- function KbdGetCp(Reserved:cardinal;var CodePage:word;KbdHandle:word):word;
- cdecl;
- external 'EMXWRAP' index 203;
- {external 'KBDCALLS' index 3;}
- function KbdOpen(var KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 223;
- {external 'KBDCALLS' index 23;}
- function KbdClose(KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 217;
- {external 'KBDCALLS' index 17;}
- function KbdGetFocus(WaitFlag,KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 212;
- {external 'KBDCALLS' index 12;}
- function KbdFreeFocus(KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 218;
- {external 'KBDCALLS' index 18;}
- function KbdSynch (WaitFlag:word):word; cdecl;
- external 'EMXWRAP' index 207;
- {external 'KBDCALLS' index 7;}
- function KbdSetFgnd:word; cdecl;
- external 'EMXWRAP' index 221;
- {external 'KBDCALLS' index 21;}
- function KbdGetHWID(var HWID:TKbdHWID;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 224;
- {external 'KBDCALLS' index 24;}
- function KbdSetHWID(var HWID:TKbdHWID;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 225;
- {external 'KBDCALLS' index 25;}
- function KbdSetHWID(HWIDP:PKbdHWID;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 225;
- {external 'KBDCALLS' index 25;}
- function KbdXlate(var TransData:TKbdTrans;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 214;
- {external 'KBDCALLS' index 14;}
- function KbdSetCustXt(var XLateTbl:TXLateTbl;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 201;
- {external 'KBDCALLS' index 1;}
- function KbdSetCustXt(var CodePage:word;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 201;
- {external 'KBDCALLS' index 1;}
- function KbdSetCustXt(var XLateTblP:pointer;KbdHandle:word):word; cdecl;
- external 'EMXWRAP' index 201;
- {external 'KBDCALLS' index 1;}
- end.
- {
- $Log$
- Revision 1.2 2002-09-07 16:01:24 peter
- * old logs removed and tabs fixed
- }
|