Browse Source

+ Merged changes and additions from fixbranch

michael 25 years ago
parent
commit
558f3cd963

+ 3 - 3
packages/ncurses/Makefile

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

+ 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

+ 24 - 21
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;
@@ -188,7 +188,10 @@ Begin
 End.
 End.
 {
 {
   $Log$
   $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
     * added missing open comment at start of log section
 
 
   Revision 1.2  2000/07/13 11:33:26  michael
   Revision 1.2  2000/07/13 11:33:26  michael

+ 508 - 64
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,69 +426,187 @@ 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$
   $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
     * added missing open comment at start of log section
 
 
   Revision 1.2  2000/07/13 11:33:27  michael
   Revision 1.2  2000/07/13 11:33:27  michael

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

+ 120 - 50
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,16 @@ 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$
   $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
   + removed logs
  
  
 }
 }

+ 11 - 29
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,19 @@ 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$
   $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
   + removed logs
  
  
 }
 }

+ 16 - 6
packages/ncurses/ncurses.pp

@@ -377,6 +377,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 +396,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 +424,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 +479,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 +858,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 +873,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 +1337,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 +1356,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;
@@ -1675,7 +1683,9 @@ end;
 end.
 end.
 {
 {
   $Log$
   $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
   + removed logs
- 
 }
 }

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


+ 6 - 1
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,11 +222,15 @@ Begin
    Dispose(win22,Done);
    Dispose(win22,Done);
    win33.Done;
    win33.Done;
    msgbox.Done;
    msgbox.Done;
+   NormVideo;
    ClrScr;
    ClrScr;
 End.
 End.
 {
 {
   $Log$
   $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
     * added missing open comment at start of log section
 
 
   Revision 1.2  2000/07/13 11:33:27  michael
   Revision 1.2  2000/07/13 11:33:27  michael

+ 5 - 3
packages/ncurses/panel.pp

@@ -1,7 +1,6 @@
 unit panel;
 unit panel;
 {---------------------------------------------------------------------------
 {---------------------------------------------------------------------------
                                  CncWare
                                  CncWare
-                            (c) Copyright 1999
 ----------------------------------------------------------------------------
 ----------------------------------------------------------------------------
   Filename..: panel.pp
   Filename..: panel.pp
   Programmer: Ken J. Wright
   Programmer: Ken J. Wright
@@ -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;
@@ -82,7 +81,10 @@ const External_library='';
 end.
 end.
 {
 {
   $Log$
   $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
     * added missing open comment at start of log section
 
 
   Revision 1.2  2000/07/13 11:33:27  michael
   Revision 1.2  2000/07/13 11:33:27  michael

+ 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