+ Merged changes and additions from fixbranch

This commit is contained in:
michael 2000-08-29 05:51:09 +00:00
parent bec1c5cdf9
commit 558f3cd963
13 changed files with 2457 additions and 306 deletions

View File

@ -1,5 +1,5 @@
#
# Makefile generated by fpcmake v0.99.15 [2000/07/02]
# Makefile generated by fpcmake v1.00 [2000/07/11]
#
defaultrule: all
@ -184,8 +184,8 @@ endif
# Targets
override UNITOBJECTS+=ncurses panel ncrt ocrt
override EXAMPLEOBJECTS+=firework testn ocrt_demo edit_demo db_demo
override UNITOBJECTS+=ncurses panel ncrt ocrt menu
override EXAMPLEOBJECTS+=firework testn ocrt_demo edit_demo db_demo screen_demo
# Clean

View File

@ -3,8 +3,8 @@
#
[targets]
units=ncurses panel ncrt ocrt
examples=firework testn ocrt_demo edit_demo db_demo
units=ncurses panel ncrt ocrt menu
examples=firework testn ocrt_demo edit_demo db_demo screen_demo
[install]
examplesubdir=ncurses

View File

@ -133,25 +133,25 @@ Begin
Str(row:2,s);
FWrite((cols-10) div 2,rows-1,26,0,'Record #'+s);
With address[row] Do Begin
With fields[col] Do Begin
ec.Picture := pic;
Case col of
1 : s := FirstName;
2 : s := LastName;
3 : s := Street;
4 : s := Country;
5 : s := Zip;
6 : s := City;
End;
s := Edit(x,y,att2,x+wid-1,x+Length(s),s,ch);
If ch <> #27 Then
Case col of
1 : FirstName := s;
2 : LastName := s;
3 : Street := s;
4 : Country := s;
5 : Zip := s;
6 : City := s;
With fields[col] Do Begin
ec.Picture := pic;
Case col of
1 : s := FirstName;
2 : s := LastName;
3 : s := Street;
4 : s := Country;
5 : s := Zip;
6 : s := City;
End;
s := Edit(x,y,att2,x+wid-1,x+Length(s),s,ch);
If ch <> #27 Then
Case col of
1 : FirstName := s;
2 : LastName := s;
3 : Street := s;
4 : Country := s;
5 : Zip := s;
6 : City := s;
End;
FWrite(x,y,att1,x+wid-1,s);
Case Ord(ch) of
@ -173,7 +173,7 @@ Begin
nKeyF2 : UnBindArrows; { use arrows for editing }
nKeyF10 : IsDone := true;
End;
End;
End;
End;
If row > MAXROWS Then row := MAXROWS;
If row < 1 Then row := 1;
@ -188,7 +188,10 @@ Begin
End.
{
$Log$
Revision 1.3 2000-08-20 10:11:41 jonas
Revision 1.4 2000-08-29 05:51:09 michael
+ Merged changes and additions from fixbranch
Revision 1.3 2000/08/20 10:11:41 jonas
* added missing open comment at start of log section
Revision 1.2 2000/07/13 11:33:26 michael

View File

@ -7,7 +7,7 @@ Program Edit_Demo;
Programmer: Ken J. Wright, ken@cncware.com
Date......: 12/12/99
Purpose - Demonstrate the use of nCrt unit.
Purpose - Demonstrate the use of the oCrt unit.
-------------------------------<< REVISIONS >>--------------------------------
Ver | Date | Prog| Description
@ -16,22 +16,320 @@ Program Edit_Demo;
1.01 | 12/13/99 | kjw | Changed to use oCrt.
1.02 | 06/16/00 | kjw | Added help & goto line pop-up screens.
| Changes for control keys.
1.03 | 07/25/00 | kjw | Added use of new tnMenu object.
------------------------------------------------------------------------------
}
uses oCrt;
var
ss : array[1..25] of string[80];
xp,yp : string;
c : char;
win1,status : tnWindow;
idx : integer;
Finished : boolean;
const
MAXLINES = 52; { allow for long screens }
CURLINES : Integer = MAXLINES; { adjusted later }
FRAMED = true;
NOFRAME = false;
bg = 16; { background color multiplier }
type
{ doubly linked list of strings to edit }
pLine = ^tLine;
tLine = Record
s : ^string;
next,
prev : pLine;
End;
s80 = string[80];
var
hdr, { list head }
line, { current position in list }
line1 : pLine; { first list item of current page }
ss : array[1..MAXLINES] of s80; { a sliding screen buffer }
xp,yp : string; { x & y positions for the status line }
EdWin, { main edit window }
StatWin : tnWindow; { status line }
mnu0 : tnMenu; { main menu }
mnu1 : pnMenu; { dynamic menu for sub menus }
xi, { integer scratch pad }
cv, { edit character return value }
idx : integer; { current screen buffer row index }
cline, { current line number }
dlines : integer; { number of displayed lines }
lines : longint; { total number of lines in the list }
mactive, { is the menu active? }
Finished : boolean; { exit when finished }
tf : text; { the text file we are reading/writing }
fnam : string; { name of the current file, tf }
{ replace the old string with a new one }
Procedure ReallocateLine(var p : pLine; s : string);
Begin
If p = Nil Then Exit;
If p^.s^ <> s Then Begin
FreeMem(p^.s,Length(p^.s^)+1);
GetMem(p^.s,Length(s)+1);
p^.s^ := s;
End;
End;
{ insert a new pline into the edit list before p }
Procedure InsertLine(var p : pLine; s : string);
Var
tmp : pLine;
Begin
New(tmp);
GetMem(tmp^.s,Length(s)+1);
tmp^.s^ := s;
tmp^.prev := p^.prev;
tmp^.next := p;
p^.prev := tmp;
tmp^.prev^.next := tmp;
inc(lines);
End;
{ delete a pline from the edit list }
Procedure DeleteLine(var p : pLine);
Var
tmp : pLine;
Begin
FreeMem(p^.s,Length(p^.s^));
tmp := p^.next;
tmp^.prev := p^.prev;
p^.prev^.next := tmp;
Dispose(p);
p := tmp;
dec(lines);
If cline > lines Then cline := lines;
End;
{ return the minimum of two integer values }
Function Min(i1,i2 : integer) : integer;
Begin
If i1 < i2 Then
Min := i1
Else
Min := i2;
End;
{ fill the edit buffer starting with position h in the edit list }
Procedure LoadLines(var h : pLine);
Var
tmp : pLine;
i : integer;
Begin
FillChar(ss,SizeOf(ss),#0);
tmp := h;
If tmp = hdr Then tmp := tmp^.Next;
For i := 1 to CURLINES Do Begin
If (tmp <> Nil) and (tmp <> hdr) Then Begin
ss[i] := tmp^.s^;
tmp := tmp^.next;
dlines := i;
End;
End;
End;
{ display the edit buffer in the edit window }
Procedure DisplayLines;
Var
i : integer;
Begin
With EdWin Do Begin
For i := 1 to CURLINES Do Begin
FWrite(1,i,GetColor,Cols,ss[i]);
End;
End;
End;
{ free the entire edit list }
Procedure ClearLines(var h : pLine);
Var
tmp : pLine;
Begin
If h <> Nil Then Begin
tmp := h^.prev;
If (tmp <> h) and (tmp^.s <> Nil) Then Begin
FreeMem(tmp^.s,Length(tmp^.s^)+1);
tmp^.next := h;
Dispose(tmp);
End;
End;
New(h);
h^.next := h;
h^.prev := h;
h^.s := nil;
End;
Function PromptFile(hs : string; var s : string) : integer;
Var
win : pnWindow;
ret : integer;
Begin
New(win,Init(1,1,EdWin.Cols,3,cyan*bg,FRAMED,cyan*bg+white));
With win^ Do Begin
PutHeader(hs,GetFrameColor,center);
FWrite(2,1,GetColor,0,'Filename: ');
Align(center,center);
Show;
s := Edit(12,1,GetColor+white,Cols,12,fnam,ret);
PromptFile := ret;
Hide;
End;
Dispose(win,Done);
End;
{ prompt for, and open a text file }
Function OpenFile(var f : text; prompt : boolean) : boolean;
Var
s : string;
tst : text;
ret : integer;
Begin
If prompt Then
ret := PromptFile('Open File',s)
Else Begin
s := fnam;
ret := nkEnter;
End;
If ret = nkEnter Then Begin
Assign(tst,s);
{$I-}
Reset(tst);
{$I+}
If IoResult = 0 Then Begin
Close(tst);
Assign(f,s);
Reset(f);
OpenFile := true;
fnam := s;
End Else Begin
nShowMessage('Could not open file "'+s+'"',79,' Error ',78,true);
OpenFile := false;
End;
End Else
OpenFile := false;
End;
{ read a file line by line into the edit list }
Procedure ReadFile(var f : text; prompt : boolean);
Var
err : boolean;
s : string;
win : pnWindow;
Begin
If Not OpenFile(f,prompt) Then Exit;
ClearLines(hdr);
lines := 0;
win := nShowMessage('Reading "'+fnam+'"...',47,' Open File ',46,false);
{$I-}
Repeat
If Not Eof(f) Then Begin
Readln(f,s);
err := (IoResult <> 0);
If Not Err Then InsertLine(hdr,s);
End;
Until Eof(f) or err;
Close(f);
{$I+}
win^.Hide;
win^.Done;
line1 := hdr^.next;
line := line1;
LoadLines(line1);
DisplayLines;
idx := 1;
End;
{ save the edit list to disk }
Procedure SaveFile(var f : text);
Var
tmp : text;
s,
tnam : string;
cur : pLine;
win : pnWindow;
Begin
If PromptFile('Save File',s) = nkEsc Then
Exit
Else
fnam := s;
tnam := fnam+'~';
Assign(tmp,tnam);
Assign(f,fnam);
win := nShowMessage('Saving "'+fnam+'"...',47,' Save File ',46,false);
{$I-}
Reset(tmp);
If IoResult = 0 Then Begin
Close(tmp);
Erase(tmp);
Rename(f,tnam);
Assign(f,fnam);
End;
ReWrite(f);
cur := hdr^.next;
Repeat
If cur <> hdr Then Writeln(f,cur^.s^);
cur := cur^.next;
Until cur = hdr;
Close(f);
{$I+}
win^.Hide;
win^.Done;
End;
{ make the menu appear active }
Procedure MenuUp;
Begin
With mnu0 Do Begin
SetColor(48);
SetCursorColor(79);
Show;
End;
StatWin.FWrite(1,1,StatWin.GetColor,0,'Esc=Edit');
End;
{ make the menu appear inactive }
Procedure MenuDown;
Begin
With mnu0 Do Begin
SetColor(56);
SetCursorColor(56);
Show;
End;
StatWin.FWrite(1,1,StatWin.GetColor,0,'Esc=Menu');
End;
{ execute the File submenu }
Procedure Menu_File;
Begin
mnu0.SetIndex(1);
MenuUp;
New(mnu1,Init(1,1,0,3,1,48,79,8,FRAMED,62));
With mnu1^ Do Begin
Add('Open');
Add('Save');
Add('Exit - F10');
Post; { need the item count for move }
Move(1,nMaxRows-Count-2);
Start;
Case Index of
1 : ReadFile(tf,true);
2 : SaveFile(tf);
3 : Finished := true;
End;
Hide;
End;
Dispose(mnu1,Done);
MenuDown;
End;
{ display the help screen }
Procedure Help;
Var
hwin : pnWindow;
Begin
New(hwin,Init(1,1,40,20,62,true,49));
mnu0.SetIndex(4);
MenuUp;
New(hwin,Init(1,1,40,20,62,FRAMED,49));
With hwin^ Do Begin
Align(center,center);
PutHeader('Edit_Demo Help',15,center);
@ -57,37 +355,65 @@ Begin
Hide;
End;
Dispose(hwin,Done);
MenuDown;
End;
Procedure GotoLine(var i : integer);
{ goto the specified line in the edit buffer }
Function GotoLine : boolean;
Var
gwin : pnWindow;
ii : integer;
l,
ii : longint;
esc : boolean;
aline : pline;
Begin
New(gwin,Init(1,1,40,3,62,true,49));
New(gwin,Init(1,1,40,3,62,FRAMED,49));
With gwin^ Do Begin
Align(center,center);
PutHeader('Goto Line Number',15,center);
FWrite(2,1,63,0,'Line: ');
Show;
ii := i;
ec.ClearMode := true;
i := EditNumber(8,1,63,2,0,'',i,1,win1.rows,esc);
If esc or not (i in [1..win1.rows]) Then i := ii;
ii := EditNumber(8,1,63,8,0,'',cline,1,lines,esc);
{ If esc or not (i in [1..lines]) Then i := ii;}
Hide;
End;
Dispose(gwin,Done);
If Not esc Then Begin
l := 0;
aline := hdr;
Repeat
inc(l);
aline := aline^.next;
Until (l = ii);
line1 := aline;
cline := l;
End;
GotoLine := (Not esc);
End;
{ initialize the global stuff }
Procedure EditInit;
Begin
Status.Init(1,nStdScr.Rows,nStdScr.Cols,nStdScr.Rows,63,false,0);
nFWrite(1,1,63,80,' [F1-InsLn] [F2-DelLn] [F3-Help] [F10-Exit]');
Status.Show;
fillchar(ss,sizeof(ss),#0);
With win1 Do Begin
Init(1,1,nStdScr.Cols,nStdScr.Rows-1,31,true,31);
PutHeader(' nCrt Editor Demonstration ',15,center);
With mnu0 Do Begin
Init(1,1,45,1,5,56,56,7,NOFRAME,0);
Add('File');
Add('InsLn');
Add('DelLn');
Add('Help');
Add('Exit');
Post;
Align(left,bottom);
End;
With StatWin Do Begin
Init(1,1,nStdScr.Cols-(mnu0.Wind^.Cols),1,48,NOFRAME,0);
Align(right,bottom);
Show;
End;
MenuDown;
With EdWin Do Begin
Init(1,1,nStdScr.Cols,nStdScr.Rows-1,30,FRAMED,31);
PutHeader(' oCrt Editor Demonstration ',15,center);
Show;
GotoXY(1,1);
{--------------------------------------------------------------------
@ -100,69 +426,187 @@ Begin
{ too re-assign a built-in key, put it in ec.special,
then use it in the case statement below
win1.ec.Special := win1.ec.Special + #5;
EdWin.ec.Special := EdWin.ec.Special + #5;
}
{ now let's bind some keystrokes to the editor screen }
ec.AddChMap(^a#0#0+char(nKeyCtrlLeft));
ec.AddChMap(^s#0#0+char(nKeyLeft));
ec.AddChMap(^f#0#0+char(nKeyCtrlRight));
ec.AddChMap(^d#0#0+char(nKeyRight));
ec.AddChMap(^e#0#0+char(nKeyUp));
ec.AddChMap(^x#0#0+char(nKeyDown));
ec.AddChMap(^q#0#0+char(nKeyHome));
ec.AddChMap(^w#0#0+char(nKeyEnd));
{ now let's bind some keystrokes to the editor window }
ec.AddChMap(^a#0#0+chr(nKeyCtrlLeft));
ec.AddChMap(^s#0#0+chr(nKeyLeft));
ec.AddChMap(^f#0#0+chr(nKeyCtrlRight));
ec.AddChMap(^d#0#0+chr(nKeyRight));
ec.AddChMap(^e#0#0+chr(nKeyUp));
ec.AddChMap(^x#0#0+chr(nKeyDown));
ec.AddChMap(^q#0#0+chr(nKeyHome));
ec.AddChMap(^w#0#0+chr(nKeyEnd));
{ define the number of edit window rows }
CURLINES := Min(MAXLINES,Rows);
End;
FillChar(ss,SizeOf(ss),#0);
nEscDelay(250);
idx := 1;
Finished := false;
mactive := false;
ClearLines(hdr);
If ParamCount > 0 Then Begin
fnam := ParamStr(1);
ReadFile(tf,false);
End Else
fnam := '';
{ an empty list? }
If hdr^.next = hdr Then Begin
InsertLine(hdr,'');
line1 := hdr^.next;
line := line1;
dlines := 1;
End;
cline := 1;
End;
Begin
EditInit;
Repeat
With win1 Do Begin
With EdWin Do Begin
Case ec.InsMode of
true : Status.FWrite(50,1,48,0,'Ins');
false: Status.FWrite(50,1,48,0,'Ovr');
true : StatWin.FWrite(11,1,StatWin.GetColor,0,'Ins');
false: StatWin.FWrite(11,1,StatWin.GetColor,0,'Ovr');
End;
Str(WhereX:0,xp);
Str(WhereY:0,yp);
Status.FWrite(60,1,48,80,'X='+xp+', Y='+yp);
ss[idx] := Edit(1,idx,30,Cols,WhereX,ss[idx],c);
Case ord(c) of
12 : GotoLine(idx);
{5,}
nKeyUp : dec(idx);
nKeyDown : inc(idx);
nKeyPgUp : idx := 1;
nKeyPgDn : idx := Rows;
nKeyEnter: Begin
inc(idx);
GotoXY(1,WhereY);
End;
14, { ctrl/n }
nKeyF1 : Begin
InsLine;
system.move(ss[idx],ss[idx+1],(rows-idx)*81);
ss[idx] := '';
End;
25, { ctrl/y }
nKeyF2 : Begin
DelLine;
system.move(ss[idx+1],ss[idx],(rows-idx)*81);
ss[rows] := '';
End;
nKeyF3 : Help;
nKeyEsc,
nKeyF10 : Finished := true;
Str(cline:0,yp);
StatWin.FWrite(16,1,StatWin.GetColor,StatWin.Cols,'Col:'+xp+' Row:'+yp);
If mactive Then Begin
With mnu0 Do Begin
MenuUp;
Start;
Case Index Of
1 : cv := nkAltF;
2 : cv := nkF1;
3 : cv := nkF2;
4 : cv := nkF3;
5 : cv := nkF10;
Else cv := 0;
End;
MenuDown;
Show;
End;
mactive := false;
Active;
GotoXY(WhereX,WhereY);
End Else Begin
ss[idx] := Edit(1,idx,26,Cols,WhereX,ss[idx],cv);
FWrite(1,idx,GetColor,Cols,ss[idx]);
ReallocateLine(line,ss[idx]);
End;
If idx > rows Then idx := rows;
Case cv of
12 : If GotoLine Then Begin
idx := 1;
LoadLines(line1);
DisplayLines;
End;
{5,}
nkUp : Begin
dec(idx);
dec(cline);
If (idx < 1) and (line1^.prev <> hdr) Then Begin
line1 := line1^.prev;
LoadLines(line1);
DisplayLines;
End;
End;
nkDown : Begin
inc(idx);
inc(cline);
If idx > CURLINES Then Begin
line1 := line1^.next;
LoadLines(line1);
DisplayLines;
End;
End;
nkPgUp : Begin
For xi := 1 to CURLINES Do Begin
line1 := line1^.prev;
dec(cline);
If line1 = hdr Then
line1 := line1^.next;
End;
LoadLines(line1);
DisplayLines;
End;
nkPgDn : Begin
If dlines = CURLINES Then Begin
For xi := 1 to CURLINES Do Begin
inc(cline);
line1 := line1^.next;
If line1 = hdr Then
line1 := line1^.prev;
End;
LoadLines(line1);
DisplayLines;
End;
End;
nkEnter: Begin
GotoXY(1,WhereY);
If line^.next = hdr Then Begin
InsertLine(hdr,'');
If dlines < CURLINES Then inc(dlines);
End;
If idx < CURLINES Then
inc(idx)
Else Begin
line1 := line1^.next;
LoadLines(line1);
DisplayLines;
End;
inc(cline);
End;
14, { ctrl/n }
nkF1 : Begin
{ first displayed line? }
If line1 = line Then Begin
line1 := line1^.prev;
InsertLine(line,'');
line1 := line1^.next;
End Else
InsertLine(line,'');
LoadLines(line1);
DisplayLines;
End;
25, { ctrl/y }
nkF2 : Begin
{ first displayed line? }
If line1 = line Then line1 := line^.next;
DeleteLine(line);
LoadLines(line1);
DisplayLines;
End;
nkAltH,
nkF3 : Help;
nkEsc : mactive := true;
nkF10 : Finished := true;
nkAltF : menu_file;
End;
Active;
If idx > CURLINES Then idx := CURLINES; { keep in window, }
If idx > dlines Then idx := dlines; { but not below last }
If idx < 1 Then idx := 1;
If cline < 1 Then cline := 1;
If cline > lines Then cline := lines;
GotoXY(WhereX,idx);
line := line1;
For xi := 1 to idx-1 Do Begin
line := line^.next;
End;
End;
Until Finished;
win1.Done;
Status.Done;
ClearLines(hdr);
EdWin.Done;
StatWin.Done;
ClrScr;
End.
{
$Log$
Revision 1.3 2000-08-20 10:11:41 jonas
Revision 1.4 2000-08-29 05:51:09 michael
+ Merged changes and additions from fixbranch
Revision 1.3 2000/08/20 10:11:41 jonas
* added missing open comment at start of log section
Revision 1.2 2000/07/13 11:33:27 michael

46
packages/ncurses/eti.inc Normal file
View File

@ -0,0 +1,46 @@
{
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
}
const
E_OK = 0;
E_SYSTEM_ERROR = -(1);
E_BAD_ARGUMENT = -(2);
E_POSTED = -(3);
E_CONNECTED = -(4);
E_BAD_STATE = -(5);
E_NO_ROOM = -(6);
E_NOT_POSTED = -(7);
E_UNKNOWN_COMMAND = -(8);
E_NO_MATCH = -(9);
E_NOT_SELECTABLE = -(10);
E_NOT_CONNECTED = -(11);
E_REQUEST_DENIED = -(12);
E_INVALID_FIELD = -(13);
E_CURRENT = -(14);

348
packages/ncurses/menu.pp Normal file
View File

@ -0,0 +1,348 @@
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.

View File

@ -53,6 +53,14 @@
| 2) Added nInit and moved code from ncrt.pp & ocrt.pp to it.
| 3) KEY_ALTMINUS & KEYALTEQUAL were reversed, but mapping ended
| up correct.
2.15.00 | 1) Added nMaxRows & nMaxCols constants.
| 2) See ocrt.pp
2.16.00 | 08/14/2000 | kjw | See ocrt.pp
| 08/24/2000 | kjw |
| 1) Added nTermName.
| 2) Added CursesFailed.
| 3) Moved all common initialization code to nInit.
| 4) prev_textattr more reliable.
------------------------------------------------------------------------------
}
@ -81,13 +89,14 @@ Procedure nStop;
Procedure nStart;
Function nCursor(c : integer) : integer;
Function nEscDelay(d : longint) : longint;
Function nTermName : string;
Const
NCRT_VERSION_MAJOR = 2;
NCRT_VERSION_MINOR = 14;
NCRT_VERSION_MINOR = 16;
NCRT_VERSION_PATCH = 0;
NCRT_VERSION = '2.14.00';
NCRT_VERSION = '2.16.00';
{ CRT modes }
BW40 = 0; { 40x25 B/W on Color Adapter }
@ -171,6 +180,10 @@ Const
cON = 1; { normal cursor }
cBIG = 2; { very visible cursor }
{ fullscreen size }
nMaxRows : word = 25; { reset at startup to terminal setting }
nMaxCols : word = 80; { for columns and rows }
var
CheckBreak,
CheckEOF,
@ -194,6 +207,7 @@ Var
ps : array [0..255] of char; { for use with pchars }
doRefresh : boolean; { immediate refresh toggle }
SubWn, { window created from window() }
PrevWn, { previous window when active changes }
ActiveWn : pwindow; { current active window for stdout }
tmp_b : boolean;
isEcho : boolean; { keeps track of echo status }
@ -230,6 +244,17 @@ type
End;
{==========================================================================}
{ set the active window for write(ln), read(ln) }
Procedure SetActiveWn(win : pwindow);
Begin
If win <> ActiveWn Then PrevWn := ActiveWn;
{ don't set to a nil window! }
If win <> Nil Then
ActiveWn := win
Else
ActiveWn := stdscr;
End;
{--------------------------------------------
initialize ncurses screen & keyboard, and
return a pointer to stdscr.
@ -244,6 +269,7 @@ Begin
tcGetAttr(STDIN,tios);
if initscr=Nil then Begin
StartCurses := false;
win := nil;
Exit;
End Else Begin
StartCurses := true;
@ -259,6 +285,9 @@ Begin
isEcho := true;
doRefresh := true;
getmaxyx(stdscr,MaxRows,MaxCols);
{ make these values visible to apps }
nMaxRows := MaxRows;
nMaxCols := MaxCols;
{ define the the alt'd keysets for ncurses }
{ alt/a .. atl/z }
for i := ord('a') to ord('z') do Begin
@ -308,17 +337,15 @@ Begin
End;
{ see if the specified attribute is high intensity }
Function IsBold(att : integer) : boolean;
Function nIsBold(att : integer) : boolean;
Begin
bg := att div 16;
fg := att - (bg * 16);
isbold := (fg > 7);
nisbold := (fg > 7);
End;
{ initialize a color pair }
Function SetColorPair(att : integer) : integer;
var
i : integer;
{ map a curses color to an ibm color }
Function c2ibm(c : integer) : integer;
{ ncurses constants
COLOR_BLACK = 0;
COLOR_RED = 1;
@ -329,35 +356,56 @@ var
COLOR_CYAN = 6;
COLOR_WHITE = 7;
}
Var
att : integer;
Begin
Case c of
COLOR_BLACK : att := black;
COLOR_RED : att := red;
COLOR_GREEN : att := green;
COLOR_YELLOW : att := brown;
COLOR_BLUE : att := blue;
COLOR_MAGENTA : att := magenta;
COLOR_CYAN : att := cyan;
COLOR_WHITE : att := lightgray;
else att := c;
End;
c2ibm := att;
End;
{ map an ibm color to a curses color }
Function ibm2c(c : integer) : integer;
Var
att : integer;
Begin
Case c of
black : att := COLOR_BLACK;
red : att := COLOR_RED;
green : att := COLOR_GREEN;
brown : att := COLOR_YELLOW;
blue : att := COLOR_BLUE;
magenta : att := COLOR_MAGENTA;
cyan : att := COLOR_CYAN;
lightgray : att := COLOR_WHITE;
else att := c;
End;
ibm2c := att;
End;
{ initialize a color pair }
Function nSetColorPair(att : integer) : integer;
var
i : integer;
Begin
bg := att div 16;
fg := att - ((att div 16) * 16);
fg := att - (bg * 16);
While bg > 7 Do dec(bg,8);
While fg > 7 Do dec(fg,8);
{ map to ncurses color values }
case bg of
0 : bg := COLOR_BLACK;
1 : bg := COLOR_BLUE;
2 : bg := COLOR_GREEN;
3 : bg := COLOR_CYAN;
4 : bg := COLOR_RED;
5 : bg := COLOR_MAGENTA;
6 : bg := COLOR_YELLOW;
7 : bg := COLOR_WHITE;
end;
case fg of
0 : fg := COLOR_BLACK;
1 : fg := COLOR_BLUE;
2 : fg := COLOR_GREEN;
3 : fg := COLOR_CYAN;
4 : fg := COLOR_RED;
5 : fg := COLOR_MAGENTA;
6 : fg := COLOR_YELLOW;
7 : fg := COLOR_WHITE;
end;
bg := ibm2c(bg);
fg := ibm2c(fg);
i := cp[bg,fg];
init_pair(i,fg,bg);
SetColorPair := i;
nSetColorPair := i;
End;
{ map a standard color attribute to an ncurses attribute }
@ -365,8 +413,8 @@ Function CursesAtts(att : byte) : longint;
Var
atts : longint;
Begin
atts := COLOR_PAIR(SetColorPair(att));
If IsBold(att) Then atts := atts or A_BOLD;
atts := COLOR_PAIR(nSetColorPair(att));
If nIsBold(att) Then atts := atts or A_BOLD;
If (att and $80) = $80 Then atts := atts or A_BLINK;
CursesAtts := atts;
End;
@ -380,7 +428,7 @@ Begin
If (win = stdscr) or (win = curscr) Then Exit;
If win <> Nil Then delwin(win);
win := Nil;
If ActiveWn = Nil Then ActiveWn := stdscr;
If ActiveWn = Nil Then SetActiveWn(stdscr);
End;
{-----------------------------------------
@ -389,7 +437,7 @@ End;
-----------------------------------------}
Procedure nWinColor(win : pWindow; att : integer);
Begin
wattr_set(win,CursesAtts(att));
wattrset(win,CursesAtts(att));
prev_textattr := att;
End;
@ -400,6 +448,7 @@ Begin
TouchWin(win);
werase(win);
If doRefresh Then wrefresh(win);
prev_textattr := att;
End;
{ clear from the cursor to the end of line in a window }
@ -784,7 +833,7 @@ Begin
intrflush(SubWn,bool(false));
keypad(SubWn,bool(true));
scrollok(SubWn,bool(true));
ActiveWn := SubWn;
SetActiveWn(SubWn);
GotoXY(1,1);
End;
@ -844,8 +893,7 @@ End;
Procedure TextMode(mode : word);
Begin
nDelWindow(SubWn);
ActiveWn := stdscr;
NormVideo;
SetActiveWn(stdscr);
LastMode := mode;
DirectVideo := true;
CheckSnow := true;
@ -868,23 +916,18 @@ Begin
If d >= 0 Then ESCDELAY := d;
End;
{ unit initialization, following ncurses init }
Procedure nInit;
{ return the current terminal name (same as $TERM env variable) }
Function nTermName : string;
Begin
SubWn := nil;
TextMode(LastMode);
nTermName := StrPas(termname);
End;
{ Redirect the standard output }
assigncrt(Output);
Rewrite(Output);
TextRec(Output).Handle:=StdOutputHandle;
{ Redirect the standard input }
assigncrt(Input);
Reset(Input);
TextRec(Input).Handle:=StdInputHandle;
nEscDelay(500); { default is 1000 (1 second) }
nCursor(cON); { normal cursor }
{ could not initialize ncurses }
Procedure CursesFailed;
Begin
{ give 'em a clue! }
Writeln('StartCurses() failed');
Halt;
End;
{ exit procedure to ensure curses is closed up cleanly }
@ -894,9 +937,36 @@ Begin
EndCurses;
End;
Procedure nInit;
Begin
{ set the unit exit procedure }
ExitSave := ExitProc;
ExitProc := @nExit;
{ load the color pairs array with color pair indices (0..63 }
For bg := 0 to 7 Do For fg := 0 to 7 do cp[bg,fg] := (bg*8)+fg;
{ initial window pointers }
SubWn := nil;
PrevWn := ActiveWn;
{ basic gray on black screen }
TextMode(LastMode);
{ Redirect the standard output }
assigncrt(Output);
Rewrite(Output);
TextRec(Output).Handle:=StdOutputHandle;
{ Redirect the standard input }
assigncrt(Input);
Reset(Input);
TextRec(Input).Handle:=StdInputHandle;
{ some defaults }
nEscDelay(500); { default is 1000 (1 second) }
nCursor(cON); { normal cursor }
End;
{
$Log$
Revision 1.2 2000-07-13 11:33:27 michael
Revision 1.3 2000-08-29 05:51:09 michael
+ Merged changes and additions from fixbranch
Revision 1.2 2000/07/13 11:33:27 michael
+ removed logs
}

View File

@ -18,22 +18,8 @@ Unit nCrt;
2.00 | 12/13/99 | kjw | nCrt is now a drop-in replacement for the standard
| FPC crt unit. All the previous OOP features have
| been moved to a new unit, oCrt (object crt).
| See oCrt.pp for a complete revision history.
2.02 | 12/15/99 | kjw | See ncrt.inc.
2.03 | 12/16/99 | kjw | See ncrt.inc
2.04 | 01/04/00 | kjw | See ncrt.inc
2.05 | 01/06/00 | kjw | See ncrt.inc, ocrt.pp
2.06 | 01/11/00 | kjw | See ncrt.inc.
2.07 | 01/31/00 | kjw | See ncrt.inc, ocrt.pp
2.08 | 06/09/00 | kjw | See ocrt.pp
2.08.01 | 06/11/00 | kjw | See ocrt.pp
2.09.00 | 06/16/00 | kjw | See ocrt.pp
2.10.00 | 06/23/00 | kjw | See ocrt.pp
2.11.00 | 06/27/00 | kjw | See ocrt.pp
2.12.00 | 06/29/00 | kjw | See ocrt.pp
2.13.00 | 06/30/00 | kjw | See ncrt.inc
2.14.00 | 07/05/00 | kjw | See ncrt.inc
| See ocrt.pp & ncrt.inc for a complete revision
| history.
------------------------------------------------------------------------------
}
Interface
@ -43,23 +29,19 @@ Uses linux,ncurses;
{$i ncrt.inc}
Begin
{ load the color pairs array with color pair indices (0..63) }
For bg := 0 to 7 Do For fg := 0 to 7 do cp[bg,fg] := (bg*8)+fg;
{ initialize ncurses }
If Not StartCurses(ActiveWn) Then
Halt;
{ crtassign }
nInit;
{ set the unit exit procedure }
ExitSave := ExitProc;
ExitProc := @nExit;
If StartCurses(ActiveWn) Then
{ defaults, crtassign, etc. }
nInit
Else
CursesFailed;
End. { of Unit nCrt }
{
$Log$
Revision 1.2 2000-07-13 11:33:27 michael
Revision 1.3 2000-08-29 05:51:09 michael
+ Merged changes and additions from fixbranch
Revision 1.2 2000/07/13 11:33:27 michael
+ removed logs
}

View File

@ -377,6 +377,10 @@ Var
Function waddnstr(_para1:pWINDOW; _para2:pchar; _para3:longint):longint; cdecl;external;
Function wattr_on(_para1:pWINDOW; _para2:attr_t):longint; cdecl;external;
Function wattr_off(_para1:pWINDOW; _para2:attr_t):longint; cdecl;external;
Function wattr_set(win : pwindow; at : longint) : longint; cdecl;external;
function wattron(win : pwindow;at : longint) : longint; cdecl;external;
function wattroff(win : pwindow;at : longint) : longint; cdecl;external;
function wattrset(win : pwindow;at : longint) : longint; cdecl;external;
Function wbkgd(_para1:pWINDOW; _para2:chtype):longint; cdecl;external;
procedure wbkgdset(_para1:pWINDOW; _para2:chtype);cdecl;external;
Function wborder(_para1:pWINDOW; _para2:chtype; _para3:chtype; _para4:chtype; _para5:chtype;
@ -392,7 +396,7 @@ Var
Function wgetch(_para1:pWINDOW):longint; cdecl;external;
Function wgetnstr(_para1:pWINDOW; _para2:pchar; _para3:longint):longint; cdecl;external;
Function whline(_para1:pWINDOW; _para2:chtype; _para3:longint):longint; cdecl;external;
Function winch (win : PWindow) : longint;
Function winch (win : PWindow) : longint; cdecl;external;
Function winchnstr(_para1:pWINDOW; _para2:pchtype; _para3:longint):longint; cdecl;external;
Function winnstr(_para1:pWINDOW; _para2:pchar; _para3:longint):longint; cdecl;external;
Function winsch(_para1:pWINDOW; _para2:chtype):longint; cdecl;external;
@ -420,6 +424,7 @@ Var
Function mvwchgat(_para1:pWINDOW; _para2:longint; _para3:longint;
_para4:longint; _para5:longint; _para6:longint;
_para7:longint):longint;cdecl;external;
Function PAIR_NUMBER(_para1:longint):longint;cdecl;external;
const
A_NORMAL = 0;
@ -474,10 +479,12 @@ Var
function getpary(win : pwindow) : longint;
function wstandout(win : pwindow) : longint;
function wstandend(win : pwindow) : longint;
{kjw, 08/24/2000, changed to cdecl; external
function wattr_set(win : pwindow; at : longint) : longint;
function wattron(win : pwindow;at : longint) : longint;
function wattroff(win : pwindow;at : longint) : longint;
function wattrset(win : pwindow;at : longint) : longint;
}
function scroll(win : pwindow) : longint;
function touchwin(win : pwindow) : longint;
function touchline(win : pwindow;s,c : longint) : longint;
@ -851,6 +858,7 @@ begin
wstandend:=wattr_set(win,A_NORMAL);
end;
(*
function wattron(win : pwindow;at : longint) : longint;
begin
wattron:=wattr_on(win,at);
@ -865,7 +873,7 @@ function wattrset(win : pwindow;at : longint) : longint;
begin
wattrset:=wattr_set(win,at);
end;
*)
function scroll(win : pwindow) : longint;
begin
scroll:=wscrl(win,1);
@ -1329,7 +1337,7 @@ begin
X:=Win^._parx;
end;
end;
(* kjw, 08/23/2000, external in v4.2
function winch (win : PWindow) : longint;
begin
if win<>nil then
@ -1348,7 +1356,7 @@ begin
else
wattr_set:=0;
end;
*)
procedure setsyx (y,x : longint);
begin
stdscr^._cury := y;
@ -1675,7 +1683,9 @@ end;
end.
{
$Log$
Revision 1.2 2000-07-13 11:33:27 michael
Revision 1.3 2000-08-29 05:51:09 michael
+ Merged changes and additions from fixbranch
Revision 1.2 2000/07/13 11:33:27 michael
+ removed logs
}

File diff suppressed because it is too large Load Diff

View File

@ -199,6 +199,7 @@ Begin
y := 15;
win33.ClrScr;
for i := 1 to 11 do Begin
TextAttr := win33.GetColor;
dec(x);
dec(y);
str(i:0,s);
@ -221,11 +222,15 @@ Begin
Dispose(win22,Done);
win33.Done;
msgbox.Done;
NormVideo;
ClrScr;
End.
{
$Log$
Revision 1.3 2000-08-20 10:11:41 jonas
Revision 1.4 2000-08-29 05:51:09 michael
+ Merged changes and additions from fixbranch
Revision 1.3 2000/08/20 10:11:41 jonas
* added missing open comment at start of log section
Revision 1.2 2000/07/13 11:33:27 michael

View File

@ -1,7 +1,6 @@
unit panel;
{---------------------------------------------------------------------------
CncWare
(c) Copyright 1999
----------------------------------------------------------------------------
Filename..: panel.pp
Programmer: Ken J. Wright
@ -59,7 +58,7 @@ uses ncurses;
implementation
const External_library='';
{const External_library='';}
function panel_window(_para1:pPANEL):pWINDOW;cdecl;External;
procedure update_panels;cdecl;External;
@ -82,7 +81,10 @@ const External_library='';
end.
{
$Log$
Revision 1.3 2000-08-20 10:11:41 jonas
Revision 1.4 2000-08-29 05:51:10 michael
+ Merged changes and additions from fixbranch
Revision 1.3 2000/08/20 10:11:41 jonas
* added missing open comment at start of log section
Revision 1.2 2000/07/13 11:33:27 michael

View File

@ -0,0 +1,53 @@
program screen_demo;
{---------------------------------------------------------------------------
CncWare
(c) Copyright 2000
---------------------------------------------------------------------------
Filename..: screen_demo.pp
Programmer: Ken J. Wright
Date......: 08/24/2000
Purpose - Demonstrate Linux screen saving/restoring with oCrt.
-------------------------------<< REVISIONS >>--------------------------------
Ver | Date | Prog| Description
-------+----------+-----+----------------------------------------------------
1.00 | 08/24/00 | kjw | Initial Release.
------------------------------------------------------------------------------
}
uses ocrt;
var
i,j : integer;
pb : pnScreenBuf;
begin
For i := 1 to 24 Do Begin
TextColor(i);
For j := 1 to 79 Do Write(chr(j+32));
writeln;
End;
nGrabScreen(pb);
Write('screen stored, press a key to clear');readkey;
NormVideo;
ClrScr;
Write('press a key to restore previous screen');readkey;
nPopScreen(pb);
GotoXY(1,nMaxRows);
Write('press a key to restore to a smaller window');readkey;
ClrScr;
Window(10,5,70,20);
nPopScreen(pb);
Window(1,1,nMaxCols,nMaxRows);
GotoXY(1,nMaxRows);
Write('press a key to offset stored screen');readkey;
ClrScr;
nPopScreen(pb,5,3);
GotoXY(1,nMaxRows);
Write('press a key to restore a portion of this screen in multiple ');readkey;
nGrabScreen(pb,5,3,8,10);
ClrScr;
For i := 0 to 7 Do For j := 0 to 1 Do
nPopScreen(pb,i*10+1,j*12+1);
GotoXY(1,nMaxRows);
{ make sure to clean up! }
nReleaseScreen(pb);
end.