瀏覽代碼

+ Fixes and additions from Ken Wright

michael 25 年之前
父節點
當前提交
40551eae68

+ 5 - 5
packages/ncurses/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Makefile generated by fpcmake v1.00 [2000/08/14]
+# Makefile generated by fpcmake v1.00 [2000/07/11]
 #
 #
 
 
 defaultrule: all
 defaultrule: all
@@ -184,8 +184,8 @@ endif
 
 
 # Targets
 # 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
 # Clean
 
 
@@ -910,7 +910,7 @@ ifdef INSTALLPPUFILES
 ifdef PPUFILES
 ifdef PPUFILES
 INSTALLPPULINKFILES:=$(shell $(PPUFILES) -S -O $(INSTALLPPUFILES))
 INSTALLPPULINKFILES:=$(shell $(PPUFILES) -S -O $(INSTALLPPUFILES))
 else
 else
-INSTALLPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))))
+INSTALLPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)))
 endif
 endif
 endif
 endif
 
 
@@ -1075,7 +1075,7 @@ ifdef CLEANPPUFILES
 ifdef PPUFILES
 ifdef PPUFILES
 CLEANPPULINKFILES:=$(shell $(PPUFILES) $(CLEANPPUFILES))
 CLEANPPULINKFILES:=$(shell $(PPUFILES) $(CLEANPPUFILES))
 else
 else
-CLEANPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))))
+CLEANPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)))
 endif
 endif
 endif
 endif
 
 

+ 2 - 2
packages/ncurses/Makefile.fpc

@@ -3,8 +3,8 @@
 #
 #
 
 
 [targets]
 [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]
 [install]
 examplesubdir=ncurses
 examplesubdir=ncurses

+ 20 - 25
packages/ncurses/db_demo.pp

@@ -133,25 +133,25 @@ Begin
          Str(row:2,s);
          Str(row:2,s);
          FWrite((cols-10) div 2,rows-1,26,0,'Record #'+s);
          FWrite((cols-10) div 2,rows-1,26,0,'Record #'+s);
          With address[row] Do Begin
          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;
                   End;
                FWrite(x,y,att1,x+wid-1,s);
                FWrite(x,y,att1,x+wid-1,s);
                Case Ord(ch) of
                Case Ord(ch) of
@@ -173,7 +173,7 @@ Begin
                   nKeyF2 : UnBindArrows; { use arrows for editing }
                   nKeyF2 : UnBindArrows; { use arrows for editing }
                   nKeyF10 : IsDone := true;
                   nKeyF10 : IsDone := true;
                End;
                End;
-            End;
+	    End;
          End;
          End;
          If row > MAXROWS Then row := MAXROWS;
          If row > MAXROWS Then row := MAXROWS;
          If row < 1 Then row := 1;
          If row < 1 Then row := 1;
@@ -186,8 +186,3 @@ Begin
       Done;
       Done;
    End;
    End;
 End.
 End.
-  $Log$
-  Revision 1.2  2000-07-13 11:33:26  michael
-  + removed logs
- 
-}

+ 504 - 68
packages/ncurses/edit_demo.pp

@@ -7,7 +7,7 @@ Program Edit_Demo;
   Programmer: Ken J. Wright, [email protected]
   Programmer: Ken J. Wright, [email protected]
   Date......: 12/12/99
   Date......: 12/12/99
 
 
-  Purpose - Demonstrate the use of nCrt unit.
+  Purpose - Demonstrate the use of the oCrt unit.
 
 
 -------------------------------<< REVISIONS >>--------------------------------
 -------------------------------<< REVISIONS >>--------------------------------
   Ver  |   Date   | Prog| Description
   Ver  |   Date   | Prog| Description
@@ -16,22 +16,320 @@ Program Edit_Demo;
   1.01 | 12/13/99 | kjw | Changed to use oCrt.
   1.01 | 12/13/99 | kjw | Changed to use oCrt.
   1.02 | 06/16/00 | kjw | Added help & goto line pop-up screens.
   1.02 | 06/16/00 | kjw | Added help & goto line pop-up screens.
                         | Changes for control keys.
                         | Changes for control keys.
+  1.03 | 07/25/00 | kjw | Added use of new tnMenu object.
 ------------------------------------------------------------------------------
 ------------------------------------------------------------------------------
 }
 }
 uses oCrt;
 uses oCrt;
+
+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
 var
-   ss : array[1..25] of string[80];
-   xp,yp : string;
-   c : char;
-   win1,status : tnWindow;
-   idx : integer;
-   Finished : boolean;
+   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;
 Procedure Help;
 Var
 Var
    hwin : pnWindow;
    hwin : pnWindow;
 Begin
 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
    With hwin^ Do Begin
       Align(center,center);
       Align(center,center);
       PutHeader('Edit_Demo Help',15,center);
       PutHeader('Edit_Demo Help',15,center);
@@ -57,37 +355,65 @@ Begin
       Hide;
       Hide;
    End;
    End;
    Dispose(hwin,Done);
    Dispose(hwin,Done);
+   MenuDown;
 End;
 End;
 
 
-Procedure GotoLine(var i : integer);
+{ goto the specified line in the edit buffer }
+Function GotoLine : boolean;
 Var
 Var
    gwin : pnWindow;
    gwin : pnWindow;
-   ii : integer;
+   l,
+   ii : longint;
    esc : boolean;
    esc : boolean;
+   aline : pline;
 Begin
 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
    With gwin^ Do Begin
       Align(center,center);
       Align(center,center);
       PutHeader('Goto Line Number',15,center);
       PutHeader('Goto Line Number',15,center);
       FWrite(2,1,63,0,'Line: ');
       FWrite(2,1,63,0,'Line: ');
       Show;
       Show;
-      ii := i;
       ec.ClearMode := true;
       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;
       Hide;
    End;
    End;
    Dispose(gwin,Done);
    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;
 End;
 
 
+{ initialize the global stuff }
+Procedure EditInit;
 Begin
 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;
       Show;
       GotoXY(1,1);
       GotoXY(1,1);
       {--------------------------------------------------------------------
       {--------------------------------------------------------------------
@@ -100,68 +426,178 @@ Begin
       { too re-assign a built-in key, put it in ec.special,
       { too re-assign a built-in key, put it in ec.special,
         then use it in the case statement below
         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;
    End;
+   FillChar(ss,SizeOf(ss),#0);
+   nEscDelay(250);
    idx := 1;
    idx := 1;
    Finished := false;
    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
    Repeat
-      With win1 Do Begin
+      With EdWin Do Begin
          Case ec.InsMode of
          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;
          End;
          Str(WhereX:0,xp);
          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);
+         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;
+         Case cv of
+                12 : If GotoLine Then Begin
+                        idx := 1;
+                        LoadLines(line1);
+                        DisplayLines;
+                     End;
             {5,}
             {5,}
-            nKeyUp   : dec(idx);
-            nKeyDown : inc(idx);
-            nKeyPgUp : idx := 1;
-            nKeyPgDn : idx := Rows;
-            nKeyEnter: Begin
-                          inc(idx);
-                          GotoXY(1,WhereY);
-                       End;
+            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 }
             14, { ctrl/n }
-            nKeyF1   : Begin
-                          InsLine;
-                          system.move(ss[idx],ss[idx+1],(rows-idx)*81);
-                          ss[idx] := '';
-                       End;
+            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 }
             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;
+            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;
          End;
-         If idx > rows Then idx := rows;
+         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 idx < 1 Then idx := 1;
+         If cline < 1 Then cline := 1;
+         If cline > lines Then cline := lines;
          GotoXY(WhereX,idx);
          GotoXY(WhereX,idx);
+         line := line1;
+         For xi := 1 to idx-1 Do Begin
+            line := line^.next;
+         End;
       End;
       End;
    Until Finished;
    Until Finished;
-   win1.Done;
-   Status.Done;
+   ClearLines(hdr);
+   EdWin.Done;
+   StatWin.Done;
    ClrScr;
    ClrScr;
 End.
 End.
-  $Log$
-  Revision 1.2  2000-07-13 11:33:27  michael
-  + removed logs
- 
-}

+ 46 - 0
packages/ncurses/eti.inc

@@ -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 <[email protected]> 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 - 0
packages/ncurses/menu.pp

@@ -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 <[email protected]> 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.

+ 116 - 55
packages/ncurses/ncrt.inc

@@ -53,6 +53,14 @@
           | 2) Added nInit and moved code from ncrt.pp & ocrt.pp to it.
           | 2) Added nInit and moved code from ncrt.pp & ocrt.pp to it.
           | 3) KEY_ALTMINUS & KEYALTEQUAL were reversed, but mapping ended
           | 3) KEY_ALTMINUS & KEYALTEQUAL were reversed, but mapping ended
           | up correct.
           | 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;
 Procedure nStart;
  Function nCursor(c : integer) : integer;
  Function nCursor(c : integer) : integer;
  Function nEscDelay(d : longint) : longint;
  Function nEscDelay(d : longint) : longint;
+ Function nTermName : string;
 
 
 Const
 Const
 
 
    NCRT_VERSION_MAJOR = 2;
    NCRT_VERSION_MAJOR = 2;
-   NCRT_VERSION_MINOR = 14;
+   NCRT_VERSION_MINOR = 16;
    NCRT_VERSION_PATCH = 0;
    NCRT_VERSION_PATCH = 0;
-   NCRT_VERSION = '2.14.00';
+   NCRT_VERSION = '2.16.00';
 
 
  { CRT modes }
  { CRT modes }
    BW40          = 0;            { 40x25 B/W on Color Adapter }
    BW40          = 0;            { 40x25 B/W on Color Adapter }
@@ -171,6 +180,10 @@ Const
    cON  = 1; { normal cursor }
    cON  = 1; { normal cursor }
    cBIG = 2; { very visible 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
  var
    CheckBreak,
    CheckBreak,
    CheckEOF,
    CheckEOF,
@@ -194,6 +207,7 @@ Var
    ps : array [0..255] of char;       { for use with pchars }
    ps : array [0..255] of char;       { for use with pchars }
    doRefresh : boolean;               { immediate refresh toggle }
    doRefresh : boolean;               { immediate refresh toggle }
    SubWn,                             { window created from window() }
    SubWn,                             { window created from window() }
+   PrevWn,                            { previous window when active changes }
    ActiveWn : pwindow;                { current active window for stdout }
    ActiveWn : pwindow;                { current active window for stdout }
    tmp_b : boolean;
    tmp_b : boolean;
    isEcho : boolean;                  { keeps track of echo status }
    isEcho : boolean;                  { keeps track of echo status }
@@ -230,6 +244,17 @@ type
   End;
   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
   initialize ncurses screen & keyboard, and
   return a pointer to stdscr.
   return a pointer to stdscr.
@@ -244,6 +269,7 @@ Begin
    tcGetAttr(STDIN,tios);
    tcGetAttr(STDIN,tios);
    if initscr=Nil then Begin
    if initscr=Nil then Begin
       StartCurses := false;
       StartCurses := false;
+      win := nil;
       Exit;
       Exit;
    End Else Begin
    End Else Begin
       StartCurses := true;
       StartCurses := true;
@@ -259,6 +285,9 @@ Begin
       isEcho := true;
       isEcho := true;
       doRefresh := true;
       doRefresh := true;
       getmaxyx(stdscr,MaxRows,MaxCols);
       getmaxyx(stdscr,MaxRows,MaxCols);
+      { make these values visible to apps }
+      nMaxRows := MaxRows;
+      nMaxCols := MaxCols;
       { define the the alt'd keysets for ncurses }
       { define the the alt'd keysets for ncurses }
       { alt/a .. atl/z }
       { alt/a .. atl/z }
       for i := ord('a') to ord('z') do Begin
       for i := ord('a') to ord('z') do Begin
@@ -308,17 +337,15 @@ Begin
 End;
 End;
 
 
 { see if the specified attribute is high intensity }
 { see if the specified attribute is high intensity }
-Function IsBold(att : integer) : boolean;
+Function nIsBold(att : integer) : boolean;
 Begin
 Begin
    bg := att div 16;
    bg := att div 16;
    fg := att - (bg * 16);
    fg := att - (bg * 16);
-   isbold := (fg > 7);
+   nisbold := (fg > 7);
 End;
 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
 { ncurses constants
    COLOR_BLACK   = 0;
    COLOR_BLACK   = 0;
    COLOR_RED     = 1;
    COLOR_RED     = 1;
@@ -329,35 +356,56 @@ var
    COLOR_CYAN    = 6;
    COLOR_CYAN    = 6;
    COLOR_WHITE   = 7;
    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
 Begin
    bg := att div 16;
    bg := att div 16;
-   fg := att - ((att div 16) * 16);
+   fg := att - (bg * 16);
    While bg > 7 Do dec(bg,8);
    While bg > 7 Do dec(bg,8);
    While fg > 7 Do dec(fg,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];
    i := cp[bg,fg];
    init_pair(i,fg,bg);
    init_pair(i,fg,bg);
-   SetColorPair := i;
+   nSetColorPair := i;
 End;
 End;
 
 
 { map a standard color attribute to an ncurses attribute }
 { map a standard color attribute to an ncurses attribute }
@@ -365,8 +413,8 @@ Function CursesAtts(att : byte) : longint;
 Var
 Var
    atts : longint;
    atts : longint;
 Begin
 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;
    If (att and $80) = $80 Then atts := atts or A_BLINK;
    CursesAtts := atts;
    CursesAtts := atts;
 End;
 End;
@@ -380,7 +428,7 @@ Begin
    If (win = stdscr) or (win = curscr) Then Exit;
    If (win = stdscr) or (win = curscr) Then Exit;
    If win <> Nil Then delwin(win);
    If win <> Nil Then delwin(win);
    win := Nil;
    win := Nil;
-   If ActiveWn = Nil Then ActiveWn := stdscr;
+   If ActiveWn = Nil Then SetActiveWn(stdscr);
 End;
 End;
 
 
 {-----------------------------------------
 {-----------------------------------------
@@ -389,7 +437,7 @@ End;
  -----------------------------------------}
  -----------------------------------------}
 Procedure nWinColor(win : pWindow; att : integer);
 Procedure nWinColor(win : pWindow; att : integer);
 Begin
 Begin
-   wattr_set(win,CursesAtts(att));
+   wattrset(win,CursesAtts(att));
    prev_textattr := att;
    prev_textattr := att;
 End;
 End;
 
 
@@ -400,6 +448,7 @@ Begin
    TouchWin(win);
    TouchWin(win);
    werase(win);
    werase(win);
    If doRefresh Then wrefresh(win);
    If doRefresh Then wrefresh(win);
+   prev_textattr := att;
 End;
 End;
 
 
 { clear from the cursor to the end of line in a window }
 { clear from the cursor to the end of line in a window }
@@ -784,7 +833,7 @@ Begin
    intrflush(SubWn,bool(false));
    intrflush(SubWn,bool(false));
    keypad(SubWn,bool(true));
    keypad(SubWn,bool(true));
    scrollok(SubWn,bool(true));
    scrollok(SubWn,bool(true));
-   ActiveWn := SubWn;
+   SetActiveWn(SubWn);
    GotoXY(1,1);
    GotoXY(1,1);
 End;
 End;
 
 
@@ -844,8 +893,7 @@ End;
 Procedure TextMode(mode : word);
 Procedure TextMode(mode : word);
 Begin
 Begin
    nDelWindow(SubWn);
    nDelWindow(SubWn);
-   ActiveWn := stdscr;
-   NormVideo;
+   SetActiveWn(stdscr);
    LastMode := mode;
    LastMode := mode;
    DirectVideo := true;
    DirectVideo := true;
    CheckSnow := true;
    CheckSnow := true;
@@ -868,12 +916,39 @@ Begin
    If d >= 0 Then ESCDELAY := d;
    If d >= 0 Then ESCDELAY := d;
 End;
 End;
 
 
-{ unit initialization, following ncurses init }
+{ return the current terminal name (same as $TERM env variable) }
+Function nTermName : string;
+Begin
+   nTermName := StrPas(termname);
+End;
+
+{ 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 }
+Procedure nExit;
+Begin
+   ExitProc := ExitSave;
+   EndCurses;
+End;
+
 Procedure nInit;
 Procedure nInit;
 Begin
 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;
    SubWn := nil;
+   PrevWn := ActiveWn;
+   { basic gray on black screen }
    TextMode(LastMode);
    TextMode(LastMode);
-
    { Redirect the standard output }
    { Redirect the standard output }
    assigncrt(Output);
    assigncrt(Output);
    Rewrite(Output);
    Rewrite(Output);
@@ -882,21 +957,7 @@ Begin
    assigncrt(Input);
    assigncrt(Input);
    Reset(Input);
    Reset(Input);
    TextRec(Input).Handle:=StdInputHandle;
    TextRec(Input).Handle:=StdInputHandle;
-
+   { some defaults }
    nEscDelay(500); { default is 1000 (1 second) }
    nEscDelay(500); { default is 1000 (1 second) }
    nCursor(cON);   { normal cursor }
    nCursor(cON);   { normal cursor }
 End;
 End;
-
-{ exit procedure to ensure curses is closed up cleanly }
-Procedure nExit;
-Begin
-   ExitProc := ExitSave;
-   EndCurses;
-End;
-
-{
-  $Log$
-  Revision 1.2  2000-07-13 11:33:27  michael
-  + removed logs
- 
-}

+ 7 - 34
packages/ncurses/ncrt.pp

@@ -18,22 +18,8 @@ Unit nCrt;
   2.00 | 12/13/99 | kjw | nCrt is now a drop-in replacement for the standard
   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
                         | FPC crt unit. All the previous OOP features have
                         | been moved to a new unit, oCrt (object crt).
                         | 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
 Interface
@@ -43,23 +29,10 @@ Uses linux,ncurses;
 {$i ncrt.inc}
 {$i ncrt.inc}
 
 
 Begin
 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 }
    { 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 }
 End. { of Unit nCrt }
-{
-  $Log$
-  Revision 1.2  2000-07-13 11:33:27  michael
-  + removed logs
- 
-}

+ 19 - 9
packages/ncurses/ncurses.pp

@@ -1,5 +1,4 @@
 {
 {
-    $Id$
     Copyright (c) 1998 by Michael Van Canneyt
     Copyright (c) 1998 by Michael Van Canneyt
     member of the Free Pascal development team
     member of the Free Pascal development team
 
 
@@ -377,6 +376,10 @@ Var
     Function waddnstr(_para1:pWINDOW; _para2:pchar; _para3:longint):longint; cdecl;external;
     Function waddnstr(_para1:pWINDOW; _para2:pchar; _para3:longint):longint; cdecl;external;
     Function wattr_on(_para1:pWINDOW; _para2:attr_t):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_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;
     Function wbkgd(_para1:pWINDOW; _para2:chtype):longint; cdecl;external;
     procedure wbkgdset(_para1:pWINDOW; _para2:chtype);cdecl;external;
     procedure wbkgdset(_para1:pWINDOW; _para2:chtype);cdecl;external;
     Function wborder(_para1:pWINDOW; _para2:chtype; _para3:chtype; _para4:chtype; _para5:chtype;
     Function wborder(_para1:pWINDOW; _para2:chtype; _para3:chtype; _para4:chtype; _para5:chtype;
@@ -392,7 +395,7 @@ Var
     Function wgetch(_para1:pWINDOW):longint; cdecl;external;
     Function wgetch(_para1:pWINDOW):longint; cdecl;external;
     Function wgetnstr(_para1:pWINDOW; _para2:pchar; _para3:longint):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 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 winchnstr(_para1:pWINDOW; _para2:pchtype; _para3:longint):longint; cdecl;external;
     Function winnstr(_para1:pWINDOW; _para2:pchar; _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;
     Function winsch(_para1:pWINDOW; _para2:chtype):longint; cdecl;external;
@@ -420,6 +423,7 @@ Var
     Function mvwchgat(_para1:pWINDOW; _para2:longint; _para3:longint;
     Function mvwchgat(_para1:pWINDOW; _para2:longint; _para3:longint;
                       _para4:longint; _para5:longint; _para6:longint;
                       _para4:longint; _para5:longint; _para6:longint;
                       _para7:longint):longint;cdecl;external;
                       _para7:longint):longint;cdecl;external;
+    Function PAIR_NUMBER(_para1:longint):longint;cdecl;external;
 
 
     const
     const
            A_NORMAL = 0;
            A_NORMAL = 0;
@@ -474,10 +478,12 @@ Var
     function getpary(win : pwindow) : longint;
     function getpary(win : pwindow) : longint;
     function wstandout(win : pwindow) : longint;
     function wstandout(win : pwindow) : longint;
     function wstandend(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 wattr_set(win : pwindow; at : longint) : longint;
     function wattron(win : pwindow;at : longint) : longint;
     function wattron(win : pwindow;at : longint) : longint;
     function wattroff(win : pwindow;at : longint) : longint;
     function wattroff(win : pwindow;at : longint) : longint;
     function wattrset(win : pwindow;at : longint) : longint;
     function wattrset(win : pwindow;at : longint) : longint;
+}
     function scroll(win : pwindow) : longint;
     function scroll(win : pwindow) : longint;
     function touchwin(win : pwindow) : longint;
     function touchwin(win : pwindow) : longint;
     function touchline(win : pwindow;s,c : longint) : longint;
     function touchline(win : pwindow;s,c : longint) : longint;
@@ -851,6 +857,7 @@ begin
   wstandend:=wattr_set(win,A_NORMAL);
   wstandend:=wattr_set(win,A_NORMAL);
 end;
 end;
 
 
+(*
 function wattron(win : pwindow;at : longint) : longint;
 function wattron(win : pwindow;at : longint) : longint;
 begin
 begin
   wattron:=wattr_on(win,at);
   wattron:=wattr_on(win,at);
@@ -865,7 +872,7 @@ function wattrset(win : pwindow;at : longint) : longint;
 begin
 begin
   wattrset:=wattr_set(win,at);
   wattrset:=wattr_set(win,at);
 end;
 end;
-
+*)
 function scroll(win : pwindow) : longint;
 function scroll(win : pwindow) : longint;
 begin
 begin
   scroll:=wscrl(win,1);
   scroll:=wscrl(win,1);
@@ -1329,7 +1336,7 @@ begin
      X:=Win^._parx;
      X:=Win^._parx;
    end;
    end;
 end;
 end;
-
+(* kjw, 08/23/2000, external in v4.2
 function winch (win : PWindow) : longint;
 function winch (win : PWindow) : longint;
 begin
 begin
   if win<>nil then
   if win<>nil then
@@ -1348,7 +1355,7 @@ begin
   else
   else
    wattr_set:=0;
    wattr_set:=0;
 end;
 end;
-
+*)
 procedure setsyx (y,x : longint);
 procedure setsyx (y,x : longint);
 begin
 begin
   stdscr^._cury := y;
   stdscr^._cury := y;
@@ -1674,8 +1681,11 @@ end;
 
 
 end.
 end.
 {
 {
-  $Log$
-  Revision 1.2  2000-07-13 11:33:27  michael
-  + removed logs
- 
+  $ Log: ncurses.pp,v $
+  Revision 1.7  2000/05/31 09:36:26  jonas
+    * restored (version included with ncrt 2.06 was outdated)
+
+  Revision 1.5  2000/02/27 14:40:41  peter
+    * removed warnings/notes
+
 }
 }

File diff suppressed because it is too large
+ 503 - 95
packages/ncurses/ocrt.pp


+ 2 - 5
packages/ncurses/ocrt_demo.pp

@@ -199,6 +199,7 @@ Begin
    y := 15;
    y := 15;
    win33.ClrScr;
    win33.ClrScr;
    for i := 1 to 11 do Begin
    for i := 1 to 11 do Begin
+      TextAttr := win33.GetColor;
       dec(x);
       dec(x);
       dec(y);
       dec(y);
       str(i:0,s);
       str(i:0,s);
@@ -221,10 +222,6 @@ Begin
    Dispose(win22,Done);
    Dispose(win22,Done);
    win33.Done;
    win33.Done;
    msgbox.Done;
    msgbox.Done;
+   NormVideo;
    ClrScr;
    ClrScr;
 End.
 End.
-  $Log$
-  Revision 1.2  2000-07-13 11:33:27  michael
-  + removed logs
- 
-}

+ 2 - 8
packages/ncurses/panel.pp

@@ -1,13 +1,12 @@
 unit panel;
 unit panel;
 {---------------------------------------------------------------------------
 {---------------------------------------------------------------------------
                                  CncWare
                                  CncWare
-                            (c) Copyright 1999
 ----------------------------------------------------------------------------
 ----------------------------------------------------------------------------
   Filename..: panel.pp
   Filename..: panel.pp
   Programmer: Ken J. Wright
   Programmer: Ken J. Wright
   Date......: 12/08/1999
   Date......: 12/08/1999
 
 
-  Purpose - Link to the Linux 'panel' library for ncurses windowing 
+  Purpose - Link to the Linux 'panel' library for ncurses windowing
             functions. The panel library handles overlapping windows,
             functions. The panel library handles overlapping windows,
             whereas, native ncurses windowing is only tiled.
             whereas, native ncurses windowing is only tiled.
 
 
@@ -59,7 +58,7 @@ uses ncurses;
 
 
 implementation
 implementation
 
 
-const External_library='';
+{const External_library='';}
 
 
   function panel_window(_para1:pPANEL):pWINDOW;cdecl;External;
   function panel_window(_para1:pPANEL):pWINDOW;cdecl;External;
   procedure update_panels;cdecl;External;
   procedure update_panels;cdecl;External;
@@ -80,8 +79,3 @@ const External_library='';
   function panel_hidden(_para1:pPANEL):longint;cdecl;External;
   function panel_hidden(_para1:pPANEL):longint;cdecl;External;
 
 
 end.
 end.
-  $Log$
-  Revision 1.2  2000-07-13 11:33:27  michael
-  + removed logs
- 
-}

+ 53 - 0
packages/ncurses/screen_demo.pp

@@ -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.

Some files were not shown because too many files changed in this diff