1 ------------------------------------------------------------------------------
3 -- GNAT ncurses Binding Samples --
9 ------------------------------------------------------------------------------
10 -- Copyright (c) 2000,2001,2004 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 -- $Date: 2004/08/21 21:37:00 $
40 -- Binding Version 01.00
41 ------------------------------------------------------------------------------
42 with ncurses2.util; use ncurses2.util;
43 with Terminal_Interface.Curses; use Terminal_Interface.Curses;
44 with Terminal_Interface.Curses.Terminfo;
45 use Terminal_Interface.Curses.Terminfo;
46 with Ada.Characters.Handling;
47 with Ada.Strings.Fixed;
49 procedure ncurses2.attr_test is
51 function subset (super, sub : Character_Attribute_Set) return Boolean;
52 function intersect (b, a : Character_Attribute_Set) return Boolean;
53 function has_A_COLOR (attr : Attributed_Character) return Boolean;
54 function show_attr (row : Line_Position;
56 attr : Character_Attribute_Set;
58 once : Boolean) return Line_Position;
59 procedure attr_getc (skip : out Integer;
60 fg, bg : in out Color_Number;
61 result : out Boolean);
64 function subset (super, sub : Character_Attribute_Set) return Boolean is
67 (super.Stand_Out or not sub.Stand_Out) and
68 (super.Under_Line or not sub.Under_Line) and
69 (super.Reverse_Video or not sub.Reverse_Video) and
70 (super.Blink or not sub.Blink) and
71 (super.Dim_Character or not sub.Dim_Character) and
72 (super.Bold_Character or not sub.Bold_Character) and
73 (super.Alternate_Character_Set or not sub.Alternate_Character_Set) and
74 (super.Invisible_Character or not sub.Invisible_Character) -- and
75 -- (super.Protected_Character or not sub.Protected_Character) and
76 -- (super.Horizontal or not sub.Horizontal) and
77 -- (super.Left or not sub.Left) and
78 -- (super.Low or not sub.Low) and
79 -- (super.Right or not sub.Right) and
80 -- (super.Top or not sub.Top) and
81 -- (super.Vertical or not sub.Vertical)
90 function intersect (b, a : Character_Attribute_Set) return Boolean is
93 (a.Stand_Out and b.Stand_Out) or
94 (a.Under_Line and b.Under_Line) or
95 (a.Reverse_Video and b.Reverse_Video) or
96 (a.Blink and b.Blink) or
97 (a.Dim_Character and b.Dim_Character) or
98 (a.Bold_Character and b.Bold_Character) or
99 (a.Alternate_Character_Set and b.Alternate_Character_Set) or
100 (a.Invisible_Character and b.Invisible_Character) -- or
101 -- (a.Protected_Character and b.Protected_Character) or
102 -- (a.Horizontal and b.Horizontal) or
103 -- (a.Left and b.Left) or
104 -- (a.Low and b.Low) or
105 -- (a.Right and b.Right) or
106 -- (a.Top and b.Top) or
107 -- (a.Vertical and b.Vertical)
115 function has_A_COLOR (attr : Attributed_Character) return Boolean is
117 if attr.Color /= Color_Pair (0) then
124 -- Print some text with attributes.
125 function show_attr (row : Line_Position;
127 attr : Character_Attribute_Set;
129 once : Boolean) return Line_Position is
131 function make_record (n : Integer) return Character_Attribute_Set;
132 function make_record (n : Integer) return Character_Attribute_Set is
133 -- unsupported means true
134 a : Character_Attribute_Set := (others => False);
138 -- ncv is a bitmap with these fields
148 -- It means no_color_video,
149 -- video attributes that can't be used with colors
150 -- see man terminfo.5
159 a.Under_Line := True;
164 a.Reverse_Video := True;
174 a.Bold_Character := True;
179 a.Invisible_Character := True;
184 -- a.Protected_Character := True;
189 a.Alternate_Character_Set := True;
195 ncv : constant Integer := Get_Number ("ncv");
198 Move_Cursor (Line => row, Column => 8);
199 Add (Str => name & " mode:");
200 Move_Cursor (Line => row, Column => 24);
203 -- printw("%*s", skip, " ")
204 Add (Str => Ada.Strings.Fixed."*" (skip, ' '));
207 Switch_Character_Attribute (Attr => attr);
209 Set_Character_Attributes (Attr => attr);
211 Add (Str => "abcde fghij klmno pqrst uvwxy z");
213 Switch_Character_Attribute (Attr => attr, On => False);
216 Add (Str => Ada.Strings.Fixed."*" (skip, ' '));
219 if attr /= Normal_Video then
221 if not subset (super => Supported_Attributes, sub => attr) then
222 Add (Str => " (N/A)");
223 elsif ncv > 0 and has_A_COLOR (Get_Background) then
225 Color_Supported_Attributes :
226 constant Character_Attribute_Set := make_record (ncv);
228 if intersect (Color_Supported_Attributes, attr) then
229 Add (Str => " (NCV) ");
238 procedure attr_getc (skip : out Integer; fg, bg : in out Color_Number;
239 result : out Boolean) is
240 ch : constant Key_Code := Getchar;
241 nc : constant Color_Number := Color_Number (Number_Of_Colors);
243 pragma Import (C, curscr, "curscr");
244 -- curscr is not implemented in the Ada binding
247 if Ada.Characters.Handling.Is_Digit (Character'Val (ch)) then
248 skip := ctoi (Code_To_Char (ch));
249 elsif ch = CTRL ('L') then
253 elsif Has_Colors then
255 -- Note the mathematical elegance compared to the C version.
256 when Character'Pos ('f') => fg := (fg + 1) mod nc;
257 when Character'Pos ('F') => fg := (fg - 1) mod nc;
258 when Character'Pos ('b') => bg := (bg + 1) mod nc;
259 when Character'Pos ('B') => bg := (bg - 1) mod nc;
270 -- pairs could be defined as array ( Color_Number(0) .. colors - 1) of
271 -- array (Color_Number(0).. colors - 1) of Boolean;
272 pairs : array (Color_Pair'Range) of Boolean := (others => False);
273 fg, bg : Color_Number := Black; -- = 0;
274 xmc : constant Integer := Get_Number ("xmc");
275 skip : Integer := xmc;
290 row : Line_Position := 2;
291 normal : Attributed_Character := Blank2;
294 -- row := 2; -- weird, row is set to 0 without this.
295 -- TODO delete the above line, it was a gdb quirk that confused me
296 if Has_Colors then declare
297 pair : constant Color_Pair :=
298 Color_Pair (fg * Color_Number (Number_Of_Colors) + bg);
300 -- Go though each color pair. Assume that the number of
301 -- Redefinable_Color_Pairs is 8*8 with predefined Colors 0..7
302 if not pairs (pair) then
303 Init_Pair (pair, fg, bg);
304 pairs (pair) := True;
306 normal.Color := pair;
309 Set_Background (Ch => normal);
312 Add (Line => 0, Column => 20,
313 Str => "Character attribute test display");
315 row := show_attr (row, n, (Stand_Out => True, others => False),
317 row := show_attr (row, n, (Reverse_Video => True, others => False),
319 row := show_attr (row, n, (Bold_Character => True, others => False),
321 row := show_attr (row, n, (Under_Line => True, others => False),
323 row := show_attr (row, n, (Dim_Character => True, others => False),
325 row := show_attr (row, n, (Blink => True, others => False),
327 -- row := show_attr (row, n, (Protected_Character => True,
328 -- others => False), "PROTECT", True);
329 row := show_attr (row, n, (Invisible_Character => True,
330 others => False), "INVISIBLE", True);
331 row := show_attr (row, n, Normal_Video, "NORMAL", False);
333 Move_Cursor (Line => row, Column => 8);
335 Add (Str => "This terminal does have the magic-cookie glitch");
337 Add (Str => "This terminal does not have the magic-cookie glitch");
339 Move_Cursor (Line => row + 1, Column => 8);
340 Add (Str => "Enter a digit to set gaps on each side of " &
341 "displayed attributes");
342 Move_Cursor (Line => row + 2, Column => 8);
343 Add (Str => "^L = repaint");
345 declare tmp1 : String (1 .. 1);
347 Add (Str => ". f/F/b/F toggle colors (");
348 Put (tmp1, Integer (fg));
351 Put (tmp1, Integer (bg));
359 declare result : Boolean; begin
360 attr_getc (n, fg, bg, result);
361 exit when not result;
365 Set_Background (Ch => Blank2);
368 end ncurses2.attr_test;