193 lines
8.4 KiB
Plaintext
193 lines
8.4 KiB
Plaintext
{ GDlib Keyboard Handler - Keycode-to-Char Conversion Support
|
|
Gered King, 2020 }
|
|
|
|
{$A+,B-,F-,G+,I-,N+,P-,Q-,R-,S-,T-,V-,X+}
|
|
|
|
unit GDKeyChr;
|
|
|
|
interface
|
|
|
|
uses GDKeybrd;
|
|
|
|
function KeyToChar(k: Key; modifiers: word) : char;
|
|
|
|
implementation
|
|
|
|
const
|
|
|
|
LookupKeyToChar : array[0..127] of char = (
|
|
#0, #0, '1', '2', '3', '4', '5', '6', { 00 - 07 }
|
|
'7', '8', '9', '0', '-', '=', #0, #9, { 08 - 0f }
|
|
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', { 10 - 17 }
|
|
'o', 'p', '[', ']', #0, #0, 'a', 's', { 18 - 1f }
|
|
'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', { 20 - 27 }
|
|
'''', '`', #0, '\', 'z', 'x', 'c', 'v', { 28 - 2f }
|
|
'b', 'n', 'm', ',', '.', '/', #0, '*', { 30 - 37 }
|
|
#0, ' ', #0, #0, #0, #0, #0, #0, { 38 - 3f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f }
|
|
);
|
|
|
|
LookupKeyToCharShift : array[0..127] of char = (
|
|
#0, #0, '!', '@', '#', '$', '%', '^', { 00 - 07 }
|
|
'&', '*', '(', ')', '_', '+', #0, #9, { 08 - 0f }
|
|
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', { 10 - 17 }
|
|
'O', 'P', '{', '}', #0, #0, 'A', 'S', { 18 - 1f }
|
|
'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', { 20 - 27 }
|
|
'"', '~', #0, '|', 'Z', 'X', 'C', 'V', { 28 - 2f }
|
|
'B', 'N', 'M', '<', '>', '?', #0, '*', { 30 - 37 }
|
|
#0, ' ', #0, #0, #0, #0, #0, #0, { 38 - 3f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f }
|
|
);
|
|
|
|
LookupKeyToCharCaps : array[0..127] of char = (
|
|
#0, #0, '1', '2', '3', '4', '5', '6', { 00 - 07 }
|
|
'7', '8', '9', '0', '-', '=', #0, #9, { 08 - 0f }
|
|
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', { 10 - 17 }
|
|
'O', 'P', '[', ']', #0, #0, 'A', 'S', { 18 - 1f }
|
|
'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', { 20 - 27 }
|
|
'''', '`', #0, '\', 'Z', 'X', 'C', 'V', { 28 - 2f }
|
|
'B', 'N', 'M', ',', '.', '/', #0, '*', { 30 - 37 }
|
|
#0, ' ', #0, #0, #0, #0, #0, #0, { 38 - 3f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f }
|
|
);
|
|
|
|
LookupKeyToCharCapsShift : array[0..127] of char = (
|
|
#0, #0, '!', '@', '#', '$', '%', '^', { 00 - 07 }
|
|
'&', '*', '(', ')', '_', '+', #0, #9, { 08 - 0f }
|
|
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', { 10 - 17 }
|
|
'o', 'p', '{', '}', #0, #0, 'a', 's', { 18 - 1f }
|
|
'd', 'f', 'g', 'h', 'j', 'k', 'l', ':', { 20 - 27 }
|
|
'"', '~', #0, '|', 'z', 'x', 'c', 'v', { 28 - 2f }
|
|
'b', 'n', 'm', '<', '>', '?', #0, '*', { 30 - 37 }
|
|
#0, ' ', #0, #0, #0, #0, #0, #0, { 38 - 3f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f }
|
|
);
|
|
|
|
LookupKeyToCharNumpad : array[0..127] of char = (
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 00 - 07 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 08 - 0f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 10 - 17 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 18 - 1f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 20 - 27 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 28 - 2f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 30 - 37 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 38 - 3f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 }
|
|
#0, #0, '-', #0, #0, #0, '+', #0, { 48 - 4f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f }
|
|
);
|
|
|
|
LookupKeyToCharNumpadNumlock : array[0..127] of char = (
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 00 - 07 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 08 - 0f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 10 - 17 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 18 - 1f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 20 - 27 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 28 - 2f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 30 - 37 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 38 - 3f }
|
|
#0, #0, #0, #0, #0, #0, #0, '7', { 40 - 47 }
|
|
'8', '9', '-', '4', '5', '6', '+', '1', { 48 - 4f }
|
|
'2', '3', '0', '.', #0, #0, #0, #0, { 50 - 57 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f }
|
|
);
|
|
|
|
LookupKeyToCharExtended : array[0..127] of char = (
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 00 - 07 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 08 - 0f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 10 - 17 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 18 - 1f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 20 - 27 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 28 - 2f }
|
|
#0, #0, #0, #0, #0, '/', #0, #0, { 30 - 37 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 38 - 3f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 40 - 47 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 48 - 4f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 50 - 57 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 58 - 5f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 60 - 67 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 68 - 6f }
|
|
#0, #0, #0, #0, #0, #0, #0, #0, { 70 - 77 }
|
|
#0, #0, #0, #0, #0, #0, #0, #0 { 78 - 7f }
|
|
);
|
|
|
|
function KeyToChar(k: Key; modifiers: word) : char;
|
|
{ returns the equivalent character for the given key scan code and keyboard
|
|
modifiers (num/caps/scroll lock, shift status, etc.) }
|
|
begin
|
|
if (modifiers and KB_MOD_EXTENDED) <> 0 then begin
|
|
KeyToChar := LookupKeyToCharExtended[k];
|
|
|
|
end else if (k >= $47) and (k <= $53) then begin
|
|
{ handle numpad keys specially }
|
|
if (modifiers and KB_MOD_NUM_LOCK) <> 0 then begin
|
|
if (modifiers and KB_MOD_SHIFT) <> 0 then
|
|
KeyToChar := LookupKeyToCharNumpad[k]
|
|
else
|
|
KeyToChar := LookupKeyToCharNumpadNumLock[k];
|
|
|
|
end else begin
|
|
if (modifiers and KB_MOD_SHIFT) <> 0 then
|
|
KeyToChar := LookupKeyToCharNumpadNumLock[k]
|
|
else
|
|
KeyToChar := LookupKeyToCharNumpad[k];
|
|
|
|
end;
|
|
|
|
end else begin
|
|
{ everything else }
|
|
if (modifiers and KB_MOD_CAPS_LOCK) <> 0 then begin
|
|
if (modifiers and KB_MOD_SHIFT) <> 0 then
|
|
KeyToChar := LookupKeyToCharCapsShift[k]
|
|
else
|
|
KeyToChar := LookupKeyToCharCaps[k];
|
|
|
|
end else begin
|
|
if (modifiers and KB_MOD_SHIFT) <> 0 then
|
|
KeyToChar := LookupKeyToCharShift[k]
|
|
else
|
|
KeyToChar := LookupKeyToChar[k];
|
|
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
end.
|