mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-29 06:23:43 +02:00
349 lines
16 KiB
ObjectPascal
349 lines
16 KiB
ObjectPascal
unit menu;
|
|
{---------------------------------------------------------------------------
|
|
CncWare
|
|
----------------------------------------------------------------------------
|
|
Filename..: menu.pp
|
|
Programmer: Ken J. Wright
|
|
Date......: 07/12/2000
|
|
|
|
Purpose - Link to the Linux 'menu' library for ncurses menuing
|
|
functions.
|
|
|
|
-------------------------------< Revisions >---------------------------------
|
|
Revision| Date | Prog| Description
|
|
-----------------------------------------------------------------------------
|
|
1.00 | 07/12/00 | kjw | Initial release.
|
|
-----------------------------------------------------------------------------
|
|
}
|
|
{ Automatically converted by H2PAS.EXE from menu.h
|
|
Utility made by Florian Klaempfl 25th-28th september 96
|
|
Improvements made by Mark A. Malakanov 22nd-25th may 97
|
|
Further improvements by Michael Van Canneyt, April 1998
|
|
define handling and error recovery by Pierre Muller, June 1998 }
|
|
|
|
|
|
interface
|
|
|
|
{ C default packing is dword }
|
|
|
|
{$PACKRECORDS 4}
|
|
{
|
|
Copyright (c) 1998 Free Software Foundation, Inc.
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a
|
|
copy of this software and associated documentation files (the
|
|
"Software"), to deal in the Software without restriction, including
|
|
without limitation the rights to use, copy, modify, merge, publish,
|
|
distribute, distribute with modifications, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included
|
|
in all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
|
THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Except as contained in this notice, the name(s) of the above copyright
|
|
holders shall not be used in advertising or otherwise to promote the
|
|
sale, use or other dealings in this Software without prior written
|
|
authorization.
|
|
}
|
|
{
|
|
Author: Juergen Pfeifer <Juergen.Pfeifer@T-Online.de> 1995,1997
|
|
}
|
|
|
|
{$linklib menu}
|
|
|
|
uses ncurses;
|
|
|
|
{$include eti.inc}
|
|
|
|
type
|
|
Menu_Options = longint;
|
|
Item_Options = longint;
|
|
|
|
|
|
const
|
|
{ Menu options: }
|
|
O_ONEVALUE = $01;
|
|
O_SHOWDESC = $02;
|
|
O_ROWMAJOR = $04;
|
|
O_IGNORECASE = $08;
|
|
O_SHOWMATCH = $10;
|
|
O_NONCYCLIC = $20;
|
|
{ Item options: }
|
|
O_SELECTABLE = $01;
|
|
|
|
type
|
|
|
|
tTEXT = record
|
|
str : pchar;
|
|
length : word;
|
|
end;
|
|
|
|
tITEM = record
|
|
name : tTEXT; { name of menu item }
|
|
description : tTEXT; { description of item, optional in display }
|
|
imenu : ^tagMENU; { Pointer to parent menu }
|
|
userptr : pointer; { Pointer to user defined per item data }
|
|
opt : Item_Options; { Item options }
|
|
index : integer; { Item number if connected to a menu }
|
|
y : integer; { y and x location of item in menu }
|
|
x : integer;
|
|
value : bool; { Selection value }
|
|
left : ^tagITEM; { neighbour items }
|
|
right : ^tagITEM;
|
|
up : ^tagITEM;
|
|
down : ^tagITEM;
|
|
end;
|
|
|
|
pITEM = ^tITEM;
|
|
ppITEM = ^pITEM;
|
|
|
|
tagITEM = tITEM;
|
|
|
|
Menu_Hook = procedure;cdecl;
|
|
|
|
tMENU = record
|
|
height : integer; { Nr. of chars high }
|
|
width : integer; { Nr. of chars wide }
|
|
rows : integer; { Nr. of items high }
|
|
cols : integer; { Nr. of items wide }
|
|
frows : integer; { Nr. of formatted items high }
|
|
fcols : integer; { Nr. of formatted items wide }
|
|
arows : integer; { Nr. of items high (actual) }
|
|
namelen : integer; { Max. name length }
|
|
desclen : integer; { Max. description length }
|
|
marklen : integer; { Length of mark, if any }
|
|
itemlen : integer; { Length of one item }
|
|
spc_desc : integer; { Spacing for descriptor }
|
|
spc_cols : integer; { Spacing for columns }
|
|
spc_rows : integer; { Spacing for rows }
|
|
pattern : ^char; { Buffer to store match chars }
|
|
pindex : integer; { Index into pattern buffer }
|
|
win : ^WINDOW; { Window containing menu }
|
|
sub : ^WINDOW; { Subwindow for menu display }
|
|
userwin : ^WINDOW; { User's window }
|
|
usersub : ^WINDOW; { User's subwindow }
|
|
items : ^pITEM; { array of items }
|
|
nitems : integer; { Nr. of items in menu }
|
|
curitem : pITEM; { Current item }
|
|
toprow : integer; { Top row of menu }
|
|
fore : chtype; { Selection attribute }
|
|
back : chtype; { Nonselection attribute }
|
|
grey : chtype; { Inactive attribute }
|
|
pad : byte; { Pad character }
|
|
menuinit : Menu_Hook; { User hooks }
|
|
menuterm : Menu_Hook;
|
|
iteminit : Menu_Hook;
|
|
itemterm : Menu_Hook;
|
|
userptr : pointer; { Pointer to menus user data }
|
|
mark : pchar; { Pointer to marker string }
|
|
opt : Menu_Options; { Menu options }
|
|
status : word; { Internal state of menu }
|
|
end;
|
|
|
|
pMENU = ^tMENU;
|
|
ppMENU = ^pMENU;
|
|
|
|
tagMENU = tMENU;
|
|
|
|
const
|
|
{ Define keys }
|
|
REQ_LEFT_ITEM = KEY_MAX + 1;
|
|
REQ_RIGHT_ITEM = KEY_MAX + 2;
|
|
REQ_UP_ITEM = KEY_MAX + 3;
|
|
REQ_DOWN_ITEM = KEY_MAX + 4;
|
|
REQ_SCR_ULINE = KEY_MAX + 5;
|
|
REQ_SCR_DLINE = KEY_MAX + 6;
|
|
REQ_SCR_DPAGE = KEY_MAX + 7;
|
|
REQ_SCR_UPAGE = KEY_MAX + 8;
|
|
REQ_FIRST_ITEM = KEY_MAX + 9;
|
|
REQ_LAST_ITEM = KEY_MAX + 10;
|
|
REQ_NEXT_ITEM = KEY_MAX + 11;
|
|
REQ_PREV_ITEM = KEY_MAX + 12;
|
|
REQ_TOGGLE_ITEM = KEY_MAX + 13;
|
|
REQ_CLEAR_PATTERN = KEY_MAX + 14;
|
|
REQ_BACK_PATTERN = KEY_MAX + 15;
|
|
REQ_NEXT_MATCH = KEY_MAX + 16;
|
|
REQ_PREV_MATCH = KEY_MAX + 17;
|
|
MIN_MENU_COMMAND = KEY_MAX + 1;
|
|
MAX_MENU_COMMAND = KEY_MAX + 17;
|
|
{
|
|
Some AT&T code expects MAX_COMMAND to be out-of-band not
|
|
just for menu commands but for forms ones as well.
|
|
/
|
|
#if defined(MAX_COMMAND)
|
|
# if (MAX_MENU_COMMAND > MAX_COMMAND)
|
|
# error Something is wrong -- MAX_MENU_COMMAND is greater than MAX_COMMAND
|
|
# elif (MAX_COMMAND != (KEY_MAX + 128))
|
|
# error Something is wrong -- MAX_COMMAND is already inconsistently defined.
|
|
# endif
|
|
#else
|
|
# define MAX_COMMAND (KEY_MAX + 128)
|
|
#endif
|
|
}
|
|
{ --------- prototypes for libmenu functions ----------------------------- }
|
|
function menu_items(_para1:pMENU):ppITEM;cdecl;
|
|
function current_item(_para1:pMENU):pITEM;cdecl;
|
|
function new_item(_para1:pchar; _para2:pchar):pITEM;cdecl;
|
|
function new_menu(_para1:ppITEM):pMENU;cdecl;
|
|
function item_opts(_para1:pITEM):Item_Options;cdecl;
|
|
function menu_opts(_para1:pMENU):Menu_Options;cdecl;
|
|
(*
|
|
function item_init(_para1:pMENU):Menu_Hook;
|
|
function item_term(_para1:pMENU):Menu_Hook;
|
|
function menu_init(_para1:pMENU):Menu_Hook;
|
|
function menu_term(_para1:pMENU):Menu_Hook;
|
|
*)
|
|
function menu_sub(_para1:pMENU):pWINDOW;cdecl;
|
|
function menu_win(_para1:pMENU):pWINDOW;cdecl;
|
|
function item_description(_para1:pITEM):pchar;cdecl;
|
|
function item_name(_para1:pITEM):pchar;cdecl;
|
|
function menu_mark(_para1:pMENU):pchar;cdecl;
|
|
function menu_request_name(_para1:longint):pchar;cdecl;
|
|
function menu_pattern(_para1:pMENU):pchar;cdecl;
|
|
function menu_userptr(_para1:pMENU):pointer;cdecl;
|
|
function item_userptr(_para1:pITEM):pointer;cdecl;
|
|
function menu_back(_para1:pMENU):chtype;cdecl;
|
|
function menu_fore(_para1:pMENU):chtype;cdecl;
|
|
function menu_grey(_para1:pMENU):chtype;cdecl;
|
|
function free_item(_para1:pITEM):longint;cdecl;
|
|
function free_menu(_para1:pMENU):longint;cdecl;
|
|
function item_count(_para1:pMENU):longint;cdecl;
|
|
function item_index(_para1:pITEM):longint;cdecl;
|
|
function item_opts_off(_para1:pITEM; _para2:Item_Options):longint;cdecl;
|
|
function item_opts_on(_para1:pITEM; _para2:Item_Options):longint;cdecl;
|
|
function menu_driver(_para1:pMENU; _para2:longint):longint;cdecl;
|
|
function menu_opts_off(_para1:pMENU; _para2:Menu_Options):longint;cdecl;
|
|
function menu_opts_on(_para1:pMENU; _para2:Menu_Options):longint;cdecl;
|
|
function menu_pad(_para1:pMENU):longint;cdecl;
|
|
function pos_menu_cursor(_para1:pMENU):longint;cdecl;
|
|
function post_menu(_para1:pMENU):longint;cdecl;
|
|
function scale_menu(_para1:pMENU; _para2:plongint; _para3:plongint):longint;cdecl;
|
|
function set_current_item(menu:pMENU; item:pITEM):longint;cdecl;
|
|
{ function set_item_init(_para1:pMENU; _para2:Menu_Hook):longint;cdecl;}
|
|
function set_item_opts(_para1:pITEM; _para2:Item_Options):longint;cdecl;
|
|
{ function set_item_term(_para1:pMENU; _para2:Menu_Hook):longint;cdecl;}
|
|
function set_item_userptr(_para1:pITEM; _para2:pointer):longint;cdecl;
|
|
function set_item_value(_para1:pITEM; _para2:bool):longint;cdecl;
|
|
function set_menu_back(_para1:pMENU; _para2:chtype):longint;cdecl;
|
|
function set_menu_fore(_para1:pMENU; _para2:chtype):longint;cdecl;
|
|
function set_menu_format(_para1:pMENU; _para2:longint; _para3:longint):longint;cdecl;
|
|
function set_menu_grey(_para1:pMENU; _para2:chtype):longint;cdecl;
|
|
{ function set_menu_init(_para1:pMENU; _para2:Menu_Hook):longint;cdecl;}
|
|
function set_menu_items(_para1:pMENU; _para2:ppITEM):longint;cdecl;
|
|
function set_menu_mark(_para1:pMENU; _para2:pchar):longint;cdecl;
|
|
function set_menu_opts(_para1:pMENU; _para2:Menu_Options):longint;cdecl;
|
|
function set_menu_pad(_para1:pMENU; _para2:longint):longint;cdecl;
|
|
function set_menu_pattern(_para1:pMENU; _para2:pchar):longint;cdecl;
|
|
function set_menu_sub(_para1:pMENU; _para2:pWINDOW):longint;cdecl;
|
|
{ function set_menu_term(_para1:pMENU; _para2:Menu_Hook):longint;cdecl;}
|
|
function set_menu_userptr(_para1:pMENU; _para2:pointer):longint;cdecl;
|
|
function set_menu_win(_para1:pMENU; _para2:pWINDOW):longint;cdecl;
|
|
function set_top_row(_para1:pMENU; _para2:longint):longint;cdecl;
|
|
function top_row(_para1:pMENU):longint;cdecl;
|
|
function unpost_menu(_para1:pMENU):longint;cdecl;
|
|
function menu_request_by_name(_para1:pchar):longint;cdecl;
|
|
function set_menu_spacing(_para1:pMENU; _para2:longint; _para3:longint; _para4:longint):longint;cdecl;
|
|
function menu_spacing(_para1:pMENU; _para2:plongint; _para3:plongint; _para4:plongint):longint;cdecl;
|
|
function item_value(_para1:pITEM):bool;cdecl;
|
|
function item_visible(_para1:pITEM):bool;cdecl;
|
|
{ procedure menu_format(_para1:pMENU; _para2:plongint; _para3:plongint);}
|
|
|
|
implementation
|
|
|
|
{const External_library=''; Setup as you need!}
|
|
|
|
function menu_items(_para1:pMENU):ppITEM;cdecl;external;
|
|
function current_item(_para1:pMENU):pITEM;cdecl;external;
|
|
function new_item(_para1:pchar; _para2:pchar):pITEM;cdecl;external;
|
|
function new_menu(_para1:ppITEM):pMENU;cdecl;external;
|
|
function item_opts(_para1:pITEM):Item_Options;cdecl;external;
|
|
function menu_opts(_para1:pMENU):Menu_Options;cdecl;external;
|
|
(*
|
|
function item_init(_para1:pMENU):Menu_Hook;
|
|
begin
|
|
{ You must implemented this function }
|
|
end;
|
|
function item_term(_para1:pMENU):Menu_Hook;
|
|
begin
|
|
{ You must implemented this function }
|
|
end;
|
|
function menu_init(_para1:pMENU):Menu_Hook;
|
|
begin
|
|
{ You must implemented this function }
|
|
end;
|
|
function menu_term(_para1:pMENU):Menu_Hook;
|
|
begin
|
|
{ You must implemented this function }
|
|
end;
|
|
*)
|
|
function menu_sub(_para1:pMENU):pWINDOW;cdecl;external;
|
|
function menu_win(_para1:pMENU):pWINDOW;cdecl;external;
|
|
function item_description(_para1:pITEM):pchar;cdecl;external;
|
|
function item_name(_para1:pITEM):pchar;cdecl;external;
|
|
function menu_mark(_para1:pMENU):pchar;cdecl;external;
|
|
function menu_request_name(_para1:longint):pchar;cdecl;external;
|
|
function menu_pattern(_para1:pMENU):pchar;cdecl;external;
|
|
function menu_userptr(_para1:pMENU):pointer;cdecl;external;
|
|
function item_userptr(_para1:pITEM):pointer;cdecl;external;
|
|
function menu_back(_para1:pMENU):chtype;cdecl;external;
|
|
function menu_fore(_para1:pMENU):chtype;cdecl;external;
|
|
function menu_grey(_para1:pMENU):chtype;cdecl;external;
|
|
function free_item(_para1:pITEM):longint;cdecl;external;
|
|
function free_menu(_para1:pMENU):longint;cdecl;external;
|
|
function item_count(_para1:pMENU):longint;cdecl;external;
|
|
function item_index(_para1:pITEM):longint;cdecl;external;
|
|
function item_opts_off(_para1:pITEM; _para2:Item_Options):longint;cdecl;external;
|
|
function item_opts_on(_para1:pITEM; _para2:Item_Options):longint;cdecl;external;
|
|
function menu_driver(_para1:pMENU; _para2:longint):longint;cdecl;external;
|
|
function menu_opts_off(_para1:pMENU; _para2:Menu_Options):longint;cdecl;external;
|
|
function menu_opts_on(_para1:pMENU; _para2:Menu_Options):longint;cdecl;external;
|
|
function menu_pad(_para1:pMENU):longint;cdecl;external;
|
|
function pos_menu_cursor(_para1:pMENU):longint;cdecl;external;
|
|
function post_menu(_para1:pMENU):longint;cdecl;external;
|
|
function scale_menu(_para1:pMENU; _para2:plongint; _para3:plongint):longint;cdecl;external;
|
|
function set_current_item(menu:pMENU; item:pITEM):longint;cdecl;external;
|
|
{ function set_item_init(_para1:pMENU; _para2:Menu_Hook):longint;cdecl;external;}
|
|
function set_item_opts(_para1:pITEM; _para2:Item_Options):longint;cdecl;external;
|
|
{ function set_item_term(_para1:pMENU; _para2:Menu_Hook):longint;cdecl;external;}
|
|
function set_item_userptr(_para1:pITEM; _para2:pointer):longint;cdecl;external;
|
|
function set_item_value(_para1:pITEM; _para2:bool):longint;cdecl;external;
|
|
function set_menu_back(_para1:pMENU; _para2:chtype):longint;cdecl;external;
|
|
function set_menu_fore(_para1:pMENU; _para2:chtype):longint;cdecl;external;
|
|
function set_menu_format(_para1:pMENU; _para2:longint; _para3:longint):longint;cdecl;external;
|
|
function set_menu_grey(_para1:pMENU; _para2:chtype):longint;cdecl;external;
|
|
{ function set_menu_init(_para1:pMENU; _para2:Menu_Hook):longint;cdecl;external;}
|
|
function set_menu_items(_para1:pMENU; _para2:ppITEM):longint;cdecl;external;
|
|
function set_menu_mark(_para1:pMENU; _para2:pchar):longint;cdecl;external;
|
|
function set_menu_opts(_para1:pMENU; _para2:Menu_Options):longint;cdecl;external;
|
|
function set_menu_pad(_para1:pMENU; _para2:longint):longint;cdecl;external;
|
|
function set_menu_pattern(_para1:pMENU; _para2:pchar):longint;cdecl;external;
|
|
function set_menu_sub(_para1:pMENU; _para2:pWINDOW):longint;cdecl;external;
|
|
{ function set_menu_term(_para1:pMENU; _para2:Menu_Hook):longint;cdecl;external;}
|
|
function set_menu_userptr(_para1:pMENU; _para2:pointer):longint;cdecl;external;
|
|
function set_menu_win(_para1:pMENU; _para2:pWINDOW):longint;cdecl;external;
|
|
function set_top_row(_para1:pMENU; _para2:longint):longint;cdecl;external;
|
|
function top_row(_para1:pMENU):longint;cdecl;external;
|
|
function unpost_menu(_para1:pMENU):longint;cdecl;external;
|
|
function menu_request_by_name(_para1:pchar):longint;cdecl;external;
|
|
function set_menu_spacing(_para1:pMENU; _para2:longint; _para3:longint; _para4:longint):longint;cdecl;external;
|
|
function menu_spacing(_para1:pMENU; _para2:plongint; _para3:plongint; _para4:plongint):longint;cdecl;external;
|
|
function item_value(_para1:pITEM):bool;cdecl;external;
|
|
function item_visible(_para1:pITEM):bool;cdecl;external;
|
|
(*
|
|
procedure menu_format(_para1:pMENU; _para2:plongint; _para3:plongint);
|
|
begin
|
|
{ You must implemented this function }
|
|
end;
|
|
*)
|
|
begin
|
|
end.
|