123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449 |
- ------------------------------------------------------------------------------
- -- --
- -- GNAT ncurses Binding Samples --
- -- --
- -- ncurses --
- -- --
- -- B O D Y --
- -- --
- ------------------------------------------------------------------------------
- -- Copyright (c) 2000-2006,2008 Free Software Foundation, Inc. --
- -- --
- -- Permission is hereby granted, free of charge, to any person obtaining a --
- -- copy of this software and associated documentation files (the --
- -- "Software"), to deal in the Software without restriction, including --
- -- without limitation the rights to use, copy, modify, merge, publish, --
- -- distribute, distribute with modifications, sublicense, and/or sell --
- -- copies of the Software, and to permit persons to whom the Software is --
- -- furnished to do so, subject to the following conditions: --
- -- --
- -- The above copyright notice and this permission notice shall be included --
- -- in all copies or substantial portions of the Software. --
- -- --
- -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS --
- -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF --
- -- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. --
- -- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, --
- -- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR --
- -- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR --
- -- THE USE OR OTHER DEALINGS IN THE SOFTWARE. --
- -- --
- -- Except as contained in this notice, the name(s) of the above copyright --
- -- holders shall not be used in advertising or otherwise to promote the --
- -- sale, use or other dealings in this Software without prior written --
- -- authorization. --
- ------------------------------------------------------------------------------
- -- Author: Eugene V. Melaragno <aldomel@ix.netcom.com> 2000
- -- Version Control
- -- $Revision: 1.8 $
- -- $Date: 2008/07/26 18:47:50 $
- -- Binding Version 01.00
- ------------------------------------------------------------------------------
- -- TODO use Default_Character where appropriate
- -- This is an Ada version of ncurses
- -- I translated this because it tests the most features.
- with Terminal_Interface.Curses; use Terminal_Interface.Curses;
- with Terminal_Interface.Curses.Trace; use Terminal_Interface.Curses.Trace;
- with Ada.Text_IO; use Ada.Text_IO;
- with Ada.Characters.Latin_1;
- -- with Ada.Characters.Handling;
- with Ada.Command_Line; use Ada.Command_Line;
- with Ada.Strings.Unbounded;
- with ncurses2.util; use ncurses2.util;
- with ncurses2.getch_test;
- with ncurses2.attr_test;
- with ncurses2.color_test;
- with ncurses2.demo_panels;
- with ncurses2.color_edit;
- with ncurses2.slk_test;
- with ncurses2.acs_display;
- with ncurses2.acs_and_scroll;
- with ncurses2.flushinp_test;
- with ncurses2.test_sgr_attributes;
- with ncurses2.menu_test;
- with ncurses2.demo_pad;
- with ncurses2.demo_forms;
- with ncurses2.overlap_test;
- with ncurses2.trace_set;
- with ncurses2.getopt; use ncurses2.getopt;
- package body ncurses2.m is
- use Int_IO;
- function To_trace (n : Integer) return Trace_Attribute_Set;
- procedure usage;
- procedure Set_Terminal_Modes;
- function Do_Single_Test (c : Character) return Boolean;
- function To_trace (n : Integer) return Trace_Attribute_Set is
- a : Trace_Attribute_Set := (others => False);
- m : Integer;
- rest : Integer;
- begin
- m := n mod 2;
- if 1 = m then
- a.Times := True;
- end if;
- rest := n / 2;
- m := rest mod 2;
- if 1 = m then
- a.Tputs := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Update := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Cursor_Move := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Character_Output := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Calls := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Virtual_Puts := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Input_Events := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.TTY_State := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Internal_Calls := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Character_Calls := True;
- end if;
- rest := rest / 2;
- m := rest mod 2;
- if 1 = m then
- a.Termcap_TermInfo := True;
- end if;
- return a;
- end To_trace;
- -- these are type Stdscr_Init_Proc;
- function rip_footer (
- Win : Window;
- Columns : Column_Count) return Integer;
- pragma Convention (C, rip_footer);
- function rip_footer (
- Win : Window;
- Columns : Column_Count) return Integer is
- begin
- Set_Background (Win, (Ch => ' ',
- Attr => (Reverse_Video => True, others => False),
- Color => 0));
- Erase (Win);
- Move_Cursor (Win, 0, 0);
- Add (Win, "footer:" & Columns'Img & " columns");
- Refresh_Without_Update (Win);
- return 0; -- Curses_OK;
- end rip_footer;
- function rip_header (
- Win : Window;
- Columns : Column_Count) return Integer;
- pragma Convention (C, rip_header);
- function rip_header (
- Win : Window;
- Columns : Column_Count) return Integer is
- begin
- Set_Background (Win, (Ch => ' ',
- Attr => (Reverse_Video => True, others => False),
- Color => 0));
- Erase (Win);
- Move_Cursor (Win, 0, 0);
- Add (Win, "header:" & Columns'Img & " columns");
- -- 'Img is a GNAT extention
- Refresh_Without_Update (Win);
- return 0; -- Curses_OK;
- end rip_header;
- procedure usage is
- -- type Stringa is access String;
- use Ada.Strings.Unbounded;
- -- tbl : constant array (Positive range <>) of Stringa := (
- tbl : constant array (Positive range <>) of Unbounded_String
- := (
- To_Unbounded_String ("Usage: ncurses [options]"),
- To_Unbounded_String (""),
- To_Unbounded_String ("Options:"),
- To_Unbounded_String (" -a f,b set default-colors " &
- "(assumed white-on-black)"),
- To_Unbounded_String (" -d use default-colors if terminal " &
- "supports them"),
- To_Unbounded_String (" -e fmt specify format for soft-keys " &
- "test (e)"),
- To_Unbounded_String (" -f rip-off footer line " &
- "(can repeat)"),
- To_Unbounded_String (" -h rip-off header line " &
- "(can repeat)"),
- To_Unbounded_String (" -s msec specify nominal time for " &
- "panel-demo (default: 1, to hold)"),
- To_Unbounded_String (" -t mask specify default trace-level " &
- "(may toggle with ^T)")
- );
- begin
- for n in tbl'Range loop
- Put_Line (Standard_Error, To_String (tbl (n)));
- end loop;
- -- exit(EXIT_FAILURE);
- -- TODO should we use Set_Exit_Status and throw and exception?
- end usage;
- procedure Set_Terminal_Modes is begin
- Set_Raw_Mode (SwitchOn => False);
- Set_Cbreak_Mode (SwitchOn => True);
- Set_Echo_Mode (SwitchOn => False);
- Allow_Scrolling (Mode => True);
- Use_Insert_Delete_Line (Do_Idl => True);
- Set_KeyPad_Mode (SwitchOn => True);
- end Set_Terminal_Modes;
- nap_msec : Integer := 1;
- function Do_Single_Test (c : Character) return Boolean is
- begin
- case c is
- when 'a' =>
- getch_test;
- when 'b' =>
- attr_test;
- when 'c' =>
- if not Has_Colors then
- Cannot ("does not support color.");
- else
- color_test;
- end if;
- when 'd' =>
- if not Has_Colors then
- Cannot ("does not support color.");
- elsif not Can_Change_Color then
- Cannot ("has hardwired color values.");
- else
- color_edit;
- end if;
- when 'e' =>
- slk_test;
- when 'f' =>
- acs_display;
- when 'o' =>
- demo_panels (nap_msec);
- when 'g' =>
- acs_and_scroll;
- when 'i' =>
- flushinp_test (Standard_Window);
- when 'k' =>
- test_sgr_attributes;
- when 'm' =>
- menu_test;
- when 'p' =>
- demo_pad;
- when 'r' =>
- demo_forms;
- when 's' =>
- overlap_test;
- when 't' =>
- trace_set;
- when '?' =>
- null;
- when others => return False;
- end case;
- return True;
- end Do_Single_Test;
- command : Character;
- my_e_param : Soft_Label_Key_Format := Four_Four;
- assumed_colors : Boolean := False;
- default_colors : Boolean := False;
- default_fg : Color_Number := White;
- default_bg : Color_Number := Black;
- -- nap_msec was an unsigned long integer in the C version,
- -- yet napms only takes an int!
- c : Integer;
- c2 : Character;
- optind : Integer := 1; -- must be initialized to one.
- optarg : getopt.stringa;
- length : Integer;
- tmpi : Integer;
- package myio is new Ada.Text_IO.Integer_IO (Integer);
- use myio;
- save_trace : Integer := 0;
- save_trace_set : Trace_Attribute_Set;
- function main return Integer is
- begin
- loop
- Qgetopt (c, Argument_Count, Argument'Access,
- "a:de:fhs:t:", optind, optarg);
- exit when c = -1;
- c2 := Character'Val (c);
- case c2 is
- when 'a' =>
- -- Ada doesn't have scanf, it doesn't even have a
- -- regular expression library.
- assumed_colors := True;
- myio.Get (optarg.all, Integer (default_fg), length);
- myio.Get (optarg.all (length + 2 .. optarg.all'Length),
- Integer (default_bg), length);
- when 'd' =>
- default_colors := True;
- when 'e' =>
- myio.Get (optarg.all, tmpi, length);
- if tmpi > 3 then
- usage;
- return 1;
- end if;
- my_e_param := Soft_Label_Key_Format'Val (tmpi);
- when 'f' =>
- Rip_Off_Lines (-1, rip_footer'Access);
- when 'h' =>
- Rip_Off_Lines (1, rip_header'Access);
- when 's' =>
- myio.Get (optarg.all, nap_msec, length);
- when 't' =>
- myio.Get (optarg.all, save_trace, length);
- when others =>
- usage;
- return 1;
- end case;
- end loop;
- -- the C version had a bunch of macros here.
- -- if (!isatty(fileno(stdin)))
- -- isatty is not available in the standard Ada so skip it.
- save_trace_set := To_trace (save_trace);
- Trace_On (save_trace_set);
- Init_Soft_Label_Keys (my_e_param);
- Init_Screen;
- Set_Background (Ch => (Ch => Blank,
- Attr => Normal_Video,
- Color => Color_Pair'First));
- if Has_Colors then
- Start_Color;
- if default_colors then
- Use_Default_Colors;
- elsif assumed_colors then
- Assume_Default_Colors (default_fg, default_bg);
- end if;
- end if;
- Set_Terminal_Modes;
- Save_Curses_Mode (Curses);
- End_Windows;
- -- TODO add macro #if blocks.
- Put_Line ("Welcome to " & Curses_Version & ". Press ? for help.");
- loop
- Put_Line ("This is the ncurses main menu");
- Put_Line ("a = keyboard and mouse input test");
- Put_Line ("b = character attribute test");
- Put_Line ("c = color test pattern");
- Put_Line ("d = edit RGB color values");
- Put_Line ("e = exercise soft keys");
- Put_Line ("f = display ACS characters");
- Put_Line ("g = display windows and scrolling");
- Put_Line ("i = test of flushinp()");
- Put_Line ("k = display character attributes");
- Put_Line ("m = menu code test");
- Put_Line ("o = exercise panels library");
- Put_Line ("p = exercise pad features");
- Put_Line ("q = quit");
- Put_Line ("r = exercise forms code");
- Put_Line ("s = overlapping-refresh test");
- Put_Line ("t = set trace level");
- Put_Line ("? = repeat this command summary");
- Put ("> ");
- Flush;
- command := Ada.Characters.Latin_1.NUL;
- -- get_input:
- -- loop
- declare
- Ch : Character;
- begin
- Get (Ch);
- -- TODO if read(ch) <= 0
- -- TODO ada doesn't have an Is_Space function
- command := Ch;
- -- TODO if ch = '\n' or '\r' are these in Ada?
- end;
- -- end loop get_input;
- declare
- begin
- if Do_Single_Test (command) then
- Flush_Input;
- Set_Terminal_Modes;
- Reset_Curses_Mode (Curses);
- Clear;
- Refresh;
- End_Windows;
- if command = '?' then
- Put_Line ("This is the ncurses capability tester.");
- Put_Line ("You may select a test from the main menu by " &
- "typing the");
- Put_Line ("key letter of the choice (the letter to left " &
- "of the =)");
- Put_Line ("at the > prompt. The commands `x' or `q' will " &
- "exit.");
- end if;
- -- continue; --why continue in the C version?
- end if;
- exception
- when Curses_Exception => End_Windows;
- end;
- exit when command = 'q';
- end loop;
- Curses_Free_All;
- return 0; -- TODO ExitProgram(EXIT_SUCCESS);
- end main;
- end ncurses2.m;
|