ncurses
In this chapter we describe the usage of some example applications of the ncurses
interface provided by the Browse package. They may be of interest by themselves, or they may be used as utility functions within larger applications.
ncurses
utilitiesIf you call the functions NCurses.Alert
(3.1-1), NCurses.Select
(3.1-2), NCurses.GetLineFromUser
(3.1-3), or NCurses.Pager
(3.1-4) from another ncurses
application in visual mode, you should refresh the windows that are still open, by calling NCurses.update_panels
and NCurses.doupdate
afterwards, see Section 2.1-3 and 2.1-2. Also, if the cursor shall be hidden after that, you should call curs_set
with argument 0
, see Section 2.1-1, since the cursor is automatically made visible in NCurses.endwin
.
‣ NCurses.Alert ( messages, timeout[, attrs] ) | ( function ) |
Returns: the integer corresponding to the character entered, or fail
.
In visual mode, Print
(Reference: Print) cannot be used for messages. An alternative is given by NCurses.Alert
.
Let messages be either an attribute line or a nonempty list of attribute lines, and timeout be a nonnegative integer. NCurses.Alert
shows messages in a bordered box in the middle of the screen.
If timeout is zero then the box is closed after any user input, and the integer corresponding to the entered key is returned. If timeout is a positive number n, say, then the box is closed after n milliseconds, and fail
is returned.
If timeout
is zero and mouse events are enabled (see NCurses.UseMouse
(2.2-10)) then the box can be moved inside the window via mouse events.
If the optional argument attrs is given, it must be an integer representing attributes such as the components of NCurses.attrs
(see Section 2.1-7) or the return value of NCurses.ColorAttr
(2.2-1); these attributes are used for the border of the box. The default is NCurses.attrs.NORMAL
.
gap> NCurses.Alert( "Hello world!", 1000 ); fail gap> NCurses.Alert( [ "Hello world!", > [ "Hello ", NCurses.attrs.BOLD, "bold!" ] ], 1500, > NCurses.ColorAttr( "red", -1 ) + NCurses.attrs.BOLD ); fail
‣ NCurses.Select ( poss[, single[, none]] ) | ( function ) |
Returns: Position or list of positions, or false
.
This function allows the user to select one or several items from a given list. In the simplest case poss is a list of attribute lines (see NCurses.IsAttributeLine
(2.2-3)), each of which should fit on one line. Then NCurses.Select
displays these lines and lets the user browse through them. After pressing the Return key the index of the highlighted item is returned. Note that attributes in your lines should be switched on and off separately by true
/false
entries such that the lines can be nicely highlighted.
The optional argument single must be true
(default) or false
. In the second case, an arbitrary number of items can be marked and the function returns the list of their indices.
If single is true
a third argument none can be given. If it is true
then it is possible to leave the selection without choosing an item, in this case false
is returned.
More details can be given to the function by giving a record as argument poss. It can have the following components:
items
The list of attribute lines as described above.
single
Boolean with the same meaning as the optional argument single.
none
Boolean with the same meaning as the optional argument none.
size
The size of the window like the first two arguments of NCurses.newwin
(default is [0, 0]
, as big as possible), or the string "fit"
which means the smallest possible window.
align
A substring of "bclt"
, which describes the alignment of the window in the terminal. The meaning and the default are the same as for BrowseData.IsBrowseTableCellData
(4.2-1).
begin
Top-left corner of the window like the last two arguments of NCurses.newwin
(default is [0, 0]
, top-left of the screen). This value has priority over the align
component.
attribute
An attribute used for the display of the window (default is NCurses.attrs.NORMAL
).
border
If the window should be displayed with a border then set to true
(default is false
) or to an integer representing attributes such as the components of NCurses.attrs
(see Section 2.1-7) or the return value of NCurses.ColorAttr
(2.2-1); these attributes are used for the border of the box. The default is NCurses.attrs.NORMAL
.
header
An attribute line used as header line (the default depends on the settings of single
and none
).
hint
An attribute line used as hint in the last line of the window (the default depends on the settings of single
and none
).
onSubmitFunction
A function that is called when the user submits the selection; the argument for this call is the current value of the record poss. If the function returns true
then the selected entries are returned as usual, otherwise the selection window is kept open, waiting for new inputs; if the function returns a nonempty list of attribute lines then these messages are shown using NCurses.Alert
(3.1-1).
If mouse events are enabled (see NCurses.UseMouse
(2.2-10)) then the window can be moved on the screen via mouse events, the focus can be moved to an entry, and (if single
is false
) the selection of an entry can be toggled.
gap> index := NCurses.Select(["Apples", "Pears", "Oranges"]); gap> index := NCurses.Select(rec( > items := ["Apples", "Pears", "Oranges"], > single := false, > border := true, > begin := [5, 5], > size := [8, 60], > header := "Choose at least two fruits", > attribute := NCurses.ColorAttr("yellow","red"), > onSubmitFunction:= function( r ) > if Length( r.RESULT ) < 2 then > return [ "Choose at least two fruits" ]; > else > return true; > fi; > end ) );
‣ NCurses.GetLineFromUser ( pre ) | ( function ) |
Returns: User input as string.
This function can be used to get an input string from the user. It opens a one line window and writes the given string pre into it. Then it waits for user input. After hitting the Return key the typed line is returned as a string to GAP. If the user exits via hitting the Esc key instead of hitting the Return key, the function returns false
. (The Esc key may be recognized as input only after a delay of about a second.)
Some simple editing is possible during user input: The Left, Right, Home and End keys, the Insert/Replace keys, and the Backspace/Delete keys are supported.
Instead of a string, pre can also be a record with the component prefix
, whose value is the string described above. The following optional components of this record are supported.
window
The window with the input field is created relative to this window, the default is 0.
begin
This is a list with the coordinates of the upper left corner of the window with the input field, relative to the window described by the window
component; the default is [ y-4, 2 ]
, where y
is the height of this window.
default
This string appears as result when the window is opened, the default is an empty string.
gap> str := NCurses.GetLineFromUser("Your Name: ");; gap> Print("Hello ", str, "!\n");
‣ NCurses.Pager ( lines[, border[, ly, lx, y, x]] ) | ( function ) |
This is a simple pager utility for displaying and scrolling text. The argument lines can be a list of attribute lines (see NCurses.IsAttributeLine
(2.2-3)) or a string (the lines are separated by newline characters) or a record. In case of a record the following components are recognized:
lines
The list of attribute lines or a string as described above.
start
Line number to start the display.
size
The size [ly, lx]
of the window like the first two arguments of NCurses.newwin
(default is [0, 0]
, as big as possible).
begin
Top-left corner [y, x]
of the window like the last two arguments of NCurses.newwin
(default is [0, 0]
, top-left of the screen).
attribute
An attribute used for the display of the window (default is NCurses.attrs.NORMAL
).
border
Either one of true
/false
to show the pager window with or without a standard border. Or it can be string with eight, two or one characters, giving characters to be used for a border, see NCurses.WBorder
(2.2-9).
hint
A text for usage info in the last line of the window.
As an abbreviation the information from border
, size
and begin
can also be specified in optional arguments.
gap> lines := List([1..100],i-> ["line ",NCurses.attrs.BOLD,String(i)]);; gap> NCurses.Pager(lines);
After loading the Browse package GAP's help system behaves slightly different when a request yields several matches. The matches are shown via NCurses.Select
(3.1-2), the list can be searched and filtered, and one can choose one match for immediate display. It is possible to not choose a match and the ?<nr>
syntax still works.
If you want the original behavior call SetUserPreference( "Browse", "SelectHelpMatches", false );
in your GAP session or gap.ini
file, see Reference: Configuring User preferences.
The function LoadPackage
(Reference: LoadPackage) shows a list of matches if only a prefix of a package name is given. After loading the Browse package, NCurses.Select
(3.1-2) is used for that, and one can choose a match.
If you want the original behavior call SetUserPreference( "Browse", "SelectPackageName", false );
in your GAP session or gap.ini
file, see Reference: Configuring User preferences.
‣ NCurses.Demo ( [inputs] ) | ( function ) |
Let inputs be a list of records, each with the components title
(a string), inputblocks
(a list of strings, each describing some GAP statements), and optionally footer
(a string) and cleanup
(a string describing GAP statements). The default is NCurses.DemoDefaults
.
NCurses.Demo
lets the user choose an entry from inputs, via NCurses.Select
(3.1-2), and then executes the GAP statements in the first entry of the inputblocks
list of this entry; these strings, together with the values of title
and footer
, are shown in a window, at the bottom of the screen. The effects of calls to functions using ncurses
are shown in the rest of the screen. After the execution of the statements (which may require user input), the user can continue with the next entry of inputblocks
, or return to the inputs
selection (and thus cancel the current inputs
entry), or return to the execution of the beginning of the current inputs
entry. At the end of the current entry of inputs
, the user returns to the inputs
selection.
The GAP statements in the cleanup
component, if available, are executed whenever the user does not continue; this is needed for deleting panels and windows that are defined in the statements of the current entry.
Note that the GAP statements are executed in the global scope, that is, they have the same effect as if they would be entered at the GAP prompt. Initially, NCurses.Demo
sets the value of BrowseData.defaults.work.windowParameters
to the parameters that describe the part of the screen above the window that shows the inputs; so applications of NCurses.BrowseGeneric
(4.3-1) use automatically the maximal part of the screen as their window. It is recommended to use a screen with at least 80 columns and at least 37 rows.
generated by GAPDoc2HTML