ncurses 5.3
[ncurses.git] / Ada95 / src / terminal_interface-curses.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                           GNAT ncurses Binding                           --
4 --                                                                          --
5 --                        Terminal_Interface.Curses                         --
6 --                                                                          --
7 --                                 B O D Y                                  --
8 --                                                                          --
9 ------------------------------------------------------------------------------
10 -- Copyright (c) 1998 Free Software Foundation, Inc.                        --
11 --                                                                          --
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:                 --
19 --                                                                          --
20 -- The above copyright notice and this permission notice shall be included  --
21 -- in all copies or substantial portions of the Software.                   --
22 --                                                                          --
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.                               --
30 --                                                                          --
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       --
34 -- authorization.                                                           --
35 ------------------------------------------------------------------------------
36 --  Author: Juergen Pfeifer, 1996
37 --  Contact: http://www.familiepfeifer.de/Contact.aspx?Lang=en
38 --  Version Control:
39 --  $Revision: 1.28 $
40 --  Binding Version 01.00
41 ------------------------------------------------------------------------------
42 with System;
43
44 with Terminal_Interface.Curses.Aux;
45 with Interfaces.C;                  use Interfaces.C;
46 with Interfaces.C.Strings;          use Interfaces.C.Strings;
47 with Interfaces.C.Pointers;
48 with Ada.Characters.Handling;       use Ada.Characters.Handling;
49 with Ada.Strings.Fixed;
50 with Ada.Unchecked_Conversion;
51
52 package body Terminal_Interface.Curses is
53
54    use Aux;
55    use type System.Bit_Order;
56
57    package ASF renames Ada.Strings.Fixed;
58
59    type chtype_array is array (size_t range <>)
60       of aliased Attributed_Character;
61    pragma Convention (C, chtype_array);
62
63 ------------------------------------------------------------------------------
64    generic
65       type Element is (<>);
66    function W_Get_Element (Win    : in Window;
67                            Offset : in Natural) return Element;
68
69    function W_Get_Element (Win    : in Window;
70                            Offset : in Natural) return Element is
71       type E_Array is array (Natural range <>) of aliased Element;
72       package C_E_Array is new
73         Interfaces.C.Pointers (Natural, Element, E_Array, Element'Val (0));
74       use C_E_Array;
75
76       function To_Pointer is new
77         Ada.Unchecked_Conversion (Window, Pointer);
78
79       P : Pointer := To_Pointer (Win);
80    begin
81       if Win = Null_Window then
82          raise Curses_Exception;
83       else
84          P := P + ptrdiff_t (Offset);
85          return P.all;
86       end if;
87    end W_Get_Element;
88
89    function W_Get_Int   is new W_Get_Element (C_Int);
90    function W_Get_Short is new W_Get_Element (C_Short);
91    function W_Get_Byte  is new W_Get_Element (Interfaces.C.unsigned_char);
92
93    function Get_Flag (Win    : Window;
94                       Offset : Natural) return Boolean;
95
96    function Get_Flag (Win    : Window;
97                       Offset : Natural) return Boolean
98    is
99       Res : C_Int;
100    begin
101       case Sizeof_bool is
102          when 1 => Res := C_Int (W_Get_Byte  (Win, Offset));
103          when 2 => Res := C_Int (W_Get_Short (Win, Offset));
104          when 4 => Res := C_Int (W_Get_Int   (Win, Offset));
105          when others => raise Curses_Exception;
106       end case;
107
108       case Res is
109          when 0       => return False;
110          when others  => return True;
111       end case;
112    end Get_Flag;
113
114 ------------------------------------------------------------------------------
115    function Key_Name (Key : in Real_Key_Code) return String
116    is
117       function Keyname (K : C_Int) return chars_ptr;
118       pragma Import (C, Keyname, "keyname");
119
120       Ch : Character;
121    begin
122       if Key <= Character'Pos (Character'Last) then
123          Ch := Character'Val (Key);
124          if Is_Control (Ch) then
125             return Un_Control (Attributed_Character'(Ch    => Ch,
126                                                      Color => Color_Pair'First,
127                                                      Attr  => Normal_Video));
128          elsif Is_Graphic (Ch) then
129             declare
130                S : String (1 .. 1);
131             begin
132                S (1) := Ch;
133                return S;
134             end;
135          else
136             return "";
137          end if;
138       else
139          return Fill_String (Keyname (C_Int (Key)));
140       end if;
141    end Key_Name;
142
143    procedure Key_Name (Key  : in  Real_Key_Code;
144                        Name : out String)
145    is
146    begin
147       ASF.Move (Key_Name (Key), Name);
148    end Key_Name;
149
150 ------------------------------------------------------------------------------
151    procedure Init_Screen
152    is
153       function Initscr return Window;
154       pragma Import (C, Initscr, "initscr");
155
156       W : Window;
157    begin
158       W := Initscr;
159       if W = Null_Window then
160          raise Curses_Exception;
161       end if;
162    end Init_Screen;
163
164    procedure End_Windows
165    is
166       function Endwin return C_Int;
167       pragma Import (C, Endwin, "endwin");
168    begin
169       if Endwin = Curses_Err then
170          raise Curses_Exception;
171       end if;
172    end End_Windows;
173
174    function Is_End_Window return Boolean
175    is
176       function Isendwin return Curses_Bool;
177       pragma Import (C, Isendwin, "isendwin");
178    begin
179       if Isendwin = Curses_Bool_False then
180          return False;
181       else
182          return True;
183       end if;
184    end Is_End_Window;
185 ------------------------------------------------------------------------------
186    procedure Move_Cursor (Win    : in Window := Standard_Window;
187                           Line   : in Line_Position;
188                           Column : in Column_Position)
189    is
190       function Wmove (Win    : Window;
191                       Line   : C_Int;
192                       Column : C_Int
193                      ) return C_Int;
194       pragma Import (C, Wmove, "wmove");
195    begin
196       if Wmove (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
197          raise Curses_Exception;
198       end if;
199    end Move_Cursor;
200 ------------------------------------------------------------------------------
201    procedure Add (Win : in Window := Standard_Window;
202                   Ch  : in Attributed_Character)
203    is
204       function Waddch (W  : Window;
205                        Ch : C_Chtype) return C_Int;
206       pragma Import (C, Waddch, "waddch");
207    begin
208       if Waddch (Win, AttrChar_To_Chtype (Ch)) = Curses_Err then
209          raise Curses_Exception;
210       end if;
211    end Add;
212
213    procedure Add (Win : in Window := Standard_Window;
214                   Ch  : in Character)
215    is
216    begin
217       Add (Win,
218            Attributed_Character'(Ch    => Ch,
219                                  Color => Color_Pair'First,
220                                  Attr  => Normal_Video));
221    end Add;
222
223    procedure Add
224      (Win    : in Window := Standard_Window;
225       Line   : in Line_Position;
226       Column : in Column_Position;
227       Ch     : in Attributed_Character)
228    is
229       function mvwaddch (W  : Window;
230                          Y  : C_Int;
231                          X  : C_Int;
232                          Ch : C_Chtype) return C_Int;
233       pragma Import (C, mvwaddch, "mvwaddch");
234    begin
235       if mvwaddch (Win, C_Int (Line),
236                    C_Int (Column),
237                    AttrChar_To_Chtype (Ch)) = Curses_Err then
238          raise Curses_Exception;
239       end if;
240    end Add;
241
242    procedure Add
243      (Win    : in Window := Standard_Window;
244       Line   : in Line_Position;
245       Column : in Column_Position;
246       Ch     : in Character)
247    is
248    begin
249       Add (Win,
250            Line,
251            Column,
252            Attributed_Character'(Ch    => Ch,
253                                  Color => Color_Pair'First,
254                                  Attr  => Normal_Video));
255    end Add;
256
257    procedure Add_With_Immediate_Echo
258      (Win : in Window := Standard_Window;
259       Ch  : in Attributed_Character)
260    is
261       function Wechochar (W  : Window;
262                           Ch : C_Chtype) return C_Int;
263       pragma Import (C, Wechochar, "wechochar");
264    begin
265       if Wechochar (Win, AttrChar_To_Chtype (Ch)) = Curses_Err then
266          raise Curses_Exception;
267       end if;
268    end Add_With_Immediate_Echo;
269
270    procedure Add_With_Immediate_Echo
271      (Win : in Window := Standard_Window;
272       Ch  : in Character)
273    is
274    begin
275       Add_With_Immediate_Echo
276         (Win,
277          Attributed_Character'(Ch    => Ch,
278                                Color => Color_Pair'First,
279                                Attr  => Normal_Video));
280    end Add_With_Immediate_Echo;
281 ------------------------------------------------------------------------------
282    function Create (Number_Of_Lines       : Line_Count;
283                     Number_Of_Columns     : Column_Count;
284                     First_Line_Position   : Line_Position;
285                     First_Column_Position : Column_Position) return Window
286    is
287       function Newwin (Number_Of_Lines       : C_Int;
288                        Number_Of_Columns     : C_Int;
289                        First_Line_Position   : C_Int;
290                        First_Column_Position : C_Int) return Window;
291       pragma Import (C, Newwin, "newwin");
292
293       W : Window;
294    begin
295       W := Newwin (C_Int (Number_Of_Lines),
296                    C_Int (Number_Of_Columns),
297                    C_Int (First_Line_Position),
298                    C_Int (First_Column_Position));
299       if W = Null_Window then
300          raise Curses_Exception;
301       end if;
302       return W;
303    end Create;
304
305    procedure Delete (Win : in out Window)
306    is
307       function Wdelwin (W : Window) return C_Int;
308       pragma Import (C, Wdelwin, "delwin");
309    begin
310       if Wdelwin (Win) = Curses_Err then
311          raise Curses_Exception;
312       end if;
313       Win := Null_Window;
314    end Delete;
315
316    function Sub_Window
317      (Win                   : Window := Standard_Window;
318       Number_Of_Lines       : Line_Count;
319       Number_Of_Columns     : Column_Count;
320       First_Line_Position   : Line_Position;
321       First_Column_Position : Column_Position) return Window
322    is
323       function Subwin
324         (Win                   : Window;
325          Number_Of_Lines       : C_Int;
326          Number_Of_Columns     : C_Int;
327          First_Line_Position   : C_Int;
328          First_Column_Position : C_Int) return Window;
329       pragma Import (C, Subwin, "subwin");
330
331       W : Window;
332    begin
333       W := Subwin (Win,
334                    C_Int (Number_Of_Lines),
335                    C_Int (Number_Of_Columns),
336                    C_Int (First_Line_Position),
337                    C_Int (First_Column_Position));
338       if W = Null_Window then
339          raise Curses_Exception;
340       end if;
341       return W;
342    end Sub_Window;
343
344    function Derived_Window
345      (Win                   : Window := Standard_Window;
346       Number_Of_Lines       : Line_Count;
347       Number_Of_Columns     : Column_Count;
348       First_Line_Position   : Line_Position;
349       First_Column_Position : Column_Position) return Window
350    is
351       function Derwin
352         (Win                   : Window;
353          Number_Of_Lines       : C_Int;
354          Number_Of_Columns     : C_Int;
355          First_Line_Position   : C_Int;
356          First_Column_Position : C_Int) return Window;
357       pragma Import (C, Derwin, "derwin");
358
359       W : Window;
360    begin
361       W := Derwin (Win,
362                    C_Int (Number_Of_Lines),
363                    C_Int (Number_Of_Columns),
364                    C_Int (First_Line_Position),
365                    C_Int (First_Column_Position));
366       if W = Null_Window then
367          raise Curses_Exception;
368       end if;
369       return W;
370    end Derived_Window;
371
372    function Duplicate (Win : Window) return Window
373    is
374       function Dupwin (Win : Window) return Window;
375       pragma Import (C, Dupwin, "dupwin");
376
377       W : Window := Dupwin (Win);
378    begin
379       if W = Null_Window then
380          raise Curses_Exception;
381       end if;
382       return W;
383    end Duplicate;
384
385    procedure Move_Window (Win    : in Window;
386                           Line   : in Line_Position;
387                           Column : in Column_Position)
388    is
389       function Mvwin (Win    : Window;
390                       Line   : C_Int;
391                       Column : C_Int) return C_Int;
392       pragma Import (C, Mvwin, "mvwin");
393    begin
394       if Mvwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
395          raise Curses_Exception;
396       end if;
397    end Move_Window;
398
399    procedure Move_Derived_Window (Win    : in Window;
400                                   Line   : in Line_Position;
401                                   Column : in Column_Position)
402    is
403       function Mvderwin (Win    : Window;
404                          Line   : C_Int;
405                          Column : C_Int) return C_Int;
406       pragma Import (C, Mvderwin, "mvderwin");
407    begin
408       if Mvderwin (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
409          raise Curses_Exception;
410       end if;
411    end Move_Derived_Window;
412
413    procedure Set_Synch_Mode (Win  : in Window  := Standard_Window;
414                              Mode : in Boolean := False)
415    is
416       function Syncok (Win  : Window;
417                        Mode : Curses_Bool) return C_Int;
418       pragma Import (C, Syncok, "syncok");
419    begin
420       if Syncok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
421          raise Curses_Exception;
422       end if;
423    end Set_Synch_Mode;
424 ------------------------------------------------------------------------------
425    procedure Add (Win : in Window := Standard_Window;
426                   Str : in String;
427                   Len : in Integer := -1)
428    is
429       function Waddnstr (Win : Window;
430                          Str : char_array;
431                          Len : C_Int := -1) return C_Int;
432       pragma Import (C, Waddnstr, "waddnstr");
433
434       Txt    : char_array (0 .. Str'Length);
435       Length : size_t;
436    begin
437       To_C (Str, Txt, Length);
438       if Waddnstr (Win, Txt, C_Int (Len)) = Curses_Err then
439          raise Curses_Exception;
440       end if;
441    end Add;
442
443    procedure Add
444      (Win    : in Window := Standard_Window;
445       Line   : in Line_Position;
446       Column : in Column_Position;
447       Str    : in String;
448       Len    : in Integer := -1)
449    is
450    begin
451       Move_Cursor (Win, Line, Column);
452       Add (Win, Str, Len);
453    end Add;
454 ------------------------------------------------------------------------------
455    procedure Add
456      (Win : in Window := Standard_Window;
457       Str : in Attributed_String;
458       Len : in Integer := -1)
459    is
460       function Waddchnstr (Win : Window;
461                            Str : chtype_array;
462                            Len : C_Int := -1) return C_Int;
463       pragma Import (C, Waddchnstr, "waddchnstr");
464
465       Txt : chtype_array (0 .. Str'Length);
466    begin
467       for Length in 1 .. size_t (Str'Length) loop
468          Txt (Length - 1) := Str (Natural (Length));
469       end loop;
470       Txt (Str'Length) := Default_Character;
471       if Waddchnstr (Win,
472                      Txt,
473                      C_Int (Len)) = Curses_Err then
474          raise Curses_Exception;
475       end if;
476    end Add;
477
478    procedure Add
479      (Win    : in Window := Standard_Window;
480       Line   : in Line_Position;
481       Column : in Column_Position;
482       Str    : in Attributed_String;
483       Len    : in Integer := -1)
484    is
485    begin
486       Move_Cursor (Win, Line, Column);
487       Add (Win, Str, Len);
488    end Add;
489 ------------------------------------------------------------------------------
490    procedure Border
491      (Win                       : in Window := Standard_Window;
492       Left_Side_Symbol          : in Attributed_Character := Default_Character;
493       Right_Side_Symbol         : in Attributed_Character := Default_Character;
494       Top_Side_Symbol           : in Attributed_Character := Default_Character;
495       Bottom_Side_Symbol        : in Attributed_Character := Default_Character;
496       Upper_Left_Corner_Symbol  : in Attributed_Character := Default_Character;
497       Upper_Right_Corner_Symbol : in Attributed_Character := Default_Character;
498       Lower_Left_Corner_Symbol  : in Attributed_Character := Default_Character;
499       Lower_Right_Corner_Symbol : in Attributed_Character := Default_Character)
500    is
501       function Wborder (W   : Window;
502                         LS  : C_Chtype;
503                         RS  : C_Chtype;
504                         TS  : C_Chtype;
505                         BS  : C_Chtype;
506                         ULC : C_Chtype;
507                         URC : C_Chtype;
508                         LLC : C_Chtype;
509                         LRC : C_Chtype) return C_Int;
510       pragma Import (C, Wborder, "wborder");
511    begin
512       if Wborder (Win,
513                   AttrChar_To_Chtype (Left_Side_Symbol),
514                   AttrChar_To_Chtype (Right_Side_Symbol),
515                   AttrChar_To_Chtype (Top_Side_Symbol),
516                   AttrChar_To_Chtype (Bottom_Side_Symbol),
517                   AttrChar_To_Chtype (Upper_Left_Corner_Symbol),
518                   AttrChar_To_Chtype (Upper_Right_Corner_Symbol),
519                   AttrChar_To_Chtype (Lower_Left_Corner_Symbol),
520                   AttrChar_To_Chtype (Lower_Right_Corner_Symbol)
521                   ) = Curses_Err
522       then
523          raise Curses_Exception;
524       end if;
525    end Border;
526
527    procedure Box
528      (Win               : in Window := Standard_Window;
529       Vertical_Symbol   : in Attributed_Character := Default_Character;
530       Horizontal_Symbol : in Attributed_Character := Default_Character)
531    is
532    begin
533       Border (Win,
534               Vertical_Symbol, Vertical_Symbol,
535               Horizontal_Symbol, Horizontal_Symbol);
536    end Box;
537
538    procedure Horizontal_Line
539      (Win         : in Window := Standard_Window;
540       Line_Size   : in Natural;
541       Line_Symbol : in Attributed_Character := Default_Character)
542    is
543       function Whline (W   : Window;
544                        Ch  : C_Chtype;
545                        Len : C_Int) return C_Int;
546       pragma Import (C, Whline, "whline");
547    begin
548       if Whline (Win,
549                  AttrChar_To_Chtype (Line_Symbol),
550                  C_Int (Line_Size)) = Curses_Err then
551          raise Curses_Exception;
552       end if;
553    end Horizontal_Line;
554
555    procedure Vertical_Line
556      (Win         : in Window := Standard_Window;
557       Line_Size   : in Natural;
558       Line_Symbol : in Attributed_Character := Default_Character)
559    is
560       function Wvline (W   : Window;
561                        Ch  : C_Chtype;
562                        Len : C_Int) return C_Int;
563       pragma Import (C, Wvline, "wvline");
564    begin
565       if Wvline (Win,
566                  AttrChar_To_Chtype (Line_Symbol),
567                  C_Int (Line_Size)) = Curses_Err then
568          raise Curses_Exception;
569       end if;
570    end Vertical_Line;
571
572 ------------------------------------------------------------------------------
573    function Get_Keystroke (Win : Window := Standard_Window)
574      return Real_Key_Code
575    is
576       function Wgetch (W : Window) return C_Int;
577       pragma Import (C, Wgetch, "wgetch");
578
579       C : constant C_Int := Wgetch (Win);
580    begin
581       if C = Curses_Err then
582          return Key_None;
583       else
584          return Real_Key_Code (C);
585       end if;
586    end Get_Keystroke;
587
588    procedure Undo_Keystroke (Key : in Real_Key_Code)
589    is
590       function Ungetch (Ch : C_Int) return C_Int;
591       pragma Import (C, Ungetch, "ungetch");
592    begin
593       if Ungetch (C_Int (Key)) = Curses_Err then
594          raise Curses_Exception;
595       end if;
596    end Undo_Keystroke;
597
598    function Has_Key (Key : Special_Key_Code) return Boolean
599    is
600       function Haskey (Key : C_Int) return C_Int;
601       pragma Import (C, Haskey, "has_key");
602    begin
603       if Haskey (C_Int (Key)) = Curses_False then
604          return False;
605       else
606          return True;
607       end if;
608    end Has_Key;
609
610    function Is_Function_Key (Key : Special_Key_Code) return Boolean
611    is
612       L : constant Special_Key_Code  := Special_Key_Code (Natural (Key_F0) +
613         Natural (Function_Key_Number'Last));
614    begin
615       if (Key >= Key_F0) and then (Key <= L) then
616          return True;
617       else
618          return False;
619       end if;
620    end Is_Function_Key;
621
622    function Function_Key (Key : Real_Key_Code)
623                           return Function_Key_Number
624    is
625    begin
626       if Is_Function_Key (Key) then
627          return Function_Key_Number (Key - Key_F0);
628       else
629          raise Constraint_Error;
630       end if;
631    end Function_Key;
632
633    function Function_Key_Code (Key : Function_Key_Number) return Real_Key_Code
634    is
635    begin
636       return Real_Key_Code (Natural (Key_F0) + Natural (Key));
637    end Function_Key_Code;
638 ------------------------------------------------------------------------------
639    procedure Standout (Win : Window  := Standard_Window;
640                        On  : Boolean := True)
641    is
642       function wstandout (Win : Window) return C_Int;
643       pragma Import (C, wstandout, "wstandout");
644       function wstandend (Win : Window) return C_Int;
645       pragma Import (C, wstandend, "wstandend");
646
647       Err : C_Int;
648    begin
649       if On then
650          Err := wstandout (Win);
651       else
652          Err := wstandend (Win);
653       end if;
654       if Err = Curses_Err then
655          raise Curses_Exception;
656       end if;
657    end Standout;
658
659    procedure Switch_Character_Attribute
660      (Win  : in Window := Standard_Window;
661       Attr : in Character_Attribute_Set := Normal_Video;
662       On   : in Boolean := True)
663    is
664       function Wattron (Win    : Window;
665                         C_Attr : C_AttrType) return C_Int;
666       pragma Import (C, Wattron, "wattr_on");
667       function Wattroff (Win    : Window;
668                          C_Attr : C_AttrType) return C_Int;
669       pragma Import (C, Wattroff, "wattr_off");
670       --  In Ada we use the On Boolean to control whether or not we want to
671       --  switch on or off the attributes in the set.
672       Err : C_Int;
673       AC  : constant Attributed_Character := (Ch    => Character'First,
674                                               Color => Color_Pair'First,
675                                               Attr  => Attr);
676    begin
677       if On then
678          Err := Wattron  (Win, AttrChar_To_AttrType (AC));
679       else
680          Err := Wattroff (Win, AttrChar_To_AttrType (AC));
681       end if;
682       if Err = Curses_Err then
683          raise Curses_Exception;
684       end if;
685    end Switch_Character_Attribute;
686
687    procedure Set_Character_Attributes
688      (Win   : in Window := Standard_Window;
689       Attr  : in Character_Attribute_Set := Normal_Video;
690       Color : in Color_Pair := Color_Pair'First)
691    is
692       function Wattrset (Win    : Window;
693                          C_Attr : C_AttrType) return C_Int;
694       pragma Import (C, Wattrset, "wattrset"); -- ??? wattr_set
695    begin
696       if Wattrset (Win,
697                    AttrChar_To_AttrType (Attributed_Character'
698                                          (Ch    => Character'First,
699                                           Color => Color,
700                                           Attr  => Attr))) = Curses_Err then
701          raise Curses_Exception;
702       end if;
703    end Set_Character_Attributes;
704
705    function Get_Character_Attribute (Win : Window := Standard_Window)
706                                      return Character_Attribute_Set
707    is
708       function Wattrget (Win : Window;
709                          Atr : access C_AttrType;
710                          Col : access C_Short;
711                          Opt : System.Address) return C_Int;
712       pragma Import (C, Wattrget, "wattr_get");
713
714       Attr : aliased C_AttrType;
715       Col  : aliased C_Short;
716       Res  : constant C_Int := Wattrget (Win, Attr'Access, Col'Access,
717                                          System.Null_Address);
718       Ch   : Attributed_Character;
719    begin
720       if Res = Curses_Ok then
721          Ch := AttrType_To_AttrChar (Attr);
722          return Ch.Attr;
723       else
724          raise Curses_Exception;
725       end if;
726    end Get_Character_Attribute;
727
728    function Get_Character_Attribute (Win : Window := Standard_Window)
729                                      return Color_Pair
730    is
731       function Wattrget (Win : Window;
732                          Atr : access C_AttrType;
733                          Col : access C_Short;
734                          Opt : System.Address) return C_Int;
735       pragma Import (C, Wattrget, "wattr_get");
736
737       Attr : aliased C_AttrType;
738       Col  : aliased C_Short;
739       Res  : constant C_Int := Wattrget (Win, Attr'Access, Col'Access,
740                                          System.Null_Address);
741       Ch   : Attributed_Character;
742    begin
743       if Res = Curses_Ok then
744          Ch := AttrType_To_AttrChar (Attr);
745          return Ch.Color;
746       else
747          raise Curses_Exception;
748       end if;
749    end Get_Character_Attribute;
750
751    procedure Set_Color (Win  : in Window := Standard_Window;
752                         Pair : in Color_Pair)
753    is
754       function Wset_Color (Win   : Window;
755                            Color : C_Short;
756                            Opts  : C_Void_Ptr) return C_Int;
757       pragma Import (C, Wset_Color, "wcolor_set");
758    begin
759       if Wset_Color (Win,
760                      C_Short (Pair),
761                      C_Void_Ptr (System.Null_Address)) = Curses_Err then
762          raise Curses_Exception;
763       end if;
764    end Set_Color;
765
766    procedure Change_Attributes
767      (Win   : in Window := Standard_Window;
768       Count : in Integer := -1;
769       Attr  : in Character_Attribute_Set := Normal_Video;
770       Color : in Color_Pair := Color_Pair'First)
771    is
772       function Wchgat (Win   : Window;
773                        Cnt   : C_Int;
774                        Attr  : C_AttrType;
775                        Color : C_Short;
776                        Opts  : System.Address := System.Null_Address)
777                        return C_Int;
778       pragma Import (C, Wchgat, "wchgat");
779
780       Ch : constant Attributed_Character :=
781         (Ch => Character'First, Color => Color_Pair'First, Attr => Attr);
782    begin
783       if Wchgat (Win, C_Int (Count), AttrChar_To_AttrType (Ch),
784                  C_Short (Color)) = Curses_Err then
785          raise Curses_Exception;
786       end if;
787    end Change_Attributes;
788
789    procedure Change_Attributes
790      (Win    : in Window := Standard_Window;
791       Line   : in Line_Position := Line_Position'First;
792       Column : in Column_Position := Column_Position'First;
793       Count  : in Integer := -1;
794       Attr   : in Character_Attribute_Set := Normal_Video;
795       Color  : in Color_Pair := Color_Pair'First)
796    is
797    begin
798       Move_Cursor (Win, Line, Column);
799       Change_Attributes (Win, Count, Attr, Color);
800    end Change_Attributes;
801 ------------------------------------------------------------------------------
802    procedure Beep
803    is
804       function Beeper return C_Int;
805       pragma Import (C, Beeper, "beep");
806    begin
807       if Beeper = Curses_Err then
808          raise Curses_Exception;
809       end if;
810    end Beep;
811
812    procedure Flash_Screen
813    is
814       function Flash return C_Int;
815       pragma Import (C, Flash, "flash");
816    begin
817       if Flash = Curses_Err then
818          raise Curses_Exception;
819       end if;
820    end Flash_Screen;
821 ------------------------------------------------------------------------------
822    procedure Set_Cbreak_Mode (SwitchOn : in Boolean := True)
823    is
824       function Cbreak return C_Int;
825       pragma Import (C, Cbreak, "cbreak");
826       function NoCbreak return C_Int;
827       pragma Import (C, NoCbreak, "nocbreak");
828
829       Err : C_Int;
830    begin
831       if SwitchOn then
832          Err := Cbreak;
833       else
834          Err := NoCbreak;
835       end if;
836       if Err = Curses_Err then
837          raise Curses_Exception;
838       end if;
839    end Set_Cbreak_Mode;
840
841    procedure Set_Raw_Mode (SwitchOn : in Boolean := True)
842    is
843       function Raw return C_Int;
844       pragma Import (C, Raw, "raw");
845       function NoRaw return C_Int;
846       pragma Import (C, NoRaw, "noraw");
847
848       Err : C_Int;
849    begin
850       if SwitchOn then
851          Err := Raw;
852       else
853          Err := NoRaw;
854       end if;
855       if Err = Curses_Err then
856          raise Curses_Exception;
857       end if;
858    end Set_Raw_Mode;
859
860    procedure Set_Echo_Mode (SwitchOn : in Boolean := True)
861    is
862       function Echo return C_Int;
863       pragma Import (C, Echo, "echo");
864       function NoEcho return C_Int;
865       pragma Import (C, NoEcho, "noecho");
866
867       Err : C_Int;
868    begin
869       if SwitchOn then
870          Err := Echo;
871       else
872          Err := NoEcho;
873       end if;
874       if Err = Curses_Err then
875          raise Curses_Exception;
876       end if;
877    end Set_Echo_Mode;
878
879    procedure Set_Meta_Mode (Win      : in Window := Standard_Window;
880                             SwitchOn : in Boolean := True)
881    is
882       function Meta (W : Window; Mode : Curses_Bool) return C_Int;
883       pragma Import (C, Meta, "meta");
884    begin
885       if Meta (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then
886          raise Curses_Exception;
887       end if;
888    end Set_Meta_Mode;
889
890    procedure Set_KeyPad_Mode (Win      : in Window := Standard_Window;
891                               SwitchOn : in Boolean := True)
892    is
893       function Keypad (W : Window; Mode : Curses_Bool) return C_Int;
894       pragma Import (C, Keypad, "keypad");
895    begin
896       if Keypad (Win, Curses_Bool (Boolean'Pos (SwitchOn))) = Curses_Err then
897          raise Curses_Exception;
898       end if;
899    end Set_KeyPad_Mode;
900
901    function Get_KeyPad_Mode (Win : in Window := Standard_Window)
902                              return Boolean
903    is
904    begin
905       return Get_Flag (Win, Offset_use_keypad);
906    end Get_KeyPad_Mode;
907
908    procedure Half_Delay (Amount : in Half_Delay_Amount)
909    is
910       function Halfdelay (Amount : C_Int) return C_Int;
911       pragma Import (C, Halfdelay, "halfdelay");
912    begin
913       if Halfdelay (C_Int (Amount)) = Curses_Err then
914          raise Curses_Exception;
915       end if;
916    end Half_Delay;
917
918    procedure Set_Flush_On_Interrupt_Mode
919      (Win  : in Window := Standard_Window;
920       Mode : in Boolean := True)
921    is
922       function Intrflush (Win : Window; Mode : Curses_Bool) return C_Int;
923       pragma Import (C, Intrflush, "intrflush");
924    begin
925       if Intrflush (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
926          raise Curses_Exception;
927       end if;
928    end Set_Flush_On_Interrupt_Mode;
929
930    procedure Set_Queue_Interrupt_Mode
931      (Win   : in Window := Standard_Window;
932       Flush : in Boolean := True)
933    is
934       procedure Qiflush;
935       pragma Import (C, Qiflush, "qiflush");
936       procedure No_Qiflush;
937       pragma Import (C, No_Qiflush, "noqiflush");
938    begin
939       if Flush then
940          Qiflush;
941       else
942          No_Qiflush;
943       end if;
944    end Set_Queue_Interrupt_Mode;
945
946    procedure Set_NoDelay_Mode
947      (Win  : in Window := Standard_Window;
948       Mode : in Boolean := False)
949    is
950       function Nodelay (Win : Window; Mode : Curses_Bool) return C_Int;
951       pragma Import (C, Nodelay, "nodelay");
952    begin
953       if Nodelay (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
954          raise Curses_Exception;
955       end if;
956    end Set_NoDelay_Mode;
957
958    procedure Set_Timeout_Mode (Win    : in Window := Standard_Window;
959                                Mode   : in Timeout_Mode;
960                                Amount : in Natural)
961    is
962       function Wtimeout (Win : Window; Amount : C_Int) return C_Int;
963       pragma Import (C, Wtimeout, "wtimeout");
964
965       Time : C_Int;
966    begin
967       case Mode is
968          when Blocking     => Time := -1;
969          when Non_Blocking => Time := 0;
970          when Delayed      =>
971             if Amount = 0 then
972                raise Constraint_Error;
973             end if;
974             Time := C_Int (Amount);
975       end case;
976       if Wtimeout (Win, Time) = Curses_Err then
977          raise Curses_Exception;
978       end if;
979    end Set_Timeout_Mode;
980
981    procedure Set_Escape_Timer_Mode
982      (Win       : in Window := Standard_Window;
983       Timer_Off : in Boolean := False)
984    is
985       function Notimeout (Win : Window; Mode : Curses_Bool) return C_Int;
986       pragma Import (C, Notimeout, "notimeout");
987    begin
988       if Notimeout (Win, Curses_Bool (Boolean'Pos (Timer_Off)))
989         = Curses_Err then
990          raise Curses_Exception;
991       end if;
992    end Set_Escape_Timer_Mode;
993
994 ------------------------------------------------------------------------------
995    procedure Set_NL_Mode (SwitchOn : in Boolean := True)
996    is
997       function NL return C_Int;
998       pragma Import (C, NL, "nl");
999       function NoNL return C_Int;
1000       pragma Import (C, NoNL, "nonl");
1001
1002       Err : C_Int;
1003    begin
1004       if SwitchOn then
1005          Err := NL;
1006       else
1007          Err := NoNL;
1008       end if;
1009       if Err = Curses_Err then
1010          raise Curses_Exception;
1011       end if;
1012    end Set_NL_Mode;
1013
1014    procedure Clear_On_Next_Update
1015      (Win      : in Window := Standard_Window;
1016       Do_Clear : in Boolean := True)
1017    is
1018       function Clear_Ok (W : Window; Flag : Curses_Bool) return C_Int;
1019       pragma Import (C, Clear_Ok, "clearok");
1020    begin
1021       if Clear_Ok (Win, Curses_Bool (Boolean'Pos (Do_Clear))) = Curses_Err then
1022          raise Curses_Exception;
1023       end if;
1024    end Clear_On_Next_Update;
1025
1026    procedure Use_Insert_Delete_Line
1027      (Win    : in Window := Standard_Window;
1028       Do_Idl : in Boolean := True)
1029    is
1030       function IDL_Ok (W : Window; Flag : Curses_Bool) return C_Int;
1031       pragma Import (C, IDL_Ok, "idlok");
1032    begin
1033       if IDL_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idl))) = Curses_Err then
1034          raise Curses_Exception;
1035       end if;
1036    end Use_Insert_Delete_Line;
1037
1038    procedure Use_Insert_Delete_Character
1039      (Win    : in Window := Standard_Window;
1040       Do_Idc : in Boolean := True)
1041    is
1042       function IDC_Ok (W : Window; Flag : Curses_Bool) return C_Int;
1043       pragma Import (C, IDC_Ok, "idcok");
1044    begin
1045       if IDC_Ok (Win, Curses_Bool (Boolean'Pos (Do_Idc))) = Curses_Err then
1046          raise Curses_Exception;
1047       end if;
1048    end Use_Insert_Delete_Character;
1049
1050    procedure Leave_Cursor_After_Update
1051      (Win      : in Window := Standard_Window;
1052       Do_Leave : in Boolean := True)
1053    is
1054       function Leave_Ok (W : Window; Flag : Curses_Bool) return C_Int;
1055       pragma Import (C, Leave_Ok, "leaveok");
1056    begin
1057       if Leave_Ok (Win, Curses_Bool (Boolean'Pos (Do_Leave))) = Curses_Err then
1058          raise Curses_Exception;
1059       end if;
1060    end Leave_Cursor_After_Update;
1061
1062    procedure Immediate_Update_Mode
1063      (Win  : in Window := Standard_Window;
1064       Mode : in Boolean := False)
1065    is
1066       function Immedok (Win : Window; Mode : Curses_Bool) return C_Int;
1067       pragma Import (C, Immedok, "immedok");
1068    begin
1069       if Immedok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
1070          raise Curses_Exception;
1071       end if;
1072    end Immediate_Update_Mode;
1073
1074    procedure Allow_Scrolling
1075      (Win  : in Window  := Standard_Window;
1076       Mode : in Boolean := False)
1077    is
1078       function Scrollok (Win : Window; Mode : Curses_Bool) return C_Int;
1079       pragma Import (C, Scrollok, "scrollok");
1080    begin
1081       if Scrollok (Win, Curses_Bool (Boolean'Pos (Mode))) = Curses_Err then
1082          raise Curses_Exception;
1083       end if;
1084    end Allow_Scrolling;
1085
1086    function Scrolling_Allowed (Win : Window := Standard_Window)
1087                                return Boolean
1088    is
1089    begin
1090       return Get_Flag (Win, Offset_scroll);
1091    end Scrolling_Allowed;
1092
1093    procedure Set_Scroll_Region
1094      (Win         : in Window := Standard_Window;
1095       Top_Line    : in Line_Position;
1096       Bottom_Line : in Line_Position)
1097    is
1098       function Wsetscrreg (Win : Window;
1099                            Lin : C_Int;
1100                            Col : C_Int) return C_Int;
1101       pragma Import (C, Wsetscrreg, "wsetscrreg");
1102    begin
1103       if Wsetscrreg (Win, C_Int (Top_Line), C_Int (Bottom_Line))
1104         = Curses_Err then
1105          raise Curses_Exception;
1106       end if;
1107    end Set_Scroll_Region;
1108 ------------------------------------------------------------------------------
1109    procedure Update_Screen
1110    is
1111       function Do_Update return C_Int;
1112       pragma Import (C, Do_Update, "doupdate");
1113    begin
1114       if Do_Update = Curses_Err then
1115          raise Curses_Exception;
1116       end if;
1117    end Update_Screen;
1118
1119    procedure Refresh (Win : in Window := Standard_Window)
1120    is
1121       function Wrefresh (W : Window) return C_Int;
1122       pragma Import (C, Wrefresh, "wrefresh");
1123    begin
1124       if Wrefresh (Win) = Curses_Err then
1125          raise Curses_Exception;
1126       end if;
1127    end Refresh;
1128
1129    procedure Refresh_Without_Update
1130      (Win : in Window := Standard_Window)
1131    is
1132       function Wnoutrefresh (W : Window) return C_Int;
1133       pragma Import (C, Wnoutrefresh, "wnoutrefresh");
1134    begin
1135       if Wnoutrefresh (Win) = Curses_Err then
1136          raise Curses_Exception;
1137       end if;
1138    end Refresh_Without_Update;
1139
1140    procedure Redraw (Win : in Window := Standard_Window)
1141    is
1142       function Redrawwin (Win : Window) return C_Int;
1143       pragma Import (C, Redrawwin, "redrawwin");
1144    begin
1145       if Redrawwin (Win) = Curses_Err then
1146          raise Curses_Exception;
1147       end if;
1148    end Redraw;
1149
1150    procedure Redraw
1151      (Win        : in Window := Standard_Window;
1152       Begin_Line : in Line_Position;
1153       Line_Count : in Positive)
1154    is
1155       function Wredrawln (Win : Window; First : C_Int; Cnt : C_Int)
1156                           return C_Int;
1157       pragma Import (C, Wredrawln, "wredrawln");
1158    begin
1159       if Wredrawln (Win,
1160                     C_Int (Begin_Line),
1161                     C_Int (Line_Count)) = Curses_Err then
1162          raise Curses_Exception;
1163       end if;
1164    end Redraw;
1165
1166 ------------------------------------------------------------------------------
1167    procedure Erase (Win : in Window := Standard_Window)
1168    is
1169       function Werase (W : Window) return C_Int;
1170       pragma Import (C, Werase, "werase");
1171    begin
1172       if Werase (Win) = Curses_Err then
1173          raise Curses_Exception;
1174       end if;
1175    end Erase;
1176
1177    procedure Clear (Win : in Window := Standard_Window)
1178    is
1179       function Wclear (W : Window) return C_Int;
1180       pragma Import (C, Wclear, "wclear");
1181    begin
1182       if Wclear (Win) = Curses_Err then
1183          raise Curses_Exception;
1184       end if;
1185    end Clear;
1186
1187    procedure Clear_To_End_Of_Screen (Win : in Window := Standard_Window)
1188    is
1189       function Wclearbot (W : Window) return C_Int;
1190       pragma Import (C, Wclearbot, "wclrtobot");
1191    begin
1192       if Wclearbot (Win) = Curses_Err then
1193          raise Curses_Exception;
1194       end if;
1195    end Clear_To_End_Of_Screen;
1196
1197    procedure Clear_To_End_Of_Line (Win : in Window := Standard_Window)
1198    is
1199       function Wcleareol (W : Window) return C_Int;
1200       pragma Import (C, Wcleareol, "wclrtoeol");
1201    begin
1202       if Wcleareol (Win) = Curses_Err then
1203          raise Curses_Exception;
1204       end if;
1205    end Clear_To_End_Of_Line;
1206 ------------------------------------------------------------------------------
1207    procedure Set_Background
1208      (Win : in Window := Standard_Window;
1209       Ch  : in Attributed_Character)
1210    is
1211       procedure WBackground (W : in Window; Ch : in C_Chtype);
1212       pragma Import (C, WBackground, "wbkgdset");
1213    begin
1214       WBackground (Win, AttrChar_To_Chtype (Ch));
1215    end Set_Background;
1216
1217    procedure Change_Background
1218      (Win : in Window := Standard_Window;
1219       Ch  : in Attributed_Character)
1220    is
1221       function WChangeBkgd (W : Window; Ch : C_Chtype) return C_Int;
1222       pragma Import (C, WChangeBkgd, "wbkgd");
1223    begin
1224       if WChangeBkgd (Win, AttrChar_To_Chtype (Ch)) = Curses_Err then
1225          raise Curses_Exception;
1226       end if;
1227    end Change_Background;
1228
1229    function Get_Background (Win : Window := Standard_Window)
1230      return Attributed_Character
1231    is
1232       function Wgetbkgd (Win : Window) return C_Chtype;
1233       pragma Import (C, Wgetbkgd, "getbkgd");
1234    begin
1235       return Chtype_To_AttrChar (Wgetbkgd (Win));
1236    end Get_Background;
1237 ------------------------------------------------------------------------------
1238    procedure Change_Lines_Status (Win   : in Window := Standard_Window;
1239                                   Start : in Line_Position;
1240                                   Count : in Positive;
1241                                   State : in Boolean)
1242    is
1243       function Wtouchln (Win : Window;
1244                          Sta : C_Int;
1245                          Cnt : C_Int;
1246                          Chg : C_Int) return C_Int;
1247       pragma Import (C, Wtouchln, "wtouchln");
1248    begin
1249       if Wtouchln (Win, C_Int (Start), C_Int (Count),
1250                    C_Int (Boolean'Pos (State))) = Curses_Err then
1251          raise Curses_Exception;
1252       end if;
1253    end Change_Lines_Status;
1254
1255    procedure Touch (Win : in Window := Standard_Window)
1256    is
1257       Y : Line_Position;
1258       X : Column_Position;
1259    begin
1260       Get_Size (Win, Y, X);
1261       Change_Lines_Status (Win, 0, Positive (Y), True);
1262    end Touch;
1263
1264    procedure Untouch (Win : in Window := Standard_Window)
1265    is
1266       Y : Line_Position;
1267       X : Column_Position;
1268    begin
1269       Get_Size (Win, Y, X);
1270       Change_Lines_Status (Win, 0, Positive (Y), False);
1271    end Untouch;
1272
1273    procedure Touch (Win   : in Window := Standard_Window;
1274                     Start : in Line_Position;
1275                     Count : in Positive)
1276    is
1277    begin
1278       Change_Lines_Status (Win, Start, Count, True);
1279    end Touch;
1280
1281    function Is_Touched
1282      (Win  : Window := Standard_Window;
1283       Line : Line_Position) return Boolean
1284    is
1285       function WLineTouched (W : Window; L : C_Int) return Curses_Bool;
1286       pragma Import (C, WLineTouched, "is_linetouched");
1287    begin
1288       if WLineTouched (Win, C_Int (Line)) = Curses_Bool_False then
1289          return False;
1290       else
1291          return True;
1292       end if;
1293    end Is_Touched;
1294
1295    function Is_Touched
1296      (Win : Window := Standard_Window) return Boolean
1297    is
1298       function WWinTouched (W : Window) return Curses_Bool;
1299       pragma Import (C, WWinTouched, "is_wintouched");
1300    begin
1301       if WWinTouched (Win) = Curses_Bool_False then
1302          return False;
1303       else
1304          return True;
1305       end if;
1306    end Is_Touched;
1307 ------------------------------------------------------------------------------
1308    procedure Copy
1309      (Source_Window            : in Window;
1310       Destination_Window       : in Window;
1311       Source_Top_Row           : in Line_Position;
1312       Source_Left_Column       : in Column_Position;
1313       Destination_Top_Row      : in Line_Position;
1314       Destination_Left_Column  : in Column_Position;
1315       Destination_Bottom_Row   : in Line_Position;
1316       Destination_Right_Column : in Column_Position;
1317       Non_Destructive_Mode     : in Boolean := True)
1318    is
1319       function Copywin (Src : Window;
1320                         Dst : Window;
1321                         Str : C_Int;
1322                         Slc : C_Int;
1323                         Dtr : C_Int;
1324                         Dlc : C_Int;
1325                         Dbr : C_Int;
1326                         Drc : C_Int;
1327                         Ndm : C_Int) return C_Int;
1328       pragma Import (C, Copywin, "copywin");
1329    begin
1330       if Copywin (Source_Window,
1331                   Destination_Window,
1332                   C_Int (Source_Top_Row),
1333                   C_Int (Source_Left_Column),
1334                   C_Int (Destination_Top_Row),
1335                   C_Int (Destination_Left_Column),
1336                   C_Int (Destination_Bottom_Row),
1337                   C_Int (Destination_Right_Column),
1338                   Boolean'Pos (Non_Destructive_Mode)
1339                 ) = Curses_Err then
1340          raise Curses_Exception;
1341       end if;
1342    end Copy;
1343
1344    procedure Overwrite
1345      (Source_Window      : in Window;
1346       Destination_Window : in Window)
1347    is
1348       function Overwrite (Src : Window; Dst : Window) return C_Int;
1349       pragma Import (C, Overwrite, "overwrite");
1350    begin
1351       if Overwrite (Source_Window, Destination_Window) = Curses_Err then
1352          raise Curses_Exception;
1353       end if;
1354    end Overwrite;
1355
1356    procedure Overlay
1357      (Source_Window      : in Window;
1358       Destination_Window : in Window)
1359    is
1360       function Overlay (Src : Window; Dst : Window) return C_Int;
1361       pragma Import (C, Overlay, "overlay");
1362    begin
1363       if Overlay (Source_Window, Destination_Window) = Curses_Err then
1364          raise Curses_Exception;
1365       end if;
1366    end Overlay;
1367
1368 ------------------------------------------------------------------------------
1369    procedure Insert_Delete_Lines
1370      (Win   : in Window := Standard_Window;
1371       Lines : in Integer       := 1) -- default is to insert one line above
1372    is
1373       function Winsdelln (W : Window; N : C_Int) return C_Int;
1374       pragma Import (C, Winsdelln, "winsdelln");
1375    begin
1376       if Winsdelln (Win, C_Int (Lines)) = Curses_Err then
1377          raise Curses_Exception;
1378       end if;
1379    end Insert_Delete_Lines;
1380
1381    procedure Delete_Line (Win : in Window := Standard_Window)
1382    is
1383    begin
1384       Insert_Delete_Lines (Win, -1);
1385    end Delete_Line;
1386
1387    procedure Insert_Line (Win : in Window := Standard_Window)
1388    is
1389    begin
1390       Insert_Delete_Lines (Win, 1);
1391    end Insert_Line;
1392 ------------------------------------------------------------------------------
1393
1394
1395    procedure Get_Size
1396      (Win               : in Window := Standard_Window;
1397       Number_Of_Lines   : out Line_Count;
1398       Number_Of_Columns : out Column_Count)
1399    is
1400       --  Please note: in ncurses they are one off.
1401       --  This might be different in other implementations of curses
1402       Y : C_Int := C_Int (W_Get_Short (Win, Offset_maxy)) + C_Int (Offset_XY);
1403       X : C_Int := C_Int (W_Get_Short (Win, Offset_maxx)) + C_Int (Offset_XY);
1404    begin
1405       Number_Of_Lines   := Line_Count (Y);
1406       Number_Of_Columns := Column_Count (X);
1407    end Get_Size;
1408
1409    procedure Get_Window_Position
1410      (Win             : in Window := Standard_Window;
1411       Top_Left_Line   : out Line_Position;
1412       Top_Left_Column : out Column_Position)
1413    is
1414       Y : C_Short := W_Get_Short (Win, Offset_begy);
1415       X : C_Short := W_Get_Short (Win, Offset_begx);
1416    begin
1417       Top_Left_Line   := Line_Position (Y);
1418       Top_Left_Column := Column_Position (X);
1419    end Get_Window_Position;
1420
1421    procedure Get_Cursor_Position
1422      (Win    : in  Window := Standard_Window;
1423       Line   : out Line_Position;
1424       Column : out Column_Position)
1425    is
1426       Y : C_Short := W_Get_Short (Win, Offset_cury);
1427       X : C_Short := W_Get_Short (Win, Offset_curx);
1428    begin
1429       Line   := Line_Position (Y);
1430       Column := Column_Position (X);
1431    end Get_Cursor_Position;
1432
1433    procedure Get_Origin_Relative_To_Parent
1434      (Win                : in  Window;
1435       Top_Left_Line      : out Line_Position;
1436       Top_Left_Column    : out Column_Position;
1437       Is_Not_A_Subwindow : out Boolean)
1438    is
1439       Y : C_Int := W_Get_Int (Win, Offset_pary);
1440       X : C_Int := W_Get_Int (Win, Offset_parx);
1441    begin
1442       if Y = -1 then
1443          Top_Left_Line   := Line_Position'Last;
1444          Top_Left_Column := Column_Position'Last;
1445          Is_Not_A_Subwindow := True;
1446       else
1447          Top_Left_Line   := Line_Position (Y);
1448          Top_Left_Column := Column_Position (X);
1449          Is_Not_A_Subwindow := False;
1450       end if;
1451    end Get_Origin_Relative_To_Parent;
1452 ------------------------------------------------------------------------------
1453    function New_Pad (Lines   : Line_Count;
1454                      Columns : Column_Count) return Window
1455    is
1456       function Newpad (Lines : C_Int; Columns : C_Int) return Window;
1457       pragma Import (C, Newpad, "newpad");
1458
1459       W : Window;
1460    begin
1461       W := Newpad (C_Int (Lines), C_Int (Columns));
1462       if W = Null_Window then
1463          raise Curses_Exception;
1464       end if;
1465       return W;
1466    end New_Pad;
1467
1468    function Sub_Pad
1469      (Pad                   : Window;
1470       Number_Of_Lines       : Line_Count;
1471       Number_Of_Columns     : Column_Count;
1472       First_Line_Position   : Line_Position;
1473       First_Column_Position : Column_Position) return Window
1474    is
1475       function Subpad
1476         (Pad                   : Window;
1477          Number_Of_Lines       : C_Int;
1478          Number_Of_Columns     : C_Int;
1479          First_Line_Position   : C_Int;
1480          First_Column_Position : C_Int) return Window;
1481       pragma Import (C, Subpad, "subpad");
1482
1483       W : Window;
1484    begin
1485       W := Subpad (Pad,
1486                    C_Int (Number_Of_Lines),
1487                    C_Int (Number_Of_Columns),
1488                    C_Int (First_Line_Position),
1489                    C_Int (First_Column_Position));
1490       if W = Null_Window then
1491          raise Curses_Exception;
1492       end if;
1493       return W;
1494    end Sub_Pad;
1495
1496    procedure Refresh
1497      (Pad                      : in Window;
1498       Source_Top_Row           : in Line_Position;
1499       Source_Left_Column       : in Column_Position;
1500       Destination_Top_Row      : in Line_Position;
1501       Destination_Left_Column  : in Column_Position;
1502       Destination_Bottom_Row   : in Line_Position;
1503       Destination_Right_Column : in Column_Position)
1504    is
1505       function Prefresh
1506         (Pad                      : Window;
1507          Source_Top_Row           : C_Int;
1508          Source_Left_Column       : C_Int;
1509          Destination_Top_Row      : C_Int;
1510          Destination_Left_Column  : C_Int;
1511          Destination_Bottom_Row   : C_Int;
1512          Destination_Right_Column : C_Int) return C_Int;
1513       pragma Import (C, Prefresh, "prefresh");
1514    begin
1515       if Prefresh (Pad,
1516                    C_Int (Source_Top_Row),
1517                    C_Int (Source_Left_Column),
1518                    C_Int (Destination_Top_Row),
1519                    C_Int (Destination_Left_Column),
1520                    C_Int (Destination_Bottom_Row),
1521                    C_Int (Destination_Right_Column)) = Curses_Err then
1522          raise Curses_Exception;
1523       end if;
1524    end Refresh;
1525
1526    procedure Refresh_Without_Update
1527      (Pad                      : in Window;
1528       Source_Top_Row           : in Line_Position;
1529       Source_Left_Column       : in Column_Position;
1530       Destination_Top_Row      : in Line_Position;
1531       Destination_Left_Column  : in Column_Position;
1532       Destination_Bottom_Row   : in Line_Position;
1533       Destination_Right_Column : in Column_Position)
1534    is
1535       function Pnoutrefresh
1536         (Pad                      : Window;
1537          Source_Top_Row           : C_Int;
1538          Source_Left_Column       : C_Int;
1539          Destination_Top_Row      : C_Int;
1540          Destination_Left_Column  : C_Int;
1541          Destination_Bottom_Row   : C_Int;
1542          Destination_Right_Column : C_Int) return C_Int;
1543       pragma Import (C, Pnoutrefresh, "pnoutrefresh");
1544    begin
1545       if Pnoutrefresh (Pad,
1546                        C_Int (Source_Top_Row),
1547                        C_Int (Source_Left_Column),
1548                        C_Int (Destination_Top_Row),
1549                        C_Int (Destination_Left_Column),
1550                        C_Int (Destination_Bottom_Row),
1551                        C_Int (Destination_Right_Column)) = Curses_Err then
1552          raise Curses_Exception;
1553       end if;
1554    end Refresh_Without_Update;
1555
1556    procedure Add_Character_To_Pad_And_Echo_It
1557      (Pad : in Window;
1558       Ch  : in Attributed_Character)
1559    is
1560       function Pechochar (Pad : Window; Ch : C_Chtype)
1561                           return C_Int;
1562       pragma Import (C, Pechochar, "pechochar");
1563    begin
1564       if Pechochar (Pad, AttrChar_To_Chtype (Ch)) = Curses_Err then
1565          raise Curses_Exception;
1566       end if;
1567    end Add_Character_To_Pad_And_Echo_It;
1568
1569    procedure Add_Character_To_Pad_And_Echo_It
1570      (Pad : in Window;
1571       Ch  : in Character)
1572    is
1573    begin
1574       Add_Character_To_Pad_And_Echo_It
1575         (Pad,
1576          Attributed_Character'(Ch    => Ch,
1577                                Color => Color_Pair'First,
1578                                Attr  => Normal_Video));
1579    end Add_Character_To_Pad_And_Echo_It;
1580 ------------------------------------------------------------------------------
1581    procedure Scroll (Win    : in Window := Standard_Window;
1582                      Amount : in Integer := 1)
1583    is
1584       function Wscrl (Win : Window; N : C_Int) return C_Int;
1585       pragma Import (C, Wscrl, "wscrl");
1586
1587    begin
1588       if Wscrl (Win, C_Int (Amount)) = Curses_Err then
1589          raise Curses_Exception;
1590       end if;
1591    end Scroll;
1592
1593 ------------------------------------------------------------------------------
1594    procedure Delete_Character (Win : in Window := Standard_Window)
1595    is
1596       function Wdelch (Win : Window) return C_Int;
1597       pragma Import (C, Wdelch, "wdelch");
1598    begin
1599       if Wdelch (Win) = Curses_Err then
1600          raise Curses_Exception;
1601       end if;
1602    end Delete_Character;
1603
1604    procedure Delete_Character
1605      (Win    : in Window := Standard_Window;
1606       Line   : in Line_Position;
1607       Column : in Column_Position)
1608    is
1609       function Mvwdelch (Win : Window;
1610                          Lin : C_Int;
1611                          Col : C_Int) return C_Int;
1612       pragma Import (C, Mvwdelch, "mvwdelch");
1613    begin
1614       if Mvwdelch (Win, C_Int (Line), C_Int (Column)) = Curses_Err then
1615          raise Curses_Exception;
1616       end if;
1617    end Delete_Character;
1618 ------------------------------------------------------------------------------
1619    function Peek (Win : Window := Standard_Window)
1620      return Attributed_Character
1621    is
1622       function Winch (Win : Window) return C_Chtype;
1623       pragma Import (C, Winch, "winch");
1624    begin
1625       return Chtype_To_AttrChar (Winch (Win));
1626    end Peek;
1627
1628    function Peek
1629      (Win    : Window := Standard_Window;
1630       Line   : Line_Position;
1631       Column : Column_Position) return Attributed_Character
1632    is
1633       function Mvwinch (Win : Window;
1634                         Lin : C_Int;
1635                         Col : C_Int) return C_Chtype;
1636       pragma Import (C, Mvwinch, "mvwinch");
1637    begin
1638       return Chtype_To_AttrChar (Mvwinch (Win, C_Int (Line), C_Int (Column)));
1639    end Peek;
1640 ------------------------------------------------------------------------------
1641    procedure Insert (Win : in Window := Standard_Window;
1642                      Ch  : in Attributed_Character)
1643    is
1644       function Winsch (Win : Window; Ch : C_Chtype) return C_Int;
1645       pragma Import (C, Winsch, "winsch");
1646    begin
1647       if Winsch (Win, AttrChar_To_Chtype (Ch)) = Curses_Err then
1648          raise Curses_Exception;
1649       end if;
1650    end Insert;
1651
1652    procedure Insert
1653      (Win    : in Window := Standard_Window;
1654       Line   : in Line_Position;
1655       Column : in Column_Position;
1656       Ch     : in Attributed_Character)
1657    is
1658       function Mvwinsch (Win : Window;
1659                          Lin : C_Int;
1660                          Col : C_Int;
1661                          Ch  : C_Chtype) return C_Int;
1662       pragma Import (C, Mvwinsch, "mvwinsch");
1663    begin
1664       if Mvwinsch (Win,
1665                    C_Int (Line),
1666                    C_Int (Column),
1667                    AttrChar_To_Chtype (Ch)) = Curses_Err then
1668          raise Curses_Exception;
1669       end if;
1670    end Insert;
1671 ------------------------------------------------------------------------------
1672    procedure Insert (Win : in Window := Standard_Window;
1673                      Str : in String;
1674                      Len : in Integer := -1)
1675    is
1676       function Winsnstr (Win : Window;
1677                          Str : char_array;
1678                          Len : Integer := -1) return C_Int;
1679       pragma Import (C, Winsnstr, "winsnstr");
1680
1681       Txt    : char_array (0 .. Str'Length);
1682       Length : size_t;
1683    begin
1684       To_C (Str, Txt, Length);
1685       if Winsnstr (Win, Txt, Len) = Curses_Err then
1686          raise Curses_Exception;
1687       end if;
1688    end Insert;
1689
1690    procedure Insert
1691      (Win    : in Window := Standard_Window;
1692       Line   : in Line_Position;
1693       Column : in Column_Position;
1694       Str    : in String;
1695       Len    : in Integer := -1)
1696    is
1697       function Mvwinsnstr (Win    : Window;
1698                            Line   : C_Int;
1699                            Column : C_Int;
1700                            Str    : char_array;
1701                            Len    : C_Int) return C_Int;
1702       pragma Import (C, Mvwinsnstr, "mvwinsnstr");
1703
1704       Txt    : char_array (0 .. Str'Length);
1705       Length : size_t;
1706    begin
1707       To_C (Str, Txt, Length);
1708       if Mvwinsnstr (Win, C_Int (Line), C_Int (Column), Txt, C_Int (Len))
1709         = Curses_Err then
1710          raise Curses_Exception;
1711       end if;
1712    end Insert;
1713 ------------------------------------------------------------------------------
1714    procedure Peek (Win : in  Window := Standard_Window;
1715                    Str : out String;
1716                    Len : in  Integer := -1)
1717    is
1718       function Winnstr (Win : Window;
1719                         Str : char_array;
1720                         Len : C_Int) return C_Int;
1721       pragma Import (C, Winnstr, "winnstr");
1722
1723       N   : Integer := Len;
1724       Txt : char_array (0 .. Str'Length);
1725       Cnt : Natural;
1726    begin
1727       if N < 0 then
1728          N := Str'Length;
1729       end if;
1730       if N > Str'Length then
1731          raise Constraint_Error;
1732       end if;
1733       Txt (0) := Interfaces.C.char'First;
1734       if Winnstr (Win, Txt, C_Int (N)) = Curses_Err then
1735          raise Curses_Exception;
1736       end if;
1737       To_Ada (Txt, Str, Cnt, True);
1738       if Cnt < Str'Length then
1739          Str ((Str'First + Cnt) .. Str'Last) := (others => ' ');
1740       end if;
1741    end Peek;
1742
1743    procedure Peek
1744      (Win    : in  Window := Standard_Window;
1745       Line   : in  Line_Position;
1746       Column : in  Column_Position;
1747       Str    : out String;
1748       Len    : in  Integer := -1)
1749    is
1750    begin
1751       Move_Cursor (Win, Line, Column);
1752       Peek (Win, Str, Len);
1753    end Peek;
1754 ------------------------------------------------------------------------------
1755    procedure Peek
1756      (Win : in  Window := Standard_Window;
1757       Str : out Attributed_String;
1758       Len : in  Integer := -1)
1759    is
1760       function Winchnstr (Win : Window;
1761                           Str : chtype_array;             -- out
1762                           Len : C_Int) return C_Int;
1763       pragma Import (C, Winchnstr, "winchnstr");
1764
1765       N   : Integer := Len;
1766       Txt : chtype_array (0 .. Str'Length) := (0 => Default_Character);
1767       Cnt : Natural := 0;
1768    begin
1769       if N < 0 then
1770          N := Str'Length;
1771       end if;
1772       if N > Str'Length then
1773          raise Constraint_Error;
1774       end if;
1775       if Winchnstr (Win, Txt, C_Int (N)) = Curses_Err then
1776          raise Curses_Exception;
1777       end if;
1778       for To in Str'Range loop
1779          exit when Txt (size_t (Cnt)) = Default_Character;
1780          Str (To) := Txt (size_t (Cnt));
1781          Cnt := Cnt + 1;
1782       end loop;
1783       if Cnt < Str'Length then
1784          Str ((Str'First + Cnt) .. Str'Last) :=
1785            (others => (Ch => ' ',
1786                        Color => Color_Pair'First,
1787                        Attr => Normal_Video));
1788       end if;
1789    end Peek;
1790
1791    procedure Peek
1792      (Win    : in  Window := Standard_Window;
1793       Line   : in  Line_Position;
1794       Column : in  Column_Position;
1795       Str    : out Attributed_String;
1796       Len    : in Integer := -1)
1797    is
1798    begin
1799       Move_Cursor (Win, Line, Column);
1800       Peek (Win, Str, Len);
1801    end Peek;
1802 ------------------------------------------------------------------------------
1803    procedure Get (Win : in  Window := Standard_Window;
1804                   Str : out String;
1805                   Len : in  Integer := -1)
1806    is
1807       function Wgetnstr (Win : Window;
1808                          Str : char_array;
1809                          Len : C_Int) return C_Int;
1810       pragma Import (C, Wgetnstr, "wgetnstr");
1811
1812       N   : Integer := Len;
1813       Txt : char_array (0 .. Str'Length);
1814       Cnt : Natural;
1815    begin
1816       if N < 0 then
1817          N := Str'Length;
1818       end if;
1819       if N > Str'Length then
1820          raise Constraint_Error;
1821       end if;
1822       Txt (0) := Interfaces.C.char'First;
1823       if Wgetnstr (Win, Txt, C_Int (N)) = Curses_Err then
1824          raise Curses_Exception;
1825       end if;
1826       To_Ada (Txt, Str, Cnt, True);
1827       if Cnt < Str'Length then
1828          Str ((Str'First + Cnt) .. Str'Last) := (others => ' ');
1829       end if;
1830    end Get;
1831
1832    procedure Get
1833      (Win    : in  Window := Standard_Window;
1834       Line   : in  Line_Position;
1835       Column : in  Column_Position;
1836       Str    : out String;
1837       Len    : in  Integer := -1)
1838    is
1839    begin
1840       Move_Cursor (Win, Line, Column);
1841       Get (Win, Str, Len);
1842    end Get;
1843 ------------------------------------------------------------------------------
1844    procedure Init_Soft_Label_Keys
1845      (Format : in Soft_Label_Key_Format := Three_Two_Three)
1846    is
1847       function Slk_Init (Fmt : C_Int) return C_Int;
1848       pragma Import (C, Slk_Init, "slk_init");
1849    begin
1850       if Slk_Init (Soft_Label_Key_Format'Pos (Format)) = Curses_Err then
1851          raise Curses_Exception;
1852       end if;
1853    end Init_Soft_Label_Keys;
1854
1855    procedure Set_Soft_Label_Key (Label : in Label_Number;
1856                                  Text  : in String;
1857                                  Fmt   : in Label_Justification := Left)
1858    is
1859       function Slk_Set (Label : C_Int;
1860                         Txt   : char_array;
1861                         Fmt   : C_Int) return C_Int;
1862       pragma Import (C, Slk_Set, "slk_set");
1863
1864       Txt : char_array (0 .. Text'Length);
1865       Len : size_t;
1866    begin
1867       To_C (Text, Txt, Len);
1868       if Slk_Set (C_Int (Label), Txt,
1869                   C_Int (Label_Justification'Pos (Fmt))) = Curses_Err then
1870          raise Curses_Exception;
1871       end if;
1872    end Set_Soft_Label_Key;
1873
1874    procedure Refresh_Soft_Label_Keys
1875    is
1876       function Slk_Refresh return C_Int;
1877       pragma Import (C, Slk_Refresh, "slk_refresh");
1878    begin
1879       if Slk_Refresh = Curses_Err then
1880          raise Curses_Exception;
1881       end if;
1882    end Refresh_Soft_Label_Keys;
1883
1884    procedure Refresh_Soft_Label_Keys_Without_Update
1885    is
1886       function Slk_Noutrefresh return C_Int;
1887       pragma Import (C, Slk_Noutrefresh, "slk_noutrefresh");
1888    begin
1889       if Slk_Noutrefresh = Curses_Err then
1890          raise Curses_Exception;
1891       end if;
1892    end Refresh_Soft_Label_Keys_Without_Update;
1893
1894    procedure Get_Soft_Label_Key (Label : in Label_Number;
1895                                  Text  : out String)
1896    is
1897       function Slk_Label (Label : C_Int) return chars_ptr;
1898       pragma Import (C, Slk_Label, "slk_label");
1899    begin
1900       Fill_String (Slk_Label (C_Int (Label)), Text);
1901    end Get_Soft_Label_Key;
1902
1903    function Get_Soft_Label_Key (Label : in Label_Number) return String
1904    is
1905       function Slk_Label (Label : C_Int) return chars_ptr;
1906       pragma Import (C, Slk_Label, "slk_label");
1907    begin
1908       return Fill_String (Slk_Label (C_Int (Label)));
1909    end Get_Soft_Label_Key;
1910
1911    procedure Clear_Soft_Label_Keys
1912    is
1913       function Slk_Clear return C_Int;
1914       pragma Import (C, Slk_Clear, "slk_clear");
1915    begin
1916       if Slk_Clear = Curses_Err then
1917          raise Curses_Exception;
1918       end if;
1919    end Clear_Soft_Label_Keys;
1920
1921    procedure Restore_Soft_Label_Keys
1922    is
1923       function Slk_Restore return C_Int;
1924       pragma Import (C, Slk_Restore, "slk_restore");
1925    begin
1926       if Slk_Restore = Curses_Err then
1927          raise Curses_Exception;
1928       end if;
1929    end Restore_Soft_Label_Keys;
1930
1931    procedure Touch_Soft_Label_Keys
1932    is
1933       function Slk_Touch return C_Int;
1934       pragma Import (C, Slk_Touch, "slk_touch");
1935    begin
1936       if Slk_Touch = Curses_Err then
1937          raise Curses_Exception;
1938       end if;
1939    end Touch_Soft_Label_Keys;
1940
1941    procedure Switch_Soft_Label_Key_Attributes
1942      (Attr : in Character_Attribute_Set;
1943       On   : in Boolean := True)
1944    is
1945       function Slk_Attron (Ch : C_Chtype) return C_Int;
1946       pragma Import (C, Slk_Attron, "slk_attron");
1947       function Slk_Attroff (Ch : C_Chtype) return C_Int;
1948       pragma Import (C, Slk_Attroff, "slk_attroff");
1949
1950       Err : C_Int;
1951       Ch  : constant Attributed_Character := (Ch    => Character'First,
1952                                               Attr  => Attr,
1953                                               Color => Color_Pair'First);
1954    begin
1955       if On then
1956          Err := Slk_Attron  (AttrChar_To_Chtype (Ch));
1957       else
1958          Err := Slk_Attroff (AttrChar_To_Chtype (Ch));
1959       end if;
1960       if Err = Curses_Err then
1961          raise Curses_Exception;
1962       end if;
1963    end Switch_Soft_Label_Key_Attributes;
1964
1965    procedure Set_Soft_Label_Key_Attributes
1966      (Attr  : in Character_Attribute_Set := Normal_Video;
1967       Color : in Color_Pair := Color_Pair'First)
1968    is
1969       function Slk_Attrset (Ch : C_Chtype) return C_Int;
1970       pragma Import (C, Slk_Attrset, "slk_attrset");
1971
1972       Ch : constant Attributed_Character := (Ch    => Character'First,
1973                                              Attr  => Attr,
1974                                              Color => Color);
1975    begin
1976       if Slk_Attrset (AttrChar_To_Chtype (Ch)) = Curses_Err then
1977          raise Curses_Exception;
1978       end if;
1979    end Set_Soft_Label_Key_Attributes;
1980
1981    function Get_Soft_Label_Key_Attributes return Character_Attribute_Set
1982    is
1983       function Slk_Attr return C_Chtype;
1984       pragma Import (C, Slk_Attr, "slk_attr");
1985
1986       Attr : constant C_Chtype := Slk_Attr;
1987    begin
1988       return Chtype_To_AttrChar (Attr).Attr;
1989    end Get_Soft_Label_Key_Attributes;
1990
1991    function Get_Soft_Label_Key_Attributes return Color_Pair
1992    is
1993       function Slk_Attr return C_Chtype;
1994       pragma Import (C, Slk_Attr, "slk_attr");
1995
1996       Attr : constant C_Chtype := Slk_Attr;
1997    begin
1998       return Chtype_To_AttrChar (Attr).Color;
1999    end Get_Soft_Label_Key_Attributes;
2000
2001    procedure Set_Soft_Label_Key_Color (Pair : in Color_Pair)
2002    is
2003       function Slk_Color (Color : in C_Short) return C_Int;
2004       pragma Import (C, Slk_Color, "slk_color");
2005    begin
2006       if Slk_Color (C_Short (Pair)) = Curses_Err then
2007          raise Curses_Exception;
2008       end if;
2009    end Set_Soft_Label_Key_Color;
2010
2011 ------------------------------------------------------------------------------
2012    procedure Enable_Key (Key    : in Special_Key_Code;
2013                          Enable : in Boolean := True)
2014    is
2015       function Keyok (Keycode : C_Int;
2016                       On_Off  : Curses_Bool) return C_Int;
2017       pragma Import (C, Keyok, "keyok");
2018    begin
2019       if Keyok (C_Int (Key), Curses_Bool (Boolean'Pos (Enable)))
2020         = Curses_Err then
2021          raise Curses_Exception;
2022       end if;
2023    end Enable_Key;
2024 ------------------------------------------------------------------------------
2025    procedure Define_Key (Definition : in String;
2026                          Key        : in Special_Key_Code)
2027    is
2028       function Defkey (Def : char_array;
2029                        Key : C_Int) return C_Int;
2030       pragma Import (C, Defkey, "define_key");
2031
2032       Txt    : char_array (0 .. Definition'Length);
2033       Length : size_t;
2034    begin
2035       To_C (Definition, Txt, Length);
2036       if Defkey (Txt, C_Int (Key)) = Curses_Err then
2037          raise Curses_Exception;
2038       end if;
2039    end Define_Key;
2040 ------------------------------------------------------------------------------
2041    procedure Un_Control (Ch  : in Attributed_Character;
2042                          Str : out String)
2043    is
2044       function Unctrl (Ch : C_Chtype) return chars_ptr;
2045       pragma Import (C, Unctrl, "unctrl");
2046    begin
2047       Fill_String (Unctrl (AttrChar_To_Chtype (Ch)), Str);
2048    end Un_Control;
2049
2050    function Un_Control (Ch : in Attributed_Character) return String
2051    is
2052       function Unctrl (Ch : C_Chtype) return chars_ptr;
2053       pragma Import (C, Unctrl, "unctrl");
2054    begin
2055       return Fill_String (Unctrl (AttrChar_To_Chtype (Ch)));
2056    end Un_Control;
2057
2058    procedure Delay_Output (Msecs : in Natural)
2059    is
2060       function Delayoutput (Msecs : C_Int) return C_Int;
2061       pragma Import (C, Delayoutput, "delay_output");
2062    begin
2063       if Delayoutput (C_Int (Msecs)) = Curses_Err then
2064          raise Curses_Exception;
2065       end if;
2066    end Delay_Output;
2067
2068    procedure Flush_Input
2069    is
2070       function Flushinp return C_Int;
2071       pragma Import (C, Flushinp, "flushinp");
2072    begin
2073       if Flushinp = Curses_Err then  -- docu says that never happens, but...
2074          raise Curses_Exception;
2075       end if;
2076    end Flush_Input;
2077 ------------------------------------------------------------------------------
2078    function Baudrate return Natural
2079    is
2080       function Baud return C_Int;
2081       pragma Import (C, Baud, "baudrate");
2082    begin
2083       return Natural (Baud);
2084    end Baudrate;
2085
2086    function Erase_Character return Character
2087    is
2088       function Erasechar return C_Int;
2089       pragma Import (C, Erasechar, "erasechar");
2090    begin
2091       return Character'Val (Erasechar);
2092    end Erase_Character;
2093
2094    function Kill_Character return Character
2095    is
2096       function Killchar return C_Int;
2097       pragma Import (C, Killchar, "killchar");
2098    begin
2099       return Character'Val (Killchar);
2100    end Kill_Character;
2101
2102    function Has_Insert_Character return Boolean
2103    is
2104       function Has_Ic return Curses_Bool;
2105       pragma Import (C, Has_Ic, "has_ic");
2106    begin
2107       if Has_Ic = Curses_Bool_False then
2108          return False;
2109       else
2110          return True;
2111       end if;
2112    end Has_Insert_Character;
2113
2114    function Has_Insert_Line return Boolean
2115    is
2116       function Has_Il return Curses_Bool;
2117       pragma Import (C, Has_Il, "has_il");
2118    begin
2119       if Has_Il = Curses_Bool_False then
2120          return False;
2121       else
2122          return True;
2123       end if;
2124    end Has_Insert_Line;
2125
2126    function Supported_Attributes return Character_Attribute_Set
2127    is
2128       function Termattrs return C_Chtype;
2129       pragma Import (C, Termattrs, "termattrs");
2130
2131       Ch : constant Attributed_Character := Chtype_To_AttrChar (Termattrs);
2132    begin
2133       return Ch.Attr;
2134    end Supported_Attributes;
2135
2136    procedure Long_Name (Name : out String)
2137    is
2138       function Longname return chars_ptr;
2139       pragma Import (C, Longname, "longname");
2140    begin
2141       Fill_String (Longname, Name);
2142    end Long_Name;
2143
2144    function Long_Name return String
2145    is
2146       function Longname return chars_ptr;
2147       pragma Import (C, Longname, "longname");
2148    begin
2149       return Fill_String (Longname);
2150    end Long_Name;
2151
2152    procedure Terminal_Name (Name : out String)
2153    is
2154       function Termname return chars_ptr;
2155       pragma Import (C, Termname, "termname");
2156    begin
2157       Fill_String (Termname, Name);
2158    end Terminal_Name;
2159
2160    function Terminal_Name return String
2161    is
2162       function Termname return chars_ptr;
2163       pragma Import (C, Termname, "termname");
2164    begin
2165       return Fill_String (Termname);
2166    end Terminal_Name;
2167 ------------------------------------------------------------------------------
2168    procedure Init_Pair (Pair : in Redefinable_Color_Pair;
2169                         Fore : in Color_Number;
2170                         Back : in Color_Number)
2171    is
2172       function Initpair (Pair : C_Short;
2173                          Fore : C_Short;
2174                          Back : C_Short) return C_Int;
2175       pragma Import (C, Initpair, "init_pair");
2176    begin
2177       if Integer (Pair) >= Number_Of_Color_Pairs then
2178          raise Constraint_Error;
2179       end if;
2180       if Integer (Fore) >= Number_Of_Colors or else
2181         Integer (Back) >= Number_Of_Colors then raise Constraint_Error;
2182       end if;
2183       if Initpair (C_Short (Pair), C_Short (Fore), C_Short (Back))
2184         = Curses_Err then
2185          raise Curses_Exception;
2186       end if;
2187    end Init_Pair;
2188
2189    procedure Pair_Content (Pair : in Color_Pair;
2190                            Fore : out Color_Number;
2191                            Back : out Color_Number)
2192    is
2193       type C_Short_Access is access all C_Short;
2194       function Paircontent (Pair : C_Short;
2195                             Fp   : C_Short_Access;
2196                             Bp   : C_Short_Access) return C_Int;
2197       pragma Import (C, Paircontent, "pair_content");
2198
2199       F, B : aliased C_Short;
2200    begin
2201       if Paircontent (C_Short (Pair), F'Access, B'Access) = Curses_Err then
2202          raise Curses_Exception;
2203       else
2204          Fore := Color_Number (F);
2205          Back := Color_Number (B);
2206       end if;
2207    end Pair_Content;
2208
2209    function Has_Colors return Boolean
2210    is
2211       function Hascolors return Curses_Bool;
2212       pragma Import (C, Hascolors, "has_colors");
2213    begin
2214       if Hascolors = Curses_Bool_False then
2215          return False;
2216       else
2217          return True;
2218       end if;
2219    end Has_Colors;
2220
2221    procedure Init_Color (Color : in Color_Number;
2222                          Red   : in RGB_Value;
2223                          Green : in RGB_Value;
2224                          Blue  : in RGB_Value)
2225    is
2226       function Initcolor (Col   : C_Short;
2227                           Red   : C_Short;
2228                           Green : C_Short;
2229                           Blue  : C_Short) return C_Int;
2230       pragma Import (C, Initcolor, "init_color");
2231    begin
2232       if Initcolor (C_Short (Color), C_Short (Red), C_Short (Green),
2233                     C_Short (Blue)) = Curses_Err then
2234             raise Curses_Exception;
2235       end if;
2236    end Init_Color;
2237
2238    function Can_Change_Color return Boolean
2239    is
2240       function Canchangecolor return Curses_Bool;
2241       pragma Import (C, Canchangecolor, "can_change_color");
2242    begin
2243       if Canchangecolor = Curses_Bool_False then
2244          return False;
2245       else
2246          return True;
2247       end if;
2248    end Can_Change_Color;
2249
2250    procedure Color_Content (Color : in  Color_Number;
2251                             Red   : out RGB_Value;
2252                             Green : out RGB_Value;
2253                             Blue  : out RGB_Value)
2254    is
2255       type C_Short_Access is access all C_Short;
2256
2257       function Colorcontent (Color : C_Short; R, G, B : C_Short_Access)
2258                              return C_Int;
2259       pragma Import (C, Colorcontent, "color_content");
2260
2261       R, G, B : aliased C_Short;
2262    begin
2263       if Colorcontent (C_Short (Color), R'Access, G'Access, B'Access) =
2264         Curses_Err then
2265          raise Curses_Exception;
2266       else
2267          Red   := RGB_Value (R);
2268          Green := RGB_Value (G);
2269          Blue  := RGB_Value (B);
2270       end if;
2271    end Color_Content;
2272
2273 ------------------------------------------------------------------------------
2274    procedure Save_Curses_Mode (Mode : in Curses_Mode)
2275    is
2276       function Def_Prog_Mode return C_Int;
2277       pragma Import (C, Def_Prog_Mode, "def_prog_mode");
2278       function Def_Shell_Mode return C_Int;
2279       pragma Import (C, Def_Shell_Mode, "def_shell_mode");
2280
2281       Err : C_Int;
2282    begin
2283       case Mode is
2284          when Curses => Err := Def_Prog_Mode;
2285          when Shell  => Err := Def_Shell_Mode;
2286       end case;
2287       if Err = Curses_Err then
2288          raise Curses_Exception;
2289       end if;
2290    end Save_Curses_Mode;
2291
2292    procedure Reset_Curses_Mode (Mode : in Curses_Mode)
2293    is
2294       function Reset_Prog_Mode return C_Int;
2295       pragma Import (C, Reset_Prog_Mode, "reset_prog_mode");
2296       function Reset_Shell_Mode return C_Int;
2297       pragma Import (C, Reset_Shell_Mode, "reset_shell_mode");
2298
2299       Err : C_Int;
2300    begin
2301       case Mode is
2302          when Curses => Err := Reset_Prog_Mode;
2303          when Shell  => Err := Reset_Shell_Mode;
2304       end case;
2305       if Err = Curses_Err then
2306          raise Curses_Exception;
2307       end if;
2308    end Reset_Curses_Mode;
2309
2310    procedure Save_Terminal_State
2311    is
2312       function Savetty return C_Int;
2313       pragma Import (C, Savetty, "savetty");
2314    begin
2315       if Savetty = Curses_Err then
2316          raise Curses_Exception;
2317       end if;
2318    end Save_Terminal_State;
2319
2320    procedure Reset_Terminal_State
2321    is
2322       function Resetty return C_Int;
2323       pragma Import (C, Resetty, "resetty");
2324    begin
2325       if Resetty = Curses_Err then
2326          raise Curses_Exception;
2327       end if;
2328    end Reset_Terminal_State;
2329
2330    procedure Rip_Off_Lines (Lines : in Integer;
2331                             Proc  : in Stdscr_Init_Proc)
2332    is
2333       function Ripoffline (Lines : C_Int;
2334                            Proc  : Stdscr_Init_Proc) return C_Int;
2335       pragma Import (C, Ripoffline, "_nc_ripoffline");
2336    begin
2337       if Ripoffline (C_Int (Lines), Proc) = Curses_Err then
2338          raise Curses_Exception;
2339       end if;
2340    end Rip_Off_Lines;
2341
2342    procedure Set_Cursor_Visibility (Visibility : in out Cursor_Visibility)
2343    is
2344       function Curs_Set (Curs : C_Int) return C_Int;
2345       pragma Import (C, Curs_Set, "curs_set");
2346
2347       Res : C_Int;
2348    begin
2349       Res := Curs_Set (Cursor_Visibility'Pos (Visibility));
2350       if Res /= Curses_Err then
2351          Visibility := Cursor_Visibility'Val (Res);
2352       end if;
2353    end Set_Cursor_Visibility;
2354
2355    procedure Nap_Milli_Seconds (Ms : in Natural)
2356    is
2357       function Napms (Ms : C_Int) return C_Int;
2358       pragma Import (C, Napms, "napms");
2359    begin
2360       if Napms (C_Int (Ms)) = Curses_Err then
2361          raise Curses_Exception;
2362       end if;
2363    end Nap_Milli_Seconds;
2364 ------------------------------------------------------------------------------
2365
2366    function Standard_Window return Window
2367    is
2368       Stdscr : Window;
2369       pragma Import (C, Stdscr, "stdscr");
2370    begin
2371       return Stdscr;
2372    end Standard_Window;
2373
2374    function Lines return Line_Count
2375    is
2376       C_Lines : C_Int;
2377       pragma Import (C, C_Lines, "LINES");
2378    begin
2379       return Line_Count (C_Lines);
2380    end Lines;
2381
2382    function Columns return Column_Count
2383    is
2384       C_Columns : C_Int;
2385       pragma Import (C, C_Columns, "COLS");
2386    begin
2387       return Column_Count (C_Columns);
2388    end Columns;
2389
2390    function Tab_Size return Natural
2391    is
2392       C_Tab_Size : C_Int;
2393       pragma Import (C, C_Tab_Size, "TABSIZE");
2394    begin
2395       return Natural (C_Tab_Size);
2396    end Tab_Size;
2397
2398    function Number_Of_Colors return Natural
2399    is
2400       C_Number_Of_Colors : C_Int;
2401       pragma Import (C, C_Number_Of_Colors, "COLORS");
2402    begin
2403       return Natural (C_Number_Of_Colors);
2404    end Number_Of_Colors;
2405
2406    function Number_Of_Color_Pairs return Natural
2407    is
2408       C_Number_Of_Color_Pairs : C_Int;
2409       pragma Import (C, C_Number_Of_Color_Pairs, "COLOR_PAIRS");
2410    begin
2411       return Natural (C_Number_Of_Color_Pairs);
2412    end Number_Of_Color_Pairs;
2413 ------------------------------------------------------------------------------
2414    procedure Transform_Coordinates
2415      (W      : in Window := Standard_Window;
2416       Line   : in out Line_Position;
2417       Column : in out Column_Position;
2418       Dir    : in Transform_Direction := From_Screen)
2419    is
2420       type Int_Access is access all C_Int;
2421       function Transform (W    : Window;
2422                           Y, X : Int_Access;
2423                           Dir  : Curses_Bool) return C_Int;
2424       pragma Import (C, Transform, "wmouse_trafo");
2425
2426       X : aliased C_Int := C_Int (Column);
2427       Y : aliased C_Int := C_Int (Line);
2428       D : Curses_Bool := Curses_Bool_False;
2429       R : C_Int;
2430    begin
2431       if Dir = To_Screen then
2432          D := 1;
2433       end if;
2434       R := Transform (W, Y'Access, X'Access, D);
2435       if R = Curses_False then
2436          raise Curses_Exception;
2437       else
2438          Line   := Line_Position (Y);
2439          Column := Column_Position (X);
2440       end if;
2441    end Transform_Coordinates;
2442 ------------------------------------------------------------------------------
2443    procedure Use_Default_Colors is
2444       function C_Use_Default_Colors return C_Int;
2445       pragma Import (C, C_Use_Default_Colors, "use_default_colors");
2446       Err : constant C_Int := C_Use_Default_Colors;
2447    begin
2448       if Err = Curses_Err then
2449          raise Curses_Exception;
2450       end if;
2451    end Use_Default_Colors;
2452
2453    procedure Assume_Default_Colors (Fore : Color_Number := Default_Color;
2454                                     Back : Color_Number := Default_Color)
2455    is
2456       function C_Assume_Default_Colors (Fore : C_Int;
2457                                         Back : C_Int) return C_Int;
2458       pragma Import (C, C_Assume_Default_Colors, "assume_default_colors");
2459
2460       Err : constant C_Int := C_Assume_Default_Colors (C_Int (Fore),
2461                                                        C_Int (Black));
2462    begin
2463       if Err = Curses_Err then
2464          raise Curses_Exception;
2465       end if;
2466    end Assume_Default_Colors;
2467 ------------------------------------------------------------------------------
2468    function Curses_Version return String
2469    is
2470       function curses_versionC return chars_ptr;
2471       pragma Import (C, curses_versionC, "curses_version");
2472       Result : constant chars_ptr := curses_versionC;
2473    begin
2474       return Fill_String (Result);
2475    end Curses_Version;
2476 ------------------------------------------------------------------------------
2477    function Use_Extended_Names (Enable : Boolean) return Boolean
2478    is
2479       function use_extended_namesC (e : Curses_Bool) return C_Int;
2480       pragma Import (C, use_extended_namesC, "use_extended_names");
2481
2482       Res : constant C_Int :=
2483          use_extended_namesC (Curses_Bool (Boolean'Pos (Enable)));
2484    begin
2485       if Res = C_Int (Curses_Bool_False) then
2486          return False;
2487       else
2488          return True;
2489       end if;
2490    end Use_Extended_Names;
2491 ------------------------------------------------------------------------------
2492    procedure Screen_Dump_To_File (Filename : in String)
2493    is
2494       function scr_dump (f : char_array) return C_Int;
2495       pragma Import (C, scr_dump, "scr_dump");
2496       Txt    : char_array (0 .. Filename'Length);
2497       Length : size_t;
2498    begin
2499       To_C (Filename, Txt, Length);
2500       if Curses_Err = scr_dump (Txt) then
2501          raise Curses_Exception;
2502       end if;
2503    end Screen_Dump_To_File;
2504
2505    procedure Screen_Restore_From_File (Filename : in String)
2506    is
2507       function scr_restore (f : char_array) return C_Int;
2508       pragma Import (C, scr_restore, "scr_restore");
2509       Txt    : char_array (0 .. Filename'Length);
2510       Length : size_t;
2511    begin
2512       To_C (Filename, Txt, Length);
2513       if Curses_Err = scr_restore (Txt)  then
2514          raise Curses_Exception;
2515       end if;
2516    end Screen_Restore_From_File;
2517
2518    procedure Screen_Init_From_File (Filename : in String)
2519    is
2520       function scr_init (f : char_array) return C_Int;
2521       pragma Import (C, scr_init, "scr_init");
2522       Txt    : char_array (0 .. Filename'Length);
2523       Length : size_t;
2524    begin
2525       To_C (Filename, Txt, Length);
2526       if Curses_Err = scr_init (Txt) then
2527          raise Curses_Exception;
2528       end if;
2529    end Screen_Init_From_File;
2530
2531    procedure Screen_Set_File (Filename : in String)
2532    is
2533       function scr_set (f : char_array) return C_Int;
2534       pragma Import (C, scr_set, "scr_set");
2535       Txt    : char_array (0 .. Filename'Length);
2536       Length : size_t;
2537    begin
2538       To_C (Filename, Txt, Length);
2539       if Curses_Err = scr_set (Txt) then
2540          raise Curses_Exception;
2541       end if;
2542    end Screen_Set_File;
2543 ------------------------------------------------------------------------------
2544    procedure Resize (Win               : Window := Standard_Window;
2545                      Number_Of_Lines   : Line_Count;
2546                      Number_Of_Columns : Column_Count) is
2547       function wresize (win     : Window;
2548                         lines   : C_Int;
2549                         columns : C_Int) return C_Int;
2550       pragma Import (C, wresize);
2551    begin
2552       if wresize (Win,
2553                   C_Int (Number_Of_Lines),
2554                   C_Int (Number_Of_Columns)) = Curses_Err then
2555          raise Curses_Exception;
2556       end if;
2557    end Resize;
2558 ------------------------------------------------------------------------------
2559
2560 end Terminal_Interface.Curses;
2561