-- ----------------------------------------------------------------- --
-- --
-- This is free software; you can redistribute it and/or --
-- modify it under the terms of the GNU General Public --
-- License as published by the Free Software Foundation; either --
-- version 2 of the License, or (at your option) any later version. --
-- --
-- This software 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 GNU --
-- General Public License for more details. --
-- --
-- You should have received a copy of the GNU General Public --
-- License along with this library; if not, write to the --
-- Free Software Foundation, Inc., 59 Temple Place - Suite 330, --
-- Boston, MA 02111-1307, USA. --
-- --
-- ----------------------------------------------------------------- --
-- ----------------------------------------------------------------- --
-- This is a translation, to the Ada programming language, of the --
-- original C test files written by Sam Lantinga - www.libsdl.org --
-- translation made by Antonio F. Vargas - www.adapower.net/~avargas --
-- ----------------------------------------------------------------- --
-- Simple program: Loop, watching keystrokes
-- Note that you need to call SDL.Events.PollEvent
-- or SDL.Events.WaitEvent to pump the event loop
-- and catch keystrokes.
with Interfaces.C.Strings;
with Ada.Text_IO; use Ada.Text_IO;
with GNAT.OS_Lib;
with SDL.Types; use SDL.Types;
with SDL.Keysym;
with SDL.Keyboard;
with SDL.Error;
with SDL.Quit;
with SDL.Events;
with SDL.Video;
procedure CheckKeys is
package C renames Interfaces.C;
use type C.int;
use type C.wchar_t;
package CS renames Interfaces.C.Strings;
package Ks renames SDL.Keysym;
use type Ks.Key;
package Kb renames SDL.Keyboard;
package Er renames SDL.Error;
package Ev renames SDL.Events;
package V renames SDL.Video;
Screen_Width : constant := 640;
Screen_Height : constant := 480;
-- ===============================================
procedure PrintKey (sym : in Kb.keysym; pressed : Boolean) is
begin
-- Print the keycode, name and state
if sym.sym /= 0 then
Put ("Key ");
if pressed then
Put ("pressed: ");
else
Put ("released: ");
end if;
Put (Ks.Key'Image (sym.sym) & "-" &
CS.Value (Kb.GetKeyName (sym.sym)) &
" ");
else
Put ("Unknown Key (scancode = " &
Uint8'Image (sym.scancode) & ") ");
if pressed then
Put_Line ("pressed: ");
else
Put_Line ("released: ");
end if;
end if;
-- Print the translated character, if one exists
if sym.unicode /= 0 then
-- Is it a control-character?
if C.wchar_t'Val (sym.unicode) < C.wchar_t'(' ') then
Put_Line (" (^"
& C.wchar_t'Image (C.wchar_t'Val
(sym.unicode)) & "@)");
-- & Uint16'Image (sym.unicode) & "@)");
else
-- #ifdef UNICODE
-- Put_Line (" (" & Uint16'Image (sym.unicode) & ")");
Put_Line (" (" & C.wchar_t'Image (C.wchar_t'Val
(sym.unicode)) & ")");
-- #else
-- This is a Latin-1 program, so only show 8-bits */
-- if (sym.unicode and 16#FF00#) = 0 then
-- Put_Line (" (" & Uint16'Image (sym.unicode) & ")");
-- end if;
-- #endif
end if;
end if;
New_Line;
end PrintKey;
-- ===============================================
event : Ev.Event;
done : C.int; -- Boolean should be better.
begin
-- Initialize SDL
if SDL.Init (SDL.INIT_VIDEO) < 0 then
Put_Line ("Couldn't initialize SDl: " & Er.Get_Error);
GNAT.OS_Lib.OS_Exit (1);
end if;
SDL.Quit.atexit (SDL.SDL_Quit'Access);
declare
screen : V.Surface_ptr;
use type V.Surface_ptr;
begin
-- Set video mode
screen := V.SetVideoMode (Screen_Width, Screen_Height,
0, V.SWSURFACE);
if screen = null then
Put_Line ("Couldn't set " & Integer'Image (Screen_Width) &
"x" & Integer'Image (Screen_Height) &
" video mode: " & Er.Get_Error);
GNAT.OS_Lib.OS_Exit (2);
end if;
end;
-- Enable UNICODE translation for keyboard input
Kb.EnableUNICODE (1);
Kb.EnableKeyRepeat (
Kb.DEFAULT_REPEAT_DELAY,
Kb.DEFAULT_REPEAT_INTERVAL);
-- Watch keystrokes
done := 0;
while done = 0 loop
-- Check for events
-- Read the note in the "event" declaration point.
Ev.WaitEvent (event);
case event.the_type is
when Ev.KEYDOWN =>
-- Read the note in the "event" declaration point.
PrintKey (event.key.keysym, True);
when Ev.KEYUP =>
-- Read the note in the "event" declaration point.
PrintKey (event.key.keysym, False);
when Ev.MOUSEBUTTONDOWN | Ev.QUIT =>
-- Any button press quits the app...
done := 1;
when others => null;
end case;
end loop;
end CheckKeys;
syntax highlighted by Code2HTML, v. 0.9.1