1 ------------------------------------------------------------------------------
3 -- GNAT ncurses Binding --
5 -- Terminal_Interface.Curses.Menus --
11 -- The ncurses Ada95 binding is copyrighted 1996 by --
12 -- Juergen Pfeifer, Email: Juergen.Pfeifer@T-Online.de --
14 -- Permission is hereby granted to reproduce and distribute this --
15 -- binding by any means and for any fee, whether alone or as part --
16 -- of a larger distribution, in source or in binary form, PROVIDED --
17 -- this notice is included with any such distribution, and is not --
18 -- removed from any of its header files. Mention of ncurses and the --
19 -- author of this binding in any applications linked with it is --
20 -- highly appreciated. --
22 -- This binding comes AS IS with no warranty, implied or expressed. --
23 ------------------------------------------------------------------------------
26 ------------------------------------------------------------------------------
27 with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
29 with Interfaces.C; use Interfaces.C;
30 with Interfaces.C.Strings;
31 with Terminal_Interface.Curses;
33 with Ada.Unchecked_Deallocation;
34 with Unchecked_Conversion;
36 package body Terminal_Interface.Curses.Menus is
38 use type System.Bit_Order;
39 subtype chars_ptr is Interfaces.C.Strings.chars_ptr;
41 function MOS_2_CInt is new
42 Unchecked_Conversion (Menu_Option_Set,
45 function CInt_2_MOS is new
46 Unchecked_Conversion (C_Int,
49 function IOS_2_CInt is new
50 Unchecked_Conversion (Item_Option_Set,
53 function CInt_2_IOS is new
54 Unchecked_Conversion (C_Int,
57 ------------------------------------------------------------------------------
58 procedure Free_Allocated_Items is
59 new Ada.Unchecked_Deallocation (Item_Array, Item_Array_Access);
61 procedure Free_User_Wrapper is
62 new Ada.Unchecked_Deallocation (Ada_User_Wrapper,
63 Ada_User_Wrapper_Access);
65 ------------------------------------------------------------------------------
66 procedure Request_Name (Key : in Menu_Request_Code;
69 function Request_Name (Key : C_Int) return chars_ptr;
70 pragma Import (C, Request_Name, "menu_request_name");
72 Fill_String (Request_Name (C_Int (Key)), Name);
75 -- !!! W A R N I N G !!!
76 -- If you want to port this binding to a non ncurses version of the
77 -- ETI, this must be rewritten. In ncurses the menu items and
78 -- descriptions may be automatic variables, because ncurses copies
79 -- the parameters into private allocated internal structures.
80 -- Other implementations don't do that usually, so depending on
81 -- scopes you may see unexpected results.
82 function Create (Name : String;
83 Description : String := "") return Item
85 type Char_Ptr is access all Interfaces.C.Char;
86 function Newitem (Name, Desc : Char_Ptr) return Item;
87 pragma Import (C, Newitem, "new_item");
89 Name_Str : char_array (0 .. Name'Length);
90 Desc_Str : char_array (0 .. Description'Length);
91 Name_Len, Desc_Len : size_t;
94 To_C (Name, Name_Str, Name_Len);
95 To_C (Description, Desc_Str, Desc_Len);
96 Result := Newitem (Name_Str (Name_Str'First)'Access,
97 Desc_Str (Desc_Str'First)'Access);
98 if Result = Null_Item then
99 raise Eti_System_Error;
104 procedure Delete (Itm : in out Item)
106 function Freeitem (Itm : Item) return C_Int;
107 pragma Import (C, Freeitem, "free_item");
109 Res : constant Eti_Error := Freeitem (Itm);
116 -------------------------------------------------------------------------------
117 procedure Set_Value (Itm : in Item;
118 Value : in Boolean := True)
120 function Set_Item_Val (Itm : Item;
121 Val : C_Int) return C_Int;
122 pragma Import (C, Set_Item_Val, "set_item_value");
124 Res : constant Eti_Error := Set_Item_Val (Itm, Boolean'Pos (Value));
131 function Value (Itm : Item) return Boolean
133 function Item_Val (Itm : Item) return C_Int;
134 pragma Import (C, Item_Val, "item_value");
136 if Item_Val (Itm) = Curses_False then
143 -------------------------------------------------------------------------------
144 function Visible (Itm : Item) return Boolean
146 function Item_Vis (Itm : Item) return C_Int;
147 pragma Import (C, Item_Vis, "item_visible");
149 if Item_Vis (Itm) = Curses_False then
155 -------------------------------------------------------------------------------
156 procedure Normalize_Item_Options (Options : in out C_Int);
157 pragma Import (C, Normalize_Item_Options, "_nc_ada_normalize_item_opts");
159 procedure Set_Options (Itm : in Item;
160 Options : in Item_Option_Set)
162 function Set_Item_Opts (Itm : Item;
163 Opt : C_Int) return C_Int;
164 pragma Import (C, Set_Item_Opts, "set_item_opts");
166 Opt : C_Int := IOS_2_CInt (Options);
169 Normalize_Item_Options (Opt);
170 Res := Set_Item_Opts (Itm, Opt);
176 procedure Switch_Options (Itm : in Item;
177 Options : in Item_Option_Set;
178 On : Boolean := True)
180 function Item_Opts_On (Itm : Item;
181 Opt : C_Int) return C_Int;
182 pragma Import (C, Item_Opts_On, "item_opts_on");
183 function Item_Opts_Off (Itm : Item;
184 Opt : C_Int) return C_Int;
185 pragma Import (C, Item_Opts_Off, "item_opts_off");
187 Opt : C_Int := IOS_2_CInt (Options);
190 Normalize_Item_Options (Opt);
192 Err := Item_Opts_On (Itm, Opt);
194 Err := Item_Opts_Off (Itm, Opt);
201 procedure Get_Options (Itm : in Item;
202 Options : out Item_Option_Set)
204 function Item_Opts (Itm : Item) return C_Int;
205 pragma Import (C, Item_Opts, "item_opts");
207 Res : C_Int := Item_Opts (Itm);
209 Normalize_Item_Options (Res);
210 Options := CInt_2_IOS (Res);
213 function Get_Options (Itm : Item := Null_Item) return Item_Option_Set
215 Ios : Item_Option_Set;
217 Get_Options (Itm, Ios);
220 -------------------------------------------------------------------------------
221 procedure Name (Itm : in Item;
224 function Itemname (Itm : Item) return chars_ptr;
225 pragma Import (C, Itemname, "item_name");
227 Fill_String (Itemname (Itm), Name);
230 procedure Description (Itm : in Item;
231 Description : out String)
233 function Descname (Itm : Item) return chars_ptr;
234 pragma Import (C, Descname, "item_description");
236 Fill_String (Descname (Itm), Description);
238 -------------------------------------------------------------------------------
239 procedure Set_Current (Men : in Menu;
242 function Set_Curr_Item (Men : Menu;
243 Itm : Item) return C_Int;
244 pragma Import (C, Set_Curr_Item, "set_current_item");
246 Res : constant Eti_Error := Set_Curr_Item (Men, Itm);
253 function Current (Men : Menu) return Item
255 function Curr_Item (Men : Menu) return Item;
256 pragma Import (C, Curr_Item, "current_item");
258 Res : constant Item := Curr_Item (Men);
260 if Res = Null_Item then
261 raise Menu_Exception;
266 procedure Set_Top_Row (Men : in Menu;
267 Line : in Line_Position)
269 function Set_Toprow (Men : Menu;
270 Line : C_Int) return C_Int;
271 pragma Import (C, Set_Toprow, "set_top_row");
273 Res : constant Eti_Error := Set_Toprow (Men, C_Int (Line));
280 function Top_Row (Men : Menu) return Line_Position
282 function Toprow (Men : Menu) return C_Int;
283 pragma Import (C, Toprow, "top_row");
285 Res : constant C_Int := Toprow (Men);
287 if Res = Curses_Err then
288 raise Menu_Exception;
290 return Line_Position (Res);
293 function Get_Index (Itm : Item) return Positive
295 function Get_Itemindex (Itm : Item) return C_Int;
296 pragma Import (C, Get_Itemindex, "item_index");
298 Res : constant C_Int := Get_Itemindex (Itm);
300 if Res = Curses_Err then
301 raise Menu_Exception;
303 return Positive (Natural (Res) + Positive'First);
305 -------------------------------------------------------------------------------
306 procedure Post (Men : in Menu;
307 Post : in Boolean := True)
309 function M_Post (Men : Menu) return C_Int;
310 pragma Import (C, M_Post, "post_menu");
311 function M_Unpost (Men : Menu) return C_Int;
312 pragma Import (C, M_Unpost, "unpost_menu");
319 Res := M_Unpost (Men);
325 -------------------------------------------------------------------------------
326 procedure Normalize_Menu_Options (Options : in out C_Int);
327 pragma Import (C, Normalize_Menu_Options, "_nc_ada_normalize_menu_opts");
329 procedure Set_Options (Men : in Menu;
330 Options : in Menu_Option_Set)
332 function Set_Menu_Opts (Men : Menu;
333 Opt : C_Int) return C_Int;
334 pragma Import (C, Set_Menu_Opts, "set_menu_opts");
336 Opt : C_Int := MOS_2_CInt (Options);
339 Normalize_Menu_Options (Opt);
340 Res := Set_Menu_Opts (Men, Opt);
346 procedure Switch_Options (Men : in Menu;
347 Options : in Menu_Option_Set;
348 On : in Boolean := True)
350 function Menu_Opts_On (Men : Menu;
351 Opt : C_Int) return C_Int;
352 pragma Import (C, Menu_Opts_On, "menu_opts_on");
353 function Menu_Opts_Off (Men : Menu;
354 Opt : C_Int) return C_Int;
355 pragma Import (C, Menu_Opts_Off, "menu_opts_off");
357 Opt : C_Int := MOS_2_CInt (Options);
360 Normalize_Menu_Options (Opt);
362 Err := Menu_Opts_On (Men, Opt);
364 Err := Menu_Opts_Off (Men, Opt);
371 procedure Get_Options (Men : in Menu;
372 Options : out Menu_Option_Set)
374 function Menu_Opts (Men : Menu) return C_Int;
375 pragma Import (C, Menu_Opts, "menu_opts");
377 Res : C_Int := Menu_Opts (Men);
379 Normalize_Menu_Options (Res);
380 Options := CInt_2_MOS (Res);
383 function Get_Options (Men : Menu := Null_Menu) return Menu_Option_Set
385 Mos : Menu_Option_Set;
387 Get_Options (Men, Mos);
390 -------------------------------------------------------------------------------
391 procedure Set_Window (Men : in Menu;
394 function Set_Menu_Win (Men : Menu;
395 Win : Window) return C_Int;
396 pragma Import (C, Set_Menu_Win, "set_menu_win");
398 Res : constant Eti_Error := Set_Menu_Win (Men, Win);
405 function Get_Window (Men : Menu) return Window
407 function Menu_Win (Men : Menu) return Window;
408 pragma Import (C, Menu_Win, "menu_win");
410 W : constant Window := Menu_Win (Men);
415 procedure Set_Sub_Window (Men : in Menu;
418 function Set_Menu_Sub (Men : Menu;
419 Win : Window) return C_Int;
420 pragma Import (C, Set_Menu_Sub, "set_menu_sub");
422 Res : constant Eti_Error := Set_Menu_Sub (Men, Win);
429 function Get_Sub_Window (Men : Menu) return Window
431 function Menu_Sub (Men : Menu) return Window;
432 pragma Import (C, Menu_Sub, "menu_sub");
434 W : constant Window := Menu_Sub (Men);
439 procedure Scale (Men : in Menu;
440 Lines : out Line_Count;
441 Columns : out Column_Count)
443 type C_Int_Access is access all C_Int;
444 function M_Scale (Men : Menu;
445 Yp, Xp : C_Int_Access) return C_Int;
446 pragma Import (C, M_Scale, "scale_menu");
448 X, Y : aliased C_Int;
449 Res : constant Eti_Error := M_Scale (Men, Y'Access, X'Access);
454 Lines := Line_Count (Y);
455 Columns := Column_Count (X);
457 -------------------------------------------------------------------------------
458 procedure Position_Cursor (Men : Menu)
460 function Pos_Menu_Cursor (Men : Menu) return C_Int;
461 pragma Import (C, Pos_Menu_Cursor, "pos_menu_cursor");
463 Res : constant Eti_Error := Pos_Menu_Cursor (Men);
470 -------------------------------------------------------------------------------
471 procedure Set_Mark (Men : in Menu;
474 type Char_Ptr is access all Interfaces.C.Char;
475 function Set_Mark (Men : Menu;
476 Mark : Char_Ptr) return C_Int;
477 pragma Import (C, Set_Mark, "set_menu_mark");
479 Txt : char_array (0 .. Mark'Length);
483 To_C (Mark, Txt, Len);
484 Res := Set_Mark (Men, Txt (Txt'First)'Access);
490 procedure Mark (Men : in Menu;
493 function Get_Menu_Mark (Men : Menu) return chars_ptr;
494 pragma Import (C, Get_Menu_Mark, "menu_mark");
496 Fill_String (Get_Menu_Mark (Men), Mark);
499 -------------------------------------------------------------------------------
500 procedure Set_Foreground
502 Fore : in Character_Attribute_Set := Normal_Video;
503 Color : in Color_Pair := Color_Pair'First)
505 function Set_Menu_Fore (Men : Menu;
506 Attr : C_Int) return C_Int;
507 pragma Import (C, Set_Menu_Fore, "set_menu_fore");
509 Ch : constant Attributed_Character := (Ch => Character'First,
512 Res : constant Eti_Error := Set_Menu_Fore (Men, Chtype_To_CInt (Ch));
519 procedure Foreground (Men : in Menu;
520 Fore : out Character_Attribute_Set)
522 function Menu_Fore (Men : Menu) return C_Int;
523 pragma Import (C, Menu_Fore, "menu_fore");
525 Fore := CInt_To_Chtype (Menu_Fore (Men)).Attr;
528 procedure Foreground (Men : in Menu;
529 Fore : out Character_Attribute_Set;
530 Color : out Color_Pair)
532 function Menu_Fore (Men : Menu) return C_Int;
533 pragma Import (C, Menu_Fore, "menu_fore");
535 Fore := CInt_To_Chtype (Menu_Fore (Men)).Attr;
536 Color := CInt_To_Chtype (Menu_Fore (Men)).Color;
539 procedure Set_Background
541 Back : in Character_Attribute_Set := Normal_Video;
542 Color : in Color_Pair := Color_Pair'First)
544 function Set_Menu_Back (Men : Menu;
545 Attr : C_Int) return C_Int;
546 pragma Import (C, Set_Menu_Back, "set_menu_back");
548 Ch : constant Attributed_Character := (Ch => Character'First,
551 Res : constant Eti_Error := Set_Menu_Back (Men, Chtype_To_CInt (Ch));
558 procedure Background (Men : in Menu;
559 Back : out Character_Attribute_Set)
561 function Menu_Back (Men : Menu) return C_Int;
562 pragma Import (C, Menu_Back, "menu_back");
564 Back := CInt_To_Chtype (Menu_Back (Men)).Attr;
567 procedure Background (Men : in Menu;
568 Back : out Character_Attribute_Set;
569 Color : out Color_Pair)
571 function Menu_Back (Men : Menu) return C_Int;
572 pragma Import (C, Menu_Back, "menu_back");
574 Back := CInt_To_Chtype (Menu_Back (Men)).Attr;
575 Color := CInt_To_Chtype (Menu_Back (Men)).Color;
578 procedure Set_Grey (Men : in Menu;
579 Grey : in Character_Attribute_Set := Normal_Video;
580 Color : in Color_Pair := Color_Pair'First)
582 function Set_Menu_Grey (Men : Menu;
583 Attr : C_Int) return C_Int;
584 pragma Import (C, Set_Menu_Grey, "set_menu_grey");
586 Ch : constant Attributed_Character := (Ch => Character'First,
590 Res : constant Eti_Error := Set_Menu_Grey (Men, Chtype_To_CInt (Ch));
597 procedure Grey (Men : in Menu;
598 Grey : out Character_Attribute_Set)
600 function Menu_Grey (Men : Menu) return C_Int;
601 pragma Import (C, Menu_Grey, "menu_grey");
603 Grey := CInt_To_Chtype (Menu_Grey (Men)).Attr;
606 procedure Grey (Men : in Menu;
607 Grey : out Character_Attribute_Set;
608 Color : out Color_Pair)
610 function Menu_Grey (Men : Menu) return C_Int;
611 pragma Import (C, Menu_Grey, "menu_grey");
613 Grey := CInt_To_Chtype (Menu_Grey (Men)).Attr;
614 Color := CInt_To_Chtype (Menu_Grey (Men)).Color;
617 procedure Set_Pad_Character (Men : in Menu;
618 Pad : in Character := Space)
620 function Set_Menu_Pad (Men : Menu;
621 Ch : C_Int) return C_Int;
622 pragma Import (C, Set_Menu_Pad, "set_menu_pad");
624 Res : constant Eti_Error := Set_Menu_Pad (Men,
625 C_Int (Character'Pos (Pad)));
630 end Set_Pad_Character;
632 procedure Pad_Character (Men : in Menu;
635 function Menu_Pad (Men : Menu) return C_Int;
636 pragma Import (C, Menu_Pad, "menu_pad");
638 Pad := Character'Val (Menu_Pad (Men));
640 -------------------------------------------------------------------------------
641 procedure Set_Spacing (Men : in Menu;
642 Descr : in Column_Position := 0;
643 Row : in Line_Position := 0;
644 Col : in Column_Position := 0)
646 function Set_Spacing (Men : Menu;
647 D, R, C : C_Int) return C_Int;
648 pragma Import (C, Set_Spacing, "set_menu_spacing");
650 Res : constant Eti_Error := Set_Spacing (Men,
660 procedure Spacing (Men : in Menu;
661 Descr : out Column_Position;
662 Row : out Line_Position;
663 Col : out Column_Position)
665 type C_Int_Access is access all C_Int;
666 function Get_Spacing (Men : Menu;
667 D, R, C : C_Int_Access) return C_Int;
668 pragma Import (C, Get_Spacing, "menu_spacing");
670 D, R, C : aliased C_Int;
671 Res : constant Eti_Error := Get_Spacing (Men,
679 Descr := Column_Position (D);
680 Row := Line_Position (R);
681 Col := Column_Position (C);
684 -------------------------------------------------------------------------------
685 function Set_Pattern (Men : Menu;
686 Text : String) return Boolean
688 type Char_Ptr is access all Interfaces.C.Char;
689 function Set_Pattern (Men : Menu;
690 Pattern : Char_Ptr) return C_Int;
691 pragma Import (C, Set_Pattern, "set_menu_pattern");
693 S : char_array (0 .. Text'Length);
698 Res := Set_Pattern (Men, S (S'First)'Access);
700 when E_No_Match => return False;
701 when E_Ok => return True;
708 procedure Pattern (Men : in Menu;
711 function Get_Pattern (Men : Menu) return chars_ptr;
712 pragma Import (C, Get_Pattern, "menu_pattern");
714 Fill_String (Get_Pattern (Men), Text);
716 -------------------------------------------------------------------------------
717 procedure Set_Format (Men : in Menu;
718 Lines : in Line_Count;
719 Columns : in Column_Count)
721 function Set_Menu_Fmt (Men : Menu;
723 Col : C_Int) return C_Int;
724 pragma Import (C, Set_Menu_Fmt, "set_menu_format");
726 Res : constant Eti_Error := Set_Menu_Fmt (Men,
735 procedure Format (Men : in Menu;
736 Lines : out Line_Count;
737 Columns : out Column_Count)
739 type C_Int_Access is access all C_Int;
740 function Menu_Fmt (Men : Menu;
741 Y, X : C_Int_Access) return C_Int;
742 pragma Import (C, Menu_Fmt, "menu_format");
744 L, C : aliased C_Int;
745 Res : constant Eti_Error := Menu_Fmt (Men, L'Access, C'Access);
750 Lines := Line_Count (L);
751 Columns := Column_Count (C);
754 -------------------------------------------------------------------------------
755 procedure Set_Item_Init_Hook (Men : in Menu;
756 Proc : in Menu_Hook_Function)
758 function Set_Item_Init (Men : Menu;
759 Proc : Menu_Hook_Function) return C_Int;
760 pragma Import (C, Set_Item_Init, "set_item_init");
762 Res : constant Eti_Error := Set_Item_Init (Men, Proc);
767 end Set_Item_Init_Hook;
769 procedure Set_Item_Term_Hook (Men : in Menu;
770 Proc : in Menu_Hook_Function)
772 function Set_Item_Term (Men : Menu;
773 Proc : Menu_Hook_Function) return C_Int;
774 pragma Import (C, Set_Item_Term, "set_item_term");
776 Res : constant Eti_Error := Set_Item_Term (Men, Proc);
781 end Set_Item_Term_Hook;
783 procedure Set_Menu_Init_Hook (Men : in Menu;
784 Proc : in Menu_Hook_Function)
786 function Set_Menu_Init (Men : Menu;
787 Proc : Menu_Hook_Function) return C_Int;
788 pragma Import (C, Set_Menu_Init, "set_menu_init");
790 Res : constant Eti_Error := Set_Menu_Init (Men, Proc);
795 end Set_Menu_Init_Hook;
797 procedure Set_Menu_Term_Hook (Men : in Menu;
798 Proc : in Menu_Hook_Function)
800 function Set_Menu_Term (Men : Menu;
801 Proc : Menu_Hook_Function) return C_Int;
802 pragma Import (C, Set_Menu_Term, "set_menu_term");
804 Res : constant Eti_Error := Set_Menu_Term (Men, Proc);
809 end Set_Menu_Term_Hook;
811 function Get_Item_Init_Hook (Men : Menu) return Menu_Hook_Function
813 function Item_Init (Men : Menu) return Menu_Hook_Function;
814 pragma Import (C, Item_Init, "item_init");
816 return Item_Init (Men);
817 end Get_Item_Init_Hook;
819 function Get_Item_Term_Hook (Men : Menu) return Menu_Hook_Function
821 function Item_Term (Men : Menu) return Menu_Hook_Function;
822 pragma Import (C, Item_Term, "item_term");
824 return Item_Term (Men);
825 end Get_Item_Term_Hook;
827 function Get_Menu_Init_Hook (Men : Menu) return Menu_Hook_Function
829 function Menu_Init (Men : Menu) return Menu_Hook_Function;
830 pragma Import (C, Menu_Init, "menu_init");
832 return Menu_Init (Men);
833 end Get_Menu_Init_Hook;
835 function Get_Menu_Term_Hook (Men : Menu) return Menu_Hook_Function
837 function Menu_Term (Men : Menu) return Menu_Hook_Function;
838 pragma Import (C, Menu_Term, "menu_term");
840 return Menu_Term (Men);
841 end Get_Menu_Term_Hook;
842 -------------------------------------------------------------------------------
843 -- This is a bit delicate if we want to manipulate an Ada created menu
844 -- from C routines or vice versa.
845 -- In Ada created menus we use the low level user pointer to maintain
846 -- binding internal additional informations about the menu. This
847 -- internal information contains a hook for the Ada provided user pointer.
848 -- Unless you understand this implementation, the safest way in mixed
849 -- language programs to deal with user pointers is, that only the language
850 -- that created the menu should also manipulate the user pointer for that
852 procedure Redefine (Men : in Menu;
853 Items : in Item_Array)
855 function Set_Items (Men : Menu;
856 Items : Item_Array_Access) return C_Int;
857 pragma Import (C, Set_Items, "set_menu_items");
859 function Menu_Userptr (Men : Menu) return Ada_User_Wrapper_Access;
860 pragma Import (C, Menu_Userptr, "menu_userptr");
862 U : Ada_User_Wrapper_Access := Menu_Userptr (Men);
863 I : Item_Array_Access;
866 if U = null or else U.I = null then raise Menu_Exception;
868 -- create internally an array of items that contains an
869 -- additional place for the terminating null item.
870 I := new Item_Array (1 .. (Items'Length + 1));
871 I.all (1 .. Items'Length) := Items (Items'First .. Items'Last);
872 I.all (Items'Length + 1) := Null_Item;
873 Res := Set_Items (Men, I);
875 Free_Allocated_Items (I);
878 Free_Allocated_Items (U.I);
884 function Item_Count (Men : Menu) return Natural
886 function Count (Men : Menu) return C_Int;
887 pragma Import (C, Count, "item_count");
889 return Natural (Count (Men));
892 function Items (Men : Menu) return Item_Array_Access
894 function M_Items (Men : Menu) return Item_Array_Access;
895 pragma Import (C, M_Items, "menu_items");
897 return M_Items (Men);
900 -------------------------------------------------------------------------------
901 function Create (Items : Item_Array) return Menu
903 function Newmenu (Items : Item_Array_Access) return Menu;
904 pragma Import (C, Newmenu, "new_menu");
906 function Set_Menu_Userptr (Men : Menu;
907 Addr : Ada_User_Wrapper_Access) return C_Int;
908 pragma Import (C, Set_Menu_Userptr, "set_menu_userptr");
911 I : Item_Array_Access;
912 U : Ada_User_Wrapper_Access;
915 I := new Item_Array (1 .. (Items'Length + 1));
916 I.all (1 .. Items'Length) := Items (Items'First .. Items'Last);
917 I.all (Items'Length + 1) := Null_Item;
919 if M = Null_Menu then
920 Free_Allocated_Items (I);
921 raise Menu_Exception;
923 U := new Ada_User_Wrapper' (System.Null_Address, I);
924 Res := Set_Menu_Userptr (M, U);
926 Free_Allocated_Items (I);
927 Free_User_Wrapper (U);
933 procedure Delete (Men : in out Menu)
935 function Free (Men : Menu) return C_Int;
936 pragma Import (C, Free, "free_menu");
937 function Menu_Userptr (Men : Menu) return Ada_User_Wrapper_Access;
938 pragma Import (C, Menu_Userptr, "menu_userptr");
940 U : Ada_User_Wrapper_Access := Menu_Userptr (Men);
941 Res : constant Eti_Error := Free (Men);
946 if U = null or else U.I = null then
947 raise Menu_Exception;
949 Free_Allocated_Items (U.I);
950 Free_User_Wrapper (U);
954 ------------------------------------------------------------------------------
955 function Driver (Men : Menu;
956 Key : Key_Code) return Driver_Result
958 function Driver (Men : Menu;
959 Key : C_Int) return C_Int;
960 pragma Import (C, Driver, "menu_driver");
962 R : Eti_Error := Driver (Men, C_Int (Key));
966 when E_Unknown_Command => return Unknown_Request;
967 when E_No_Match => return No_Match;
968 when E_Request_Denied |
969 E_Not_Selectable => return Request_Denied;
976 -------------------------------------------------------------------------------
978 if Generation_Bit_Order /= System.Default_Bit_Order then
979 raise Constraint_Error;
982 Default_Menu_Options := Get_Options (Null_Menu);
983 Default_Item_Options := Get_Options (Null_Item);
984 end Terminal_Interface.Curses.Menus;