Как вернуть символ ascii в SDL (freepascal)
Я хочу прочитать ключ ascii с клавиатуры, используя SDL под freepascal. Меня не волнует нажатие клавиш shift, ctrl, caps и т. Д. - только то, что обычно выдает символ при вводе в типичном приложении.
Проблема в том, что я не могу правильно определить KMOD_CAPS. Если вы нажмете его несколько раз, вы получите разные результаты для одного и того же состояния CAPS.
Это то, что я до сих пор:
program ReadKeySDL;
{SDL implementation of the crt readkey function.}
uses
sdl;
const
validkeys=[8,13,27,32..126];
lowercase=[97..122];
var
screen : pSDL_Surface;
event : pSDL_Event;
eventkey : tSDLKey;
eventmod : tSDLMod;
key : char;
keyselected : boolean;
BEGIN
SDL_Init(SDL_INIT_VIDEO);
screen:=SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
if (screen=nil) then halt(1);
new(event);
repeat
keyselected:=false;
repeat
if (SDL_WaitEvent(event) = 1) then
begin
if (event^.type_ = SDL_KeyDown) then
begin
eventkey:=event^.key.keysym.sym;
eventmod:=event^.key.keysym.modifier;
writeln;
writeln('eventkey: ',eventkey);
writeln('eventmod: ',eventmod);
if (eventkey in validkeys) then
begin
keyselected:=true;
if ((eventkey in lowercase) and ((eventmod and (KMOD_CAPS or KMOD_SHIFT)) <> 0)) then
key:=chr(eventkey - 32)
else
key:=chr(eventkey);
end;
end;
end;
until((keyselected) and (event^.type_ = SDL_KeyUp));
writeln('Your key is: ',key,' (',ord(key),')');
writeln('Final eventkey: ',eventkey);
writeln('Final eventmod: ',eventmod);
until(ord(key) = 27);
dispose(event);
SDL_FreeSurface(screen);
SDL_Quit;
END.