fruit-popper/GDLIB/GDKEYCHR.PAS
2021-07-07 17:10:18 -04:00

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.