• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1--  -*- ada -*-
2define(`HTMLNAME',`terminal_interface-curses-forms__ads.htm')dnl
3include(M4MACRO)dnl
4------------------------------------------------------------------------------
5--                                                                          --
6--                           GNAT ncurses Binding                           --
7--                                                                          --
8--                      Terminal_Interface.Curses.Form                      --
9--                                                                          --
10--                                 S P E C                                  --
11--                                                                          --
12------------------------------------------------------------------------------
13-- Copyright 2020 Thomas E. Dickey                                          --
14-- Copyright 1998-2009,2014 Free Software Foundation, Inc.                  --
15--                                                                          --
16-- Permission is hereby granted, free of charge, to any person obtaining a  --
17-- copy of this software and associated documentation files (the            --
18-- "Software"), to deal in the Software without restriction, including      --
19-- without limitation the rights to use, copy, modify, merge, publish,      --
20-- distribute, distribute with modifications, sublicense, and/or sell       --
21-- copies of the Software, and to permit persons to whom the Software is    --
22-- furnished to do so, subject to the following conditions:                 --
23--                                                                          --
24-- The above copyright notice and this permission notice shall be included  --
25-- in all copies or substantial portions of the Software.                   --
26--                                                                          --
27-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  --
28-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               --
29-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   --
30-- IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   --
31-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    --
32-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    --
33-- THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               --
34--                                                                          --
35-- Except as contained in this notice, the name(s) of the above copyright   --
36-- holders shall not be used in advertising or otherwise to promote the     --
37-- sale, use or other dealings in this Software without prior written       --
38-- authorization.                                                           --
39------------------------------------------------------------------------------
40--  Author:  Juergen Pfeifer, 1996
41--  Version Control:
42--  $Revision: 1.34 $
43--  $Date: 2020/02/02 23:34:34 $
44--  Binding Version 01.00
45------------------------------------------------------------------------------
46with System;
47with Ada.Characters.Latin_1;
48
49package Terminal_Interface.Curses.Forms is
50   pragma Preelaborate (Terminal_Interface.Curses.Forms);
51   pragma Linker_Options ("-lform" & Curses_Constants.DFT_ARG_SUFFIX);
52
53   Space : Character renames Ada.Characters.Latin_1.Space;
54
55   type Field        is private;
56   type Form         is private;
57
58   Null_Field        : constant Field;
59   Null_Form         : constant Form;
60
61   type Field_Justification is (None,
62                                Left,
63                                Center,
64                                Right);
65
66   type Field_Option_Set is
67      record
68         Visible   : Boolean;
69         Active    : Boolean;
70         Public    : Boolean;
71         Edit      : Boolean;
72         Wrap      : Boolean;
73         Blank     : Boolean;
74         Auto_Skip : Boolean;
75         Null_Ok   : Boolean;
76         Pass_Ok   : Boolean;
77         Static    : Boolean;
78      end record;
79   pragma Convention (C_Pass_By_Copy, Field_Option_Set);
80
81   for Field_Option_Set use
82      record
83         Visible   at 0 range Curses_Constants.O_VISIBLE_First
84           .. Curses_Constants.O_VISIBLE_Last;
85         Active    at 0 range Curses_Constants.O_ACTIVE_First
86           .. Curses_Constants.O_ACTIVE_Last;
87         Public    at 0 range Curses_Constants.O_PUBLIC_First
88           .. Curses_Constants.O_PUBLIC_Last;
89         Edit      at 0 range Curses_Constants.O_EDIT_First
90           .. Curses_Constants.O_EDIT_Last;
91         Wrap      at 0 range Curses_Constants.O_WRAP_First
92           .. Curses_Constants.O_WRAP_Last;
93         Blank     at 0 range Curses_Constants.O_BLANK_First
94           .. Curses_Constants.O_BLANK_Last;
95         Auto_Skip at 0 range Curses_Constants.O_AUTOSKIP_First
96           .. Curses_Constants.O_AUTOSKIP_Last;
97         Null_Ok   at 0 range Curses_Constants.O_NULLOK_First
98           .. Curses_Constants.O_NULLOK_Last;
99         Pass_Ok   at 0 range Curses_Constants.O_PASSOK_First
100           .. Curses_Constants.O_PASSOK_Last;
101         Static    at 0 range Curses_Constants.O_STATIC_First
102           .. Curses_Constants.O_STATIC_Last;
103      end record;
104   pragma Warnings (Off);
105   for Field_Option_Set'Size use Curses_Constants.Field_Options_Size;
106   pragma Warnings (On);
107
108   function Default_Field_Options return Field_Option_Set;
109   --  The initial defaults for the field options.
110   pragma Inline (Default_Field_Options);
111
112   type Form_Option_Set is
113      record
114         NL_Overload : Boolean;
115         BS_Overload : Boolean;
116      end record;
117   pragma Convention (C_Pass_By_Copy, Form_Option_Set);
118
119   for Form_Option_Set use
120      record
121         NL_Overload at 0 range Curses_Constants.O_NL_OVERLOAD_First
122           .. Curses_Constants.O_NL_OVERLOAD_Last;
123         BS_Overload at 0 range Curses_Constants.O_BS_OVERLOAD_First
124           .. Curses_Constants.O_BS_OVERLOAD_Last;
125      end record;
126   pragma Warnings (Off);
127   for Form_Option_Set'Size use Curses_Constants.Field_Options_Size;
128   pragma Warnings (On);
129
130   function Default_Form_Options return Form_Option_Set;
131   --  The initial defaults for the form options.
132   pragma Inline (Default_Form_Options);
133
134   type Buffer_Number is new Natural;
135
136   type Field_Array is array (Positive range <>) of aliased Field;
137   pragma Convention (C, Field_Array);
138
139   type Field_Array_Access is access Field_Array;
140
141   procedure Free (FA          : in out Field_Array_Access;
142                   Free_Fields : Boolean := False);
143   --  Release the memory for an allocated field array
144   --  If Free_Fields is True, call Delete() for all the fields in
145   --  the array.
146
147   subtype Form_Request_Code is Key_Code range (Key_Max + 1) .. (Key_Max + 57);
148
149   --  The prefix F_ stands for "Form Request"
150   F_Next_Page                : constant Form_Request_Code := Key_Max + 1;
151   F_Previous_Page            : constant Form_Request_Code := Key_Max + 2;
152   F_First_Page               : constant Form_Request_Code := Key_Max + 3;
153   F_Last_Page                : constant Form_Request_Code := Key_Max + 4;
154
155   F_Next_Field               : constant Form_Request_Code := Key_Max + 5;
156   F_Previous_Field           : constant Form_Request_Code := Key_Max + 6;
157   F_First_Field              : constant Form_Request_Code := Key_Max + 7;
158   F_Last_Field               : constant Form_Request_Code := Key_Max + 8;
159   F_Sorted_Next_Field        : constant Form_Request_Code := Key_Max + 9;
160   F_Sorted_Previous_Field    : constant Form_Request_Code := Key_Max + 10;
161   F_Sorted_First_Field       : constant Form_Request_Code := Key_Max + 11;
162   F_Sorted_Last_Field        : constant Form_Request_Code := Key_Max + 12;
163   F_Left_Field               : constant Form_Request_Code := Key_Max + 13;
164   F_Right_Field              : constant Form_Request_Code := Key_Max + 14;
165   F_Up_Field                 : constant Form_Request_Code := Key_Max + 15;
166   F_Down_Field               : constant Form_Request_Code := Key_Max + 16;
167
168   F_Next_Char                : constant Form_Request_Code := Key_Max + 17;
169   F_Previous_Char            : constant Form_Request_Code := Key_Max + 18;
170   F_Next_Line                : constant Form_Request_Code := Key_Max + 19;
171   F_Previous_Line            : constant Form_Request_Code := Key_Max + 20;
172   F_Next_Word                : constant Form_Request_Code := Key_Max + 21;
173   F_Previous_Word            : constant Form_Request_Code := Key_Max + 22;
174   F_Begin_Field              : constant Form_Request_Code := Key_Max + 23;
175   F_End_Field                : constant Form_Request_Code := Key_Max + 24;
176   F_Begin_Line               : constant Form_Request_Code := Key_Max + 25;
177   F_End_Line                 : constant Form_Request_Code := Key_Max + 26;
178   F_Left_Char                : constant Form_Request_Code := Key_Max + 27;
179   F_Right_Char               : constant Form_Request_Code := Key_Max + 28;
180   F_Up_Char                  : constant Form_Request_Code := Key_Max + 29;
181   F_Down_Char                : constant Form_Request_Code := Key_Max + 30;
182
183   F_New_Line                 : constant Form_Request_Code := Key_Max + 31;
184   F_Insert_Char              : constant Form_Request_Code := Key_Max + 32;
185   F_Insert_Line              : constant Form_Request_Code := Key_Max + 33;
186   F_Delete_Char              : constant Form_Request_Code := Key_Max + 34;
187   F_Delete_Previous          : constant Form_Request_Code := Key_Max + 35;
188   F_Delete_Line              : constant Form_Request_Code := Key_Max + 36;
189   F_Delete_Word              : constant Form_Request_Code := Key_Max + 37;
190   F_Clear_EOL                : constant Form_Request_Code := Key_Max + 38;
191   F_Clear_EOF                : constant Form_Request_Code := Key_Max + 39;
192   F_Clear_Field              : constant Form_Request_Code := Key_Max + 40;
193   F_Overlay_Mode             : constant Form_Request_Code := Key_Max + 41;
194   F_Insert_Mode              : constant Form_Request_Code := Key_Max + 42;
195
196   --  Vertical Scrolling
197   F_ScrollForward_Line       : constant Form_Request_Code := Key_Max + 43;
198   F_ScrollBackward_Line      : constant Form_Request_Code := Key_Max + 44;
199   F_ScrollForward_Page       : constant Form_Request_Code := Key_Max + 45;
200   F_ScrollBackward_Page      : constant Form_Request_Code := Key_Max + 46;
201   F_ScrollForward_HalfPage   : constant Form_Request_Code := Key_Max + 47;
202   F_ScrollBackward_HalfPage  : constant Form_Request_Code := Key_Max + 48;
203
204   --  Horizontal Scrolling
205   F_HScrollForward_Char      : constant Form_Request_Code := Key_Max + 49;
206   F_HScrollBackward_Char     : constant Form_Request_Code := Key_Max + 50;
207   F_HScrollForward_Line      : constant Form_Request_Code := Key_Max + 51;
208   F_HScrollBackward_Line     : constant Form_Request_Code := Key_Max + 52;
209   F_HScrollForward_HalfLine  : constant Form_Request_Code := Key_Max + 53;
210   F_HScrollBackward_HalfLine : constant Form_Request_Code := Key_Max + 54;
211
212   F_Validate_Field           : constant Form_Request_Code := Key_Max + 55;
213   F_Next_Choice              : constant Form_Request_Code := Key_Max + 56;
214   F_Previous_Choice          : constant Form_Request_Code := Key_Max + 57;
215
216   --  For those who like the old 'C' style request names
217   REQ_NEXT_PAGE    : Form_Request_Code renames F_Next_Page;
218   REQ_PREV_PAGE    : Form_Request_Code renames F_Previous_Page;
219   REQ_FIRST_PAGE   : Form_Request_Code renames F_First_Page;
220   REQ_LAST_PAGE    : Form_Request_Code renames F_Last_Page;
221
222   REQ_NEXT_FIELD   : Form_Request_Code renames F_Next_Field;
223   REQ_PREV_FIELD   : Form_Request_Code renames F_Previous_Field;
224   REQ_FIRST_FIELD  : Form_Request_Code renames F_First_Field;
225   REQ_LAST_FIELD   : Form_Request_Code renames F_Last_Field;
226   REQ_SNEXT_FIELD  : Form_Request_Code renames F_Sorted_Next_Field;
227   REQ_SPREV_FIELD  : Form_Request_Code renames F_Sorted_Previous_Field;
228   REQ_SFIRST_FIELD : Form_Request_Code renames F_Sorted_First_Field;
229   REQ_SLAST_FIELD  : Form_Request_Code renames F_Sorted_Last_Field;
230   REQ_LEFT_FIELD   : Form_Request_Code renames F_Left_Field;
231   REQ_RIGHT_FIELD  : Form_Request_Code renames F_Right_Field;
232   REQ_UP_FIELD     : Form_Request_Code renames F_Up_Field;
233   REQ_DOWN_FIELD   : Form_Request_Code renames F_Down_Field;
234
235   REQ_NEXT_CHAR    : Form_Request_Code renames F_Next_Char;
236   REQ_PREV_CHAR    : Form_Request_Code renames F_Previous_Char;
237   REQ_NEXT_LINE    : Form_Request_Code renames F_Next_Line;
238   REQ_PREV_LINE    : Form_Request_Code renames F_Previous_Line;
239   REQ_NEXT_WORD    : Form_Request_Code renames F_Next_Word;
240   REQ_PREV_WORD    : Form_Request_Code renames F_Previous_Word;
241   REQ_BEG_FIELD    : Form_Request_Code renames F_Begin_Field;
242   REQ_END_FIELD    : Form_Request_Code renames F_End_Field;
243   REQ_BEG_LINE     : Form_Request_Code renames F_Begin_Line;
244   REQ_END_LINE     : Form_Request_Code renames F_End_Line;
245   REQ_LEFT_CHAR    : Form_Request_Code renames F_Left_Char;
246   REQ_RIGHT_CHAR   : Form_Request_Code renames F_Right_Char;
247   REQ_UP_CHAR      : Form_Request_Code renames F_Up_Char;
248   REQ_DOWN_CHAR    : Form_Request_Code renames F_Down_Char;
249
250   REQ_NEW_LINE     : Form_Request_Code renames F_New_Line;
251   REQ_INS_CHAR     : Form_Request_Code renames F_Insert_Char;
252   REQ_INS_LINE     : Form_Request_Code renames F_Insert_Line;
253   REQ_DEL_CHAR     : Form_Request_Code renames F_Delete_Char;
254   REQ_DEL_PREV     : Form_Request_Code renames F_Delete_Previous;
255   REQ_DEL_LINE     : Form_Request_Code renames F_Delete_Line;
256   REQ_DEL_WORD     : Form_Request_Code renames F_Delete_Word;
257   REQ_CLR_EOL      : Form_Request_Code renames F_Clear_EOL;
258   REQ_CLR_EOF      : Form_Request_Code renames F_Clear_EOF;
259   REQ_CLR_FIELD    : Form_Request_Code renames F_Clear_Field;
260   REQ_OVL_MODE     : Form_Request_Code renames F_Overlay_Mode;
261   REQ_INS_MODE     : Form_Request_Code renames F_Insert_Mode;
262
263   REQ_SCR_FLINE    : Form_Request_Code renames F_ScrollForward_Line;
264   REQ_SCR_BLINE    : Form_Request_Code renames F_ScrollBackward_Line;
265   REQ_SCR_FPAGE    : Form_Request_Code renames F_ScrollForward_Page;
266   REQ_SCR_BPAGE    : Form_Request_Code renames F_ScrollBackward_Page;
267   REQ_SCR_FHPAGE   : Form_Request_Code renames F_ScrollForward_HalfPage;
268   REQ_SCR_BHPAGE   : Form_Request_Code renames F_ScrollBackward_HalfPage;
269
270   REQ_SCR_FCHAR    : Form_Request_Code renames F_HScrollForward_Char;
271   REQ_SCR_BCHAR    : Form_Request_Code renames F_HScrollBackward_Char;
272   REQ_SCR_HFLINE   : Form_Request_Code renames F_HScrollForward_Line;
273   REQ_SCR_HBLINE   : Form_Request_Code renames F_HScrollBackward_Line;
274   REQ_SCR_HFHALF   : Form_Request_Code renames F_HScrollForward_HalfLine;
275   REQ_SCR_HBHALF   : Form_Request_Code renames F_HScrollBackward_HalfLine;
276
277   REQ_VALIDATION   : Form_Request_Code renames F_Validate_Field;
278   REQ_NEXT_CHOICE  : Form_Request_Code renames F_Next_Choice;
279   REQ_PREV_CHOICE  : Form_Request_Code renames F_Previous_Choice;
280
281   procedure Request_Name (Key  : Form_Request_Code;
282                           Name : out String);
283
284   function  Request_Name (Key : Form_Request_Code) return String;
285   --  Same as function
286   pragma Inline (Request_Name);
287
288   ------------------
289   --  Exceptions  --
290   ------------------
291   Form_Exception : exception;
292
293   --  MANPAGE(`form_field_new.3x')
294
295   --  ANCHOR(`new_field()',`Create')
296   function Create (Height       : Line_Count;
297                    Width        : Column_Count;
298                    Top          : Line_Position;
299                    Left         : Column_Position;
300                    Off_Screen   : Natural := 0;
301                    More_Buffers : Buffer_Number := Buffer_Number'First)
302                    return Field;
303   --  AKA
304   --  An overloaded Create is defined later. Pragma Inline appears there.
305
306   --  ANCHOR(`new_field()',`New_Field')
307   function New_Field (Height       : Line_Count;
308                       Width        : Column_Count;
309                       Top          : Line_Position;
310                       Left         : Column_Position;
311                       Off_Screen   : Natural := 0;
312                       More_Buffers : Buffer_Number := Buffer_Number'First)
313                       return Field renames Create;
314   --  AKA
315   pragma Inline (New_Field);
316
317   --  ANCHOR(`free_field()',`Delete')
318   procedure Delete (Fld : in out Field);
319   --  AKA
320   --  Reset Fld to Null_Field
321   --  An overloaded Delete is defined later. Pragma Inline appears there.
322
323   --  ANCHOR(`dup_field()',`Duplicate')
324   function Duplicate (Fld  : Field;
325                       Top  : Line_Position;
326                       Left : Column_Position) return Field;
327   --  AKA
328   pragma Inline (Duplicate);
329
330   --  ANCHOR(`link_field()',`Link')
331   function Link (Fld  : Field;
332                  Top  : Line_Position;
333                  Left : Column_Position) return Field;
334   --  AKA
335   pragma Inline (Link);
336
337   --  MANPAGE(`form_field_just.3x')
338
339   --  ANCHOR(`set_field_just()',`Set_Justification')
340   procedure Set_Justification (Fld  : Field;
341                                Just : Field_Justification := None);
342   --  AKA
343   pragma Inline (Set_Justification);
344
345   --  ANCHOR(`field_just()',`Get_Justification')
346   function Get_Justification (Fld : Field) return Field_Justification;
347   --  AKA
348   pragma Inline (Get_Justification);
349
350   --  MANPAGE(`form_field_buffer.3x')
351
352   --  ANCHOR(`set_field_buffer()',`Set_Buffer')
353   procedure Set_Buffer
354     (Fld    : Field;
355      Buffer : Buffer_Number := Buffer_Number'First;
356      Str    : String);
357   --  AKA
358   --  Not inlined
359
360   --  ANCHOR(`field_buffer()',`Get_Buffer')
361   procedure Get_Buffer
362     (Fld    : Field;
363      Buffer : Buffer_Number := Buffer_Number'First;
364      Str    : out String);
365   --  AKA
366
367   function Get_Buffer
368     (Fld    : Field;
369      Buffer : Buffer_Number := Buffer_Number'First) return String;
370   --  AKA
371   --  Same but as function
372   pragma Inline (Get_Buffer);
373
374   --  ANCHOR(`set_field_status()',`Set_Status')
375   procedure Set_Status (Fld    : Field;
376                         Status : Boolean := True);
377   --  AKA
378   pragma Inline (Set_Status);
379
380   --  ANCHOR(`field_status()',`Changed')
381   function Changed (Fld : Field) return Boolean;
382   --  AKA
383   pragma Inline (Changed);
384
385   --  ANCHOR(`set_field_max()',`Set_Maximum_Size')
386   procedure Set_Maximum_Size (Fld : Field;
387                               Max : Natural := 0);
388   --  AKA
389   pragma Inline (Set_Maximum_Size);
390
391   --  MANPAGE(`form_field_opts.3x')
392
393   --  ANCHOR(`set_field_opts()',`Set_Options')
394   procedure Set_Options (Fld     : Field;
395                          Options : Field_Option_Set);
396   --  AKA
397   --  An overloaded version is defined later. Pragma Inline appears there
398
399   --  ANCHOR(`field_opts_on()',`Switch_Options')
400   procedure Switch_Options (Fld     : Field;
401                             Options : Field_Option_Set;
402                             On      : Boolean := True);
403   --  AKA
404   --  ALIAS(`field_opts_off()')
405   --  An overloaded version is defined later. Pragma Inline appears there
406
407   --  ANCHOR(`field_opts()',`Get_Options')
408   procedure Get_Options (Fld     : Field;
409                          Options : out Field_Option_Set);
410   --  AKA
411
412   --  ANCHOR(`field_opts()',`Get_Options')
413   function Get_Options (Fld : Field := Null_Field)
414                         return Field_Option_Set;
415   --  AKA
416   --  An overloaded version is defined later. Pragma Inline appears there
417
418   --  MANPAGE(`form_field_attributes.3x')
419
420   --  ANCHOR(`set_field_fore()',`Set_Foreground')
421   procedure Set_Foreground
422     (Fld   : Field;
423      Fore  : Character_Attribute_Set := Normal_Video;
424      Color : Color_Pair := Color_Pair'First);
425   --  AKA
426   pragma Inline (Set_Foreground);
427
428   --  ANCHOR(`field_fore()',`Foreground')
429   procedure Foreground (Fld  : Field;
430                         Fore : out Character_Attribute_Set);
431   --  AKA
432
433   --  ANCHOR(`field_fore()',`Foreground')
434   procedure Foreground (Fld   : Field;
435                         Fore  : out Character_Attribute_Set;
436                         Color : out Color_Pair);
437   --  AKA
438   pragma Inline (Foreground);
439
440   --  ANCHOR(`set_field_back()',`Set_Background')
441   procedure Set_Background
442     (Fld   : Field;
443      Back  : Character_Attribute_Set := Normal_Video;
444      Color : Color_Pair := Color_Pair'First);
445   --  AKA
446   pragma Inline (Set_Background);
447
448   --  ANCHOR(`field_back()',`Background')
449   procedure Background (Fld  : Field;
450                         Back : out Character_Attribute_Set);
451   --  AKA
452
453   --  ANCHOR(`field_back()',`Background')
454   procedure Background (Fld   : Field;
455                         Back  : out Character_Attribute_Set;
456                         Color : out Color_Pair);
457   --  AKA
458   pragma Inline (Background);
459
460   --  ANCHOR(`set_field_pad()',`Set_Pad_Character')
461   procedure Set_Pad_Character (Fld : Field;
462                                Pad : Character := Space);
463   --  AKA
464   pragma Inline (Set_Pad_Character);
465
466   --  ANCHOR(`field_pad()',`Pad_Character')
467   procedure Pad_Character (Fld : Field;
468                            Pad : out Character);
469   --  AKA
470   pragma Inline (Pad_Character);
471
472   --  MANPAGE(`form_field_info.3x')
473
474   --  ANCHOR(`field_info()',`Info')
475   procedure Info (Fld                : Field;
476                   Lines              : out Line_Count;
477                   Columns            : out Column_Count;
478                   First_Row          : out Line_Position;
479                   First_Column       : out Column_Position;
480                   Off_Screen         : out Natural;
481                   Additional_Buffers : out Buffer_Number);
482   --  AKA
483   pragma Inline (Info);
484
485   --  ANCHOR(`dynamic_field_info()',`Dynamic_Info')
486   procedure Dynamic_Info (Fld     : Field;
487                           Lines   : out Line_Count;
488                           Columns : out Column_Count;
489                           Max     : out Natural);
490   --  AKA
491   pragma Inline (Dynamic_Info);
492
493   --  MANPAGE(`form_win.3x')
494
495   --  ANCHOR(`set_form_win()',`Set_Window')
496   procedure Set_Window (Frm : Form;
497                         Win : Window);
498   --  AKA
499   pragma Inline (Set_Window);
500
501   --  ANCHOR(`form_win()',`Get_Window')
502   function Get_Window (Frm : Form) return Window;
503   --  AKA
504   pragma Inline (Get_Window);
505
506   --  ANCHOR(`set_form_sub()',`Set_Sub_Window')
507   procedure Set_Sub_Window (Frm : Form;
508                             Win : Window);
509   --  AKA
510   pragma Inline (Set_Sub_Window);
511
512   --  ANCHOR(`form_sub()',`Get_Sub_Window')
513   function Get_Sub_Window (Frm : Form) return Window;
514   --  AKA
515   pragma Inline (Get_Sub_Window);
516
517   --  ANCHOR(`scale_form()',`Scale')
518   procedure Scale (Frm     : Form;
519                    Lines   : out Line_Count;
520                    Columns : out Column_Count);
521   --  AKA
522   pragma Inline (Scale);
523
524   --  MANPAGE(`form_hook.3x')
525
526   type Form_Hook_Function is access procedure (Frm : Form);
527   pragma Convention (C, Form_Hook_Function);
528
529   --  ANCHOR(`set_field_init()',`Set_Field_Init_Hook')
530   procedure Set_Field_Init_Hook (Frm  : Form;
531                                  Proc : Form_Hook_Function);
532   --  AKA
533   pragma Inline (Set_Field_Init_Hook);
534
535   --  ANCHOR(`set_field_term()',`Set_Field_Term_Hook')
536   procedure Set_Field_Term_Hook (Frm  : Form;
537                                  Proc : Form_Hook_Function);
538   --  AKA
539   pragma Inline (Set_Field_Term_Hook);
540
541   --  ANCHOR(`set_form_init()',`Set_Form_Init_Hook')
542   procedure Set_Form_Init_Hook (Frm  : Form;
543                                 Proc : Form_Hook_Function);
544   --  AKA
545   pragma Inline (Set_Form_Init_Hook);
546
547   --  ANCHOR(`set_form_term()',`Set_Form_Term_Hook')
548   procedure Set_Form_Term_Hook (Frm  : Form;
549                                 Proc : Form_Hook_Function);
550   --  AKA
551   pragma Inline (Set_Form_Term_Hook);
552
553   --  ANCHOR(`field_init()',`Get_Field_Init_Hook')
554   function Get_Field_Init_Hook (Frm : Form) return Form_Hook_Function;
555   --  AKA
556   pragma Import (C, Get_Field_Init_Hook, "field_init");
557
558   --  ANCHOR(`field_term()',`Get_Field_Term_Hook')
559   function Get_Field_Term_Hook (Frm : Form) return Form_Hook_Function;
560   --  AKA
561   pragma Import (C, Get_Field_Term_Hook, "field_term");
562
563   --  ANCHOR(`form_init()',`Get_Form_Init_Hook')
564   function Get_Form_Init_Hook (Frm : Form) return Form_Hook_Function;
565   --  AKA
566   pragma Import (C, Get_Form_Init_Hook, "form_init");
567
568   --  ANCHOR(`form_term()',`Get_Form_Term_Hook')
569   function Get_Form_Term_Hook (Frm : Form) return Form_Hook_Function;
570   --  AKA
571   pragma Import (C, Get_Form_Term_Hook, "form_term");
572
573   --  MANPAGE(`form_field.3x')
574
575   --  ANCHOR(`set_form_fields()',`Redefine')
576   procedure Redefine (Frm  : Form;
577                       Flds : Field_Array_Access);
578   --  AKA
579   pragma Inline (Redefine);
580
581   --  ANCHOR(`set_form_fields()',`Set_Fields')
582   procedure Set_Fields (Frm  : Form;
583                         Flds : Field_Array_Access) renames Redefine;
584   --  AKA
585   --  pragma Inline (Set_Fields);
586
587   --  ANCHOR(`form_fields()',`Fields')
588   function Fields (Frm   : Form;
589                    Index : Positive) return Field;
590   --  AKA
591   pragma Inline (Fields);
592
593   --  ANCHOR(`field_count()',`Field_Count')
594   function Field_Count (Frm : Form) return Natural;
595   --  AKA
596   pragma Inline (Field_Count);
597
598   --  ANCHOR(`move_field()',`Move')
599   procedure Move (Fld    : Field;
600                   Line   : Line_Position;
601                   Column : Column_Position);
602   --  AKA
603   pragma Inline (Move);
604
605   --  MANPAGE(`form_new.3x')
606
607   --  ANCHOR(`new_form()',`Create')
608   function Create (Fields : Field_Array_Access) return Form;
609   --  AKA
610   pragma Inline (Create);
611
612   --  ANCHOR(`new_form()',`New_Form')
613   function New_Form (Fields : Field_Array_Access) return Form
614     renames Create;
615   --  AKA
616   --  pragma Inline (New_Form);
617
618   --  ANCHOR(`free_form()',`Delete')
619   procedure Delete (Frm : in out Form);
620   --  AKA
621   --  Reset Frm to Null_Form
622   pragma Inline (Delete);
623
624   --  MANPAGE(`form_opts.3x')
625
626   --  ANCHOR(`set_form_opts()',`Set_Options')
627   procedure Set_Options (Frm     : Form;
628                          Options : Form_Option_Set);
629   --  AKA
630   pragma Inline (Set_Options);
631
632   --  ANCHOR(`form_opts_on()',`Switch_Options')
633   procedure Switch_Options (Frm     : Form;
634                             Options : Form_Option_Set;
635                             On      : Boolean := True);
636   --  AKA
637   --  ALIAS(`form_opts_off()')
638   pragma Inline (Switch_Options);
639
640   --  ANCHOR(`form_opts()',`Get_Options')
641   procedure Get_Options (Frm     : Form;
642                          Options : out Form_Option_Set);
643   --  AKA
644
645   --  ANCHOR(`form_opts()',`Get_Options')
646   function Get_Options (Frm : Form := Null_Form) return Form_Option_Set;
647   --  AKA
648   pragma Inline (Get_Options);
649
650   --  MANPAGE(`form_post.3x')
651
652   --  ANCHOR(`post_form()',`Post')
653   procedure Post (Frm  : Form;
654                   Post : Boolean := True);
655   --  AKA
656   --  ALIAS(`unpost_form()')
657   pragma Inline (Post);
658
659   --  MANPAGE(`form_cursor.3x')
660
661   --  ANCHOR(`pos_form_cursor()',`Position_Cursor')
662   procedure Position_Cursor (Frm : Form);
663   --  AKA
664   pragma Inline (Position_Cursor);
665
666   --  MANPAGE(`form_data.3x')
667
668   --  ANCHOR(`data_ahead()',`Data_Ahead')
669   function Data_Ahead (Frm : Form) return Boolean;
670   --  AKA
671   pragma Inline (Data_Ahead);
672
673   --  ANCHOR(`data_behind()',`Data_Behind')
674   function Data_Behind (Frm : Form) return Boolean;
675   --  AKA
676   pragma Inline (Data_Behind);
677
678   --  MANPAGE(`form_driver.3x')
679
680   type Driver_Result is (Form_Ok,
681                          Request_Denied,
682                          Unknown_Request,
683                          Invalid_Field);
684
685   --  ANCHOR(`form_driver()',`Driver')
686   function Driver (Frm : Form;
687                    Key : Key_Code) return Driver_Result;
688   --  AKA
689   --  Driver not inlined
690
691   --  MANPAGE(`form_page.3x')
692
693   type Page_Number is new Natural;
694
695   --  ANCHOR(`set_current_field()',`Set_Current')
696   procedure Set_Current (Frm : Form;
697                          Fld : Field);
698   --  AKA
699   pragma Inline (Set_Current);
700
701   --  ANCHOR(`current_field()',`Current')
702   function Current (Frm : Form) return Field;
703   --  AKA
704   pragma Inline (Current);
705
706   --  ANCHOR(`set_form_page()',`Set_Page')
707   procedure Set_Page (Frm  : Form;
708                       Page : Page_Number := Page_Number'First);
709   --  AKA
710   pragma Inline (Set_Page);
711
712   --  ANCHOR(`form_page()',`Page')
713   function Page (Frm : Form) return Page_Number;
714   --  AKA
715   pragma Inline (Page);
716
717   --  ANCHOR(`field_index()',`Get_Index')
718   function Get_Index (Fld : Field) return Positive;
719   --  AKA
720   --  Please note that in this binding we start the numbering of fields
721   --  with 1. So this is number is one more than you get from the low
722   --  level call.
723   pragma Inline (Get_Index);
724
725   --  MANPAGE(`form_new_page.3x')
726
727   --  ANCHOR(`set_new_page()',`Set_New_Page')
728   procedure Set_New_Page (Fld      : Field;
729                           New_Page : Boolean := True);
730   --  AKA
731   pragma Inline (Set_New_Page);
732
733   --  ANCHOR(`new_page()',`Is_New_Page')
734   function Is_New_Page (Fld : Field) return Boolean;
735   --  AKA
736   pragma Inline (Is_New_Page);
737
738   --  MANPAGE(`form_requestname.3x')
739   --  Not Implemented: form_request_name, form_request_by_name
740
741------------------------------------------------------------------------------
742private
743   type Field is new System.Storage_Elements.Integer_Address;
744   type Form  is new System.Storage_Elements.Integer_Address;
745
746   Null_Field : constant Field := 0;
747   Null_Form  : constant Form  := 0;
748
749end Terminal_Interface.Curses.Forms;
750