1 ------------------------------------------------------------------------------
3 -- GNAT ncurses Binding Samples --
9 ------------------------------------------------------------------------------
10 -- Copyright (c) 2000 Free Software Foundation, Inc. --
12 -- Permission is hereby granted, free of charge, to any person obtaining a --
13 -- copy of this software and associated documentation files (the --
14 -- "Software"), to deal in the Software without restriction, including --
15 -- without limitation the rights to use, copy, modify, merge, publish, --
16 -- distribute, distribute with modifications, sublicense, and/or sell --
17 -- copies of the Software, and to permit persons to whom the Software is --
18 -- furnished to do so, subject to the following conditions: --
20 -- The above copyright notice and this permission notice shall be included --
21 -- in all copies or substantial portions of the Software. --
23 -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --
24 -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --
25 -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --
26 -- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, --
27 -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR --
28 -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR --
29 -- THE USE OR OTHER DEALINGS IN THE SOFTWARE. --
31 -- Except as contained in this notice, the name(s) of the above copyright --
32 -- holders shall not be used in advertising or otherwise to promote the --
33 -- sale, use or other dealings in this Software without prior written --
35 ------------------------------------------------------------------------------
36 -- Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
39 -- Binding Version 01.00
40 ------------------------------------------------------------------------------
41 -- TODO use Default_Character where appropriate
43 -- This is an Ada version of ncurses
44 -- I translated this because it tests the most features.
46 with Terminal_Interface.Curses; use Terminal_Interface.Curses;
47 with Terminal_Interface.Curses.Trace; use Terminal_Interface.Curses.Trace;
49 with Ada.Text_IO; use Ada.Text_IO;
51 with Ada.Characters.Latin_1;
52 -- with Ada.Characters.Handling;
54 with Ada.Command_Line; use Ada.Command_Line;
56 with Ada.Strings.Unbounded;
59 with ncurses2.util; use ncurses2.util;
60 with ncurses2.getch_test;
61 with ncurses2.attr_test;
62 with ncurses2.color_test;
63 with ncurses2.demo_panels;
64 with ncurses2.color_edit;
65 with ncurses2.slk_test;
66 with ncurses2.acs_display;
67 with ncurses2.color_edit;
68 with ncurses2.acs_and_scroll;
69 with ncurses2.flushinp_test;
70 with ncurses2.test_sgr_attributes;
71 with ncurses2.menu_test;
72 with ncurses2.demo_pad;
73 with ncurses2.demo_forms;
74 with ncurses2.overlap_test;
75 with ncurses2.trace_set;
77 with ncurses2.getopt; use ncurses2.getopt;
79 package body ncurses2.m is
82 function To_trace (n : Integer) return Trace_Attribute_Set;
84 procedure Set_Terminal_Modes;
85 function Do_Single_Test (c : Character) return Boolean;
87 function To_trace (n : Integer) return Trace_Attribute_Set is
88 a : Trace_Attribute_Set := (others => False);
110 a.Cursor_Move := True;
115 a.Character_Output := True;
125 a.Virtual_Puts := True;
130 a.Input_Events := True;
140 a.Internal_Calls := True;
145 a.Character_Calls := True;
150 a.Termcap_TermInfo := True;
156 -- these are type Stdscr_Init_Proc;
158 function rip_footer (
160 Columns : Column_Count) return Integer;
161 pragma Convention (C, rip_footer);
163 function rip_footer (
165 Columns : Column_Count) return Integer is
167 Set_Background (Win, (Ch => ' ',
168 Attr => (Reverse_Video => True, others => False),
171 Move_Cursor (Win, 0, 0);
172 Add (Win, "footer:" & Columns'Img & " columns");
173 Refresh_Without_Update (Win);
174 return 0; -- Curses_OK;
178 function rip_header (
180 Columns : Column_Count) return Integer;
181 pragma Convention (C, rip_header);
183 function rip_header (
185 Columns : Column_Count) return Integer is
187 Set_Background (Win, (Ch => ' ',
188 Attr => (Reverse_Video => True, others => False),
191 Move_Cursor (Win, 0, 0);
192 Add (Win, "header:" & Columns'Img & " columns");
193 -- 'Img is a GNAT extention
194 Refresh_Without_Update (Win);
195 return 0; -- Curses_OK;
199 -- type Stringa is access String;
200 use Ada.Strings.Unbounded;
201 -- tbl : constant array (Positive range <>) of Stringa := (
202 tbl : constant array (Positive range <>) of Unbounded_String
204 To_Unbounded_String ("Usage: ncurses [options]"),
205 To_Unbounded_String (""),
206 To_Unbounded_String ("Options:"),
207 To_Unbounded_String (" -a f,b set default-colors " &
208 "(assumed white-on-black)"),
209 To_Unbounded_String (" -d use default-colors if terminal " &
211 To_Unbounded_String (" -e fmt specify format for soft-keys " &
213 To_Unbounded_String (" -f rip-off footer line " &
215 To_Unbounded_String (" -h rip-off header line " &
217 To_Unbounded_String (" -s msec specify nominal time for " &
218 "panel-demo (default: 1, to hold)"),
219 To_Unbounded_String (" -t mask specify default trace-level " &
220 "(may toggle with ^T)")
223 for n in tbl'Range loop
224 Put_Line (Standard_Error, To_String (tbl (n)));
226 -- exit(EXIT_FAILURE);
227 -- TODO should we use Set_Exit_Status and throw and exception?
230 procedure Set_Terminal_Modes is begin
231 Set_Raw_Mode (SwitchOn => False);
232 Set_Cbreak_Mode (SwitchOn => True);
233 Set_Echo_Mode (SwitchOn => False);
234 Allow_Scrolling (Mode => True);
235 Use_Insert_Delete_Line (Do_Idl => True);
236 Set_KeyPad_Mode (SwitchOn => True);
237 end Set_Terminal_Modes;
240 nap_msec : Integer := 1;
242 function Do_Single_Test (c : Character) return Boolean is
250 if not Has_Colors then
251 Cannot ("does not support color.");
256 if not Has_Colors then
257 Cannot ("does not support color.");
258 elsif not Can_Change_Color then
259 Cannot ("has hardwired color values.");
268 demo_panels (nap_msec);
272 flushinp_test (Standard_Window);
287 when others => return False;
294 my_e_param : Soft_Label_Key_Format := Four_Four;
295 assumed_colors : Boolean := False;
296 default_colors : Boolean := False;
297 default_fg : Color_Number := White;
298 default_bg : Color_Number := Black;
299 -- nap_msec was an unsigned long integer in the C version,
300 -- yet napms only takes an int!
304 optind : Integer := 1; -- must be initialized to one.
305 type stringa is access String;
306 optarg : getopt.stringa;
311 package myio is new Ada.Text_IO.Integer_IO (Integer);
314 save_trace : Integer := 0;
315 save_trace_set : Trace_Attribute_Set;
317 function main return Integer is
320 Qgetopt (c, Argument_Count, Argument'Access,
321 "a:de:fhs:t:", optind, optarg);
323 c2 := Character'Val (c);
326 -- Ada doesn't have scanf, it doesn't even have a
327 -- regular expression library.
328 assumed_colors := True;
329 myio.Get (optarg.all, Integer (default_fg), length);
330 myio.Get (optarg.all (length + 2 .. optarg.all'Length),
331 Integer (default_bg), length);
333 default_colors := True;
335 myio.Get (optarg.all, tmpi, length);
336 if Integer (tmpi) > 3 then
340 my_e_param := Soft_Label_Key_Format'Val (tmpi);
342 Rip_Off_Lines (-1, rip_footer'Access);
344 Rip_Off_Lines (1, rip_header'Access);
346 myio.Get (optarg.all, nap_msec, length);
348 myio.Get (optarg.all, save_trace, length);
355 -- the C version had a bunch of macros here.
357 -- if (!isatty(fileno(stdin)))
358 -- isatty is not available in the standard Ada so skip it.
359 save_trace_set := To_trace (save_trace);
360 Trace_On (save_trace_set);
363 Init_Soft_Label_Keys (my_e_param);
366 Set_Background (Ch => (Ch => Blank,
367 Attr => Normal_Video,
368 Color => Color_Pair'First));
372 if default_colors then
374 elsif assumed_colors then
375 Assume_Default_Colors (default_fg, default_bg);
380 Save_Curses_Mode (Curses);
384 -- TODO add macro #if blocks.
385 Put_Line ("Welcome to " & Curses_Version & ". Press ? for help.");
388 Put_Line ("This is the ncurses main menu");
389 Put_Line ("a = keyboard and mouse input test");
390 Put_Line ("b = character attribute test");
391 Put_Line ("c = color test pattern");
392 Put_Line ("d = edit RGB color values");
393 Put_Line ("e = exercise soft keys");
394 Put_Line ("f = display ACS characters");
395 Put_Line ("g = display windows and scrolling");
396 Put_Line ("i = test of flushinp()");
397 Put_Line ("k = display character attributes");
398 Put_Line ("m = menu code test");
399 Put_Line ("o = exercise panels library");
400 Put_Line ("p = exercise pad features");
401 Put_Line ("q = quit");
402 Put_Line ("r = exercise forms code");
403 Put_Line ("s = overlapping-refresh test");
404 Put_Line ("t = set trace level");
405 Put_Line ("? = repeat this command summary");
410 command := Ada.Characters.Latin_1.NUL;
417 -- TODO if read(ch) <= 0
418 -- TODO ada doesn't have an Is_Space function
420 -- TODO if ch = '\n' or '\r' are these in Ada?
422 -- end loop get_input;
426 if Do_Single_Test (command) then
429 Reset_Curses_Mode (Curses);
433 if command = '?' then
434 Put_Line ("This is the ncurses capability tester.");
435 Put_Line ("You may select a test from the main menu by " &
437 Put_Line ("key letter of the choice (the letter to left " &
439 Put_Line ("at the > prompt. The commands `x' or `q' will " &
442 -- continue; --why continue in the C version?
445 when Curses_Exception => End_Windows;
448 exit when command = 'q';
450 return 0; -- TODO ExitProgram(EXIT_SUCCESS);