menu.pp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. {$MODE OBJFPC}
  2. {$IFNDEF FPC_DOTTEDUNITS}
  3. unit menu;
  4. {$ENDIF FPC_DOTTEDUNITS}
  5. interface
  6. {$IFDEF FPC_DOTTEDUNITS}
  7. uses
  8. Api.Ncurses;
  9. {$ELSE FPC_DOTTEDUNITS}
  10. uses
  11. ncurses;
  12. {$ENDIF FPC_DOTTEDUNITS}
  13. {$LINKLIB menuw}
  14. {$PACKRECORDS C}
  15. {$INCLUDE eti.inc}
  16. const
  17. libmenu = 'menuw';
  18. type
  19. cuchar = Byte;
  20. Menu_Options = Longint;
  21. Item_Options = Longint;
  22. const
  23. // TEXT = TEXT_ncurses;
  24. { Menu options: }
  25. O_ONEVALUE = $01; { Only one item can be selected for this menu. }
  26. O_SHOWDESC = $02; { Display the item descriptions when the menu is posted. }
  27. O_ROWMAJOR = $04; { Display the menu in row-major order. }
  28. O_IGNORECASE = $08; { Ignore the case when pattern-matching. }
  29. O_SHOWMATCH = $10; { Move the cursor to within the item name while pattern-matching. }
  30. O_NONCYCLIC = $20; { Don't wrap around next-item and previous-item, requests to the other end of the menu. }
  31. { Item options: }
  32. O_SELECTABLE = $01;
  33. type
  34. TTEXT = record
  35. str : PAnsiChar;
  36. length : Word;
  37. end;
  38. ppITEM = ^pITEM;
  39. pITEM = ^tITEM;
  40. pMENU = ^tMENU;
  41. ppMENU = ^pMENU;
  42. tITEM = record
  43. name : TTEXT; { name of menu item }
  44. description : TTEXT; { description of item, optional in display }
  45. imenu : pMENU; { Pointer to parent menu }
  46. userptr : Pointer; { Pointer to user defined per item data }
  47. opt : Item_Options; { Item options }
  48. index : Smallint; { Item number if connected to a menu }
  49. y : Smallint; { y and x location of item in menu }
  50. x : Smallint;
  51. value : Bool; { Selection value }
  52. left : pITEM; { neighbor items }
  53. right : pITEM;
  54. up : pITEM;
  55. down : pITEM;
  56. end;
  57. tagITEM = tITEM;
  58. Menu_Hook = procedure (_para1:pMENU);cdecl;
  59. tMENU = record
  60. height : Smallint; { Nr. of chars high }
  61. width : Smallint; { Nr. of chars wide }
  62. rows : Smallint; { Nr. of items high }
  63. cols : Smallint; { Nr. of items wide }
  64. frows : Smallint; { Nr. of formatted items high }
  65. fcols : Smallint; { Nr. of formatted items wide }
  66. arows : Smallint; { Nr. of items high (actual) }
  67. namelen : Smallint; { Max. name length }
  68. desclen : Smallint; { Max. description length }
  69. marklen : Smallint; { Length of mark, if any }
  70. itemlen : Smallint; { Length of one item }
  71. spc_desc : Smallint; { Spacing for descriptor }
  72. spc_cols : Smallint; { Spacing for columns }
  73. spc_rows : Smallint; { Spacing for rows }
  74. pattern : PAnsiChar; { Buffer to store match chars }
  75. pindex : Smallint; { Index into pattern buffer }
  76. win : PWINDOW; { Window containing menu }
  77. sub : PWINDOW; { Subwindow for menu display }
  78. userwin : PWINDOW; { User's window }
  79. usersub : PWINDOW; { User's subwindow }
  80. items : ppITEM; { array of items }
  81. nitems : Smallint; { Nr. of items in menu }
  82. curitem : pITEM; { Current item }
  83. toprow : Smallint; { Top row of menu }
  84. fore : chtype; { Selection attribute }
  85. back : chtype; { Nonselection attribute }
  86. grey : chtype; { Inactive attribute }
  87. pad : cuchar; { Pad character }
  88. menuinit : Menu_Hook; { User hooks }
  89. menuterm : Menu_Hook;
  90. iteminit : Menu_Hook;
  91. itemterm : Menu_Hook;
  92. userptr : Pointer; { Pointer to menus user data }
  93. mark : PAnsiChar; { Pointer to marker string }
  94. opt : Menu_Options; { Menu options }
  95. status : Word; { Internal state of menu }
  96. end;
  97. tagMENU = tMENU;
  98. { Define keys }
  99. const
  100. REQ_LEFT_ITEM = KEY_MAX + 1;
  101. REQ_RIGHT_ITEM = KEY_MAX + 2;
  102. REQ_UP_ITEM = KEY_MAX + 3;
  103. REQ_DOWN_ITEM = KEY_MAX + 4;
  104. REQ_SCR_ULINE = KEY_MAX + 5;
  105. REQ_SCR_DLINE = KEY_MAX + 6;
  106. REQ_SCR_DPAGE = KEY_MAX + 7;
  107. REQ_SCR_UPAGE = KEY_MAX + 8;
  108. REQ_FIRST_ITEM = KEY_MAX + 9;
  109. REQ_LAST_ITEM = KEY_MAX + 10;
  110. REQ_NEXT_ITEM = KEY_MAX + 11;
  111. REQ_PREV_ITEM = KEY_MAX + 12;
  112. REQ_TOGGLE_ITEM = KEY_MAX + 13;
  113. REQ_CLEAR_PATTERN = KEY_MAX + 14;
  114. REQ_BACK_PATTERN = KEY_MAX + 15;
  115. REQ_NEXT_MATCH = KEY_MAX + 16;
  116. REQ_PREV_MATCH = KEY_MAX + 17;
  117. MIN_MENU_COMMAND = KEY_MAX + 1;
  118. MAX_MENU_COMMAND = KEY_MAX + 17;
  119. {
  120. * Some AT&T code expects MAX_COMMAND to be out-of-band not
  121. * just for menu commands but for forms ones as well.
  122. }
  123. { --------- prototypes for libmenu functions ----------------------------- }
  124. function menu_items(_para1:PMENU):ppITEM; cdecl;external libncurses;
  125. function current_item(_para1:PMENU):pITEM; cdecl;external libncurses;
  126. function new_item(_para1:PAnsiChar; _para2:PAnsiChar):pITEM; cdecl;external libncurses;
  127. function new_menu(_para1:PPITEM):pMENU; cdecl;external libncurses;
  128. function item_opts(_para1:PITEM):Item_Options; cdecl;external libncurses;
  129. function menu_opts(_para1:PMENU):Menu_Options; cdecl;external libncurses;
  130. function item_init(_para1:PMENU):Menu_Hook; cdecl;external libncurses;
  131. function item_term(_para1:PMENU):Menu_Hook; cdecl;external libncurses;
  132. function menu_init(_para1:PMENU):Menu_Hook; cdecl;external libncurses;
  133. function menu_term(_para1:PMENU):Menu_Hook; cdecl;external libncurses;
  134. function menu_sub(_para1:PMENU):PWINDOW; cdecl;external libncurses;
  135. function menu_win(_para1:PMENU):PWINDOW; cdecl;external libncurses;
  136. function item_description(_para1:PITEM):PAnsiChar; cdecl;external libncurses;
  137. function item_name(_para1:PITEM):PAnsiChar; cdecl;external libncurses;
  138. function menu_mark(_para1:PMENU):PAnsiChar; cdecl;external libncurses;
  139. function menu_request_name(_para1:Longint):PAnsiChar; cdecl;external libncurses;
  140. function menu_pattern(_para1:PMENU):PAnsiChar; cdecl;external libncurses;
  141. function menu_userptr(_para1:PMENU):Pointer; cdecl;external libncurses;
  142. function item_userptr(_para1:PITEM):Pointer; cdecl;external libncurses;
  143. function menu_back(_para1:PMENU):chtype; cdecl;external libncurses;
  144. function menu_fore(_para1:PMENU):chtype; cdecl;external libncurses;
  145. function menu_grey(_para1:PMENU):chtype; cdecl;external libncurses;
  146. function free_item(_para1:PITEM):Longint; cdecl;external libncurses;
  147. function free_menu(_para1:PMENU):Longint; cdecl;external libncurses;
  148. function item_count(_para1:PMENU):Longint; cdecl;external libncurses;
  149. function item_index(_para1:PITEM):Longint; cdecl;external libncurses;
  150. function item_opts_off(_para1:PITEM; _para2:Item_Options):Longint; cdecl;external libncurses;
  151. function item_opts_on(_para1:PITEM; _para2:Item_Options):Longint; cdecl;external libncurses;
  152. function menu_driver(_para1:PMENU; _para2:Longint):Longint; cdecl;external libncurses;
  153. function menu_opts_off(_para1:PMENU; _para2:Menu_Options):Longint; cdecl;external libncurses;
  154. function menu_opts_on(_para1:PMENU; _para2:Menu_Options):Longint; cdecl;external libncurses;
  155. function menu_pad(_para1:PMENU):Longint; cdecl;external libncurses;
  156. function pos_menu_cursor(_para1:PMENU):Longint; cdecl;external libncurses;
  157. function post_menu(_para1:PMENU):Longint; cdecl;external libncurses;
  158. function scale_menu(_para1:PMENU; _para2:PLongint; _para3:PLongint):Longint; cdecl;external libncurses;
  159. function set_current_item(menu:PMENU; item:PITEM):Longint; cdecl;external libncurses;
  160. //function set_item_init(_para1:PMENU; _para2:procedure (_para1:PMENU)):Longint; cdecl;external libncurses;
  161. function set_item_init(_para1:PMENU; _para2:Menu_Hook):Longint; cdecl;external libncurses;
  162. function set_item_opts(_para1:PITEM; _para2:Item_Options):Longint; cdecl;external libncurses;
  163. //function set_item_term(_para1:PMENU; _para2:procedure (_para1:PMENU)):Longint; cdecl;external libncurses;
  164. function set_item_term(_para1:PMENU; _para2:Menu_Hook):Longint; cdecl;external libncurses;
  165. function set_item_userptr(_para1:PITEM; _para2:Pointer):Longint; cdecl;external libncurses;
  166. function set_item_value(_para1:PITEM; _para2:Bool):Longint; cdecl;external libncurses;
  167. function set_menu_back(_para1:PMENU; _para2:chtype):Longint; cdecl;external libncurses;
  168. function set_menu_fore(_para1:PMENU; _para2:chtype):Longint; cdecl;external libncurses;
  169. function set_menu_format(_para1:PMENU; _para2:Longint; _para3:Longint):Longint; cdecl;external libncurses;
  170. function set_menu_grey(_para1:PMENU; _para2:chtype):Longint; cdecl;external libncurses;
  171. //function set_menu_init(_para1:PMENU; _para2:procedure (_para1:PMENU)):Longint; cdecl;external libncurses;
  172. function set_menu_init(_para1:PMENU; _para2:Menu_Hook):Longint; cdecl;external libncurses;
  173. function set_menu_items(_para1:PMENU; _para2:PPITEM):Longint; cdecl;external libncurses;
  174. function set_menu_mark(_para1:PMENU; _para2:PAnsiChar):Longint; cdecl;external libncurses;
  175. function set_menu_opts(_para1:PMENU; _para2:Menu_Options):Longint; cdecl;external libncurses;
  176. function set_menu_pad(_para1:PMENU; _para2:Longint):Longint; cdecl;external libncurses;
  177. function set_menu_pattern(_para1:PMENU; _para2:PAnsiChar):Longint; cdecl;external libncurses;
  178. function set_menu_sub(_para1:PMENU; _para2:PWINDOW):Longint; cdecl;external libncurses;
  179. //function set_menu_term(_para1:PMENU; _para2:procedure (_para1:PMENU)):Longint; cdecl;external libncurses;
  180. function set_menu_term(_para1:PMENU; _para2:Menu_Hook):Longint; cdecl;external libncurses;
  181. function set_menu_userptr(_para1:PMENU; _para2:Pointer):Longint; cdecl;external libncurses;
  182. function set_menu_win(_para1:PMENU; _para2:PWINDOW):Longint; cdecl;external libncurses;
  183. function set_top_row(_para1:PMENU; _para2:Longint):Longint; cdecl;external libncurses;
  184. function top_row(_para1:PMENU):Longint; cdecl;external libncurses;
  185. function unpost_menu(_para1:PMENU):Longint; cdecl;external libncurses;
  186. function menu_request_by_name(_para1:PAnsiChar):Longint; cdecl;external libncurses;
  187. function set_menu_spacing(_para1:PMENU; _para2:Longint; _para3:Longint; _para4:Longint):Longint; cdecl;external libncurses;
  188. function menu_spacing(_para1:PMENU; _para2:PLongint; _para3:PLongint; _para4:PLongint):Longint; cdecl;external libncurses;
  189. function item_value(_para1:PITEM):Bool; cdecl;external libncurses;
  190. function item_visible(_para1:PITEM):Bool; cdecl;external libncurses;
  191. procedure menu_format(_para1:PMENU; _para2:PLongint; _para3:PLongint); cdecl;external libncurses;
  192. implementation
  193. end.