浏览代码

* merged some fixes from 1.0.x

marco 22 年之前
父节点
当前提交
add1df1b27
共有 1 个文件被更改,包括 99 次插入24 次删除
  1. 99 24
      rtl/unix/video.pp

+ 99 - 24
rtl/unix/video.pp

@@ -27,10 +27,13 @@ uses
 
 {$i video.inc}
 
+
+Type TConsoleType = (ttyNetwork,ttyLinux,ttyFreeBSD,ttyNetBSD);
+
 var
   LastCursorType : byte;
   TtyFd: Longint;
-  Console: Boolean;
+  Console: TConsoleType;
 {$ifdef logging}
   f: file;
 
@@ -219,7 +222,7 @@ Begin
         exit;
       end;
    end;
-  if (x=1) and (oy+1=y) then
+  if ((x=1) and (oy+1=y)) and (console<>ttyfreebsd) then
    XY2Ansi:=#13#10
   else
    XY2Ansi:=#27'['+IntStr(y)+';'+IntStr(x)+'H';
@@ -310,7 +313,7 @@ var
   SpaceAttr,
   LastAttr : longint;
   p,pold   : pvideocell;
-
+  LastLineWidth : Longint;
 
 procedure TransformUsingACS(var st : string);
 var
@@ -348,6 +351,8 @@ end;
 
   procedure outdata(hstr:string);
   begin
+   If Length(HStr)>0 Then
+   Begin
     while (eol>0) do
      begin
        hstr:=#13#10+hstr;
@@ -370,6 +375,7 @@ end;
        fpWrite(TTYFd,outbuf,outptr);
        outptr:=0;
      end;
+    end;
   end;
 
   procedure OutClr(c:byte);
@@ -391,6 +397,25 @@ end;
     Spaces:=0;
   end;
 
+function GetTermString(ndx:word):String;
+var
+   P,pdelay: PChar;
+begin
+  GetTermString:='';
+  if not assigned(cur_term_Strings) then
+    exit{RunError(219)};
+  P:=cur_term_Strings^[Ndx];
+  if assigned(p) then
+   begin { Do not transmit the delays }
+     pdelay:=strpos(p,'$<');
+     if assigned(pdelay) then
+       pdelay^:=#0;
+     GetTermString:=StrPas(p);
+     if assigned(pdelay) then
+       pdelay^:='$';
+   end;
+end;
+
 begin
   OutPtr:=0;
   Eol:=0;
@@ -399,6 +424,7 @@ begin
   pold:=PVideoCell(OldVideoBuf);
 { init Attr, X,Y and set autowrap off }
   SendEscapeSeq(#27'[m'#27'[?7l'{#27'[H'} );
+//  1.0.x: SendEscapeSeq(#27'[m'{#27'[H'});
   LastAttr:=7;
   LastX:=-1;
   LastY:=-1;
@@ -406,7 +432,10 @@ begin
    begin
      SpaceAttr:=0;
      Spaces:=0;
-     for x:=1 to ScreenWidth do
+     LastLineWidth:=ScreenWidth;
+     If (y=ScreenHeight) And (Console=ttyFreeBSD) {And :am: is on} Then
+      LastLineWidth:=ScreenWidth-2;
+     for x:=1 to LastLineWidth do
       begin
         if (not force) and (p^=pold^) then
          begin
@@ -467,6 +496,27 @@ begin
       skipped:=true;
    end;
   eol:=0;
+ {if am in capabilities? Then}
+  If (Console=ttyFreeBSD) and (Plongint(p)^<>plongint(pold)^) Then
+   Begin
+    OutData(XY2Ansi(ScreenWidth,ScreenHeight,LastX,LastY));
+    OutData(#8);
+    {Output last char}
+    chattr:=tchattr(p[1]);
+    if LastAttr<>chattr.Attr then
+     OutClr(chattr.Attr);
+    OutData(chattr.ch);
+    inc(LastX);
+//    OutData(XY2Ansi(ScreenWidth-1,ScreenHeight,LastX,LastY));
+//   OutData(GetTermString(Insert_character));
+    OutData(#8+#27+'[1@');
+
+    chattr:=tchattr(p^);
+    if LastAttr<>chattr.Attr then
+     OutClr(chattr.Attr);
+    OutData(chattr.ch);
+    inc(LastX);
+   end;
   OutData(XY2Ansi(CursorX,CursorY,LastX,LastY));
 {$ifdef logging}
   blockwrite(f,logstart[1],length(logstart));
@@ -480,7 +530,7 @@ begin
   if InACS then
     SendEscapeSeqNdx(exit_alt_charset_mode);
  {turn autowrap on}
-  SendEscapeSeq(#27'[?7h');
+//  SendEscapeSeq(#27'[?7h');
 end;
 
 var
@@ -582,23 +632,31 @@ begin
      { write code to set a correct font }
      fpWrite(stdoutputhandle,fontstr[1],length(fontstr));
      { running on a tty, find out whether locally or remotely }
+     TTyfd:=-1;
+     Console:=TTyNetwork;  {Default: Network or other vtxxx tty}
      if (Copy(ThisTTY, 1, 8) = '/dev/tty') and
-        (ThisTTY[9] >= '0') and (ThisTTY[9] <= '9') then
+        not (ThisTTY[9] IN ['p'..'u','P']) then			// FreeBSD has these
       begin
         { running on the console }
-        FName:='/dev/vcsa' + ThisTTY[9];
-        TTYFd:=fpOpen(FName, Octal(666), Open_RdWr); { open console }
-      end
-     else
-      TTYFd:=-1;
-     if TTYFd<>-1 then
-      Console:=true
-     else
+        Case ThisTTY[9] of
+         '0'..'9' : begin { running Linux on native console or native-emulation }
+                     FName:='/dev/vcsa' + ThisTTY[9];
+                     TTYFd:=fpOpen(FName, Octal(666), Open_RdWr); { open console }
+                     IF TTYFd <>-1 Then
+                       Console:=ttyLinux;
+                    end;
+         'v'  :  { check for (Free?)BSD native}
+                If (ThisTTY[10]>='0') and (ThisTTY[10]<='9') Then
+                 Console:=ttyFreeBSD;   {TTYFd ?}
+         end;
+       end;
+     If (Copy(fpGetEnv('TERM'),1,4)='cons') Then		// cons<lines>
+       Console:=ttyFreeBSD;
+     If Console<>ttylinux Then
       begin
         { running on a remote terminal, no error with /dev/vcsa }
-        Console:=False;
         LowAscii:=false;
-        TTYFd:=stdoutputhandle;
+        //TTYFd:=stdoutputhandle;
       end;
      fpioctl(stdinputhandle, TIOCGWINSZ, @WS);
      if WS.ws_Col=0 then
@@ -613,9 +671,10 @@ begin
      ScreenHeight:=WS.ws_Row;
      CursorX:=1;
      CursorY:=1;
+     LastCursorType:=$ff;
      ScreenColor:=True;
      { Start with a clear screen }
-     if not Console then
+     if Console<>ttylinux then
       begin
         prev_term:=cur_term;
         setupterm(nil, stdoutputhandle, err);
@@ -625,6 +684,8 @@ begin
         SendEscapeSeqNdx(cursor_visible);
         SendEscapeSeqNdx(enter_ca_mode);
         SetCursorType(crUnderLine);
+        If Console=ttyFreeBSD Then
+	  SendEscapeSeqNdx(exit_am_mode);
       end
      else if not assigned(cur_term) then
        begin
@@ -661,7 +722,7 @@ end;
 procedure SysDoneVideo;
 begin
   prepareDoneVideo;
-  if Console then
+  if Console=ttylinux then
    SetCursorPos(1,1)
   else
    begin
@@ -675,7 +736,11 @@ begin
   ACSIn:='';
   ACSOut:='';
   doneVideoDone;
-  if can_delete_term then
+  { FreeBSD gives an error here.
+   According to Pierre this could be more a NCurses version thing that
+   a FreeBSD one. FreeBSD 4.4 has ncurses 5.
+   MvdV102003: Since I ran 1.1 with newer FreeBSD without problem, I let it be for now}
+  if can_delete_term then		
     begin
       del_curterm(cur_term);
       can_delete_term:=false;
@@ -688,7 +753,7 @@ end;
 
 procedure SysClearScreen;
 begin
-  if Console then
+  if Console=ttylinux then
     UpdateScreen(true)
   else
     begin
@@ -737,7 +802,7 @@ begin
    DoUpdate:=true;
   if not DoUpdate then
    exit;
-  if Console then
+  if Console=ttylinux then
    begin
      fplSeek(TTYFd, 4, Seek_Set);
      fpWrite(TTYFd, VideoBuf^,VideoBufSize);
@@ -761,7 +826,9 @@ procedure SysSetCursorPos(NewCursorX, NewCursorY: Word);
 var
   Pos : array [1..2] of Byte;
 begin
-  if Console then
+ if (CursorX=NewCursorX+1) and (CursorY=NewCursorY+1) then
+    exit;
+  if Console=ttylinux then
    begin
      fplSeek(TTYFd, 2, Seek_Set);
      Pos[1]:=NewCursorX;
@@ -786,22 +853,27 @@ end;
 
 procedure SysSetCursorType(NewType: Word);
 begin
+  If LastCursorType=NewType then
+   exit;
   LastCursorType:=NewType;
   case NewType of
    crBlock :
      Begin
        If not SendEscapeSeqNdx(cursor_visible) then
+        If Console<>ttyFreeBSD Then	// should be done only for linux?
          SendEscapeSeq(#27'[?17;0;64c');
      End;
    crHidden :
      Begin
        If not SendEscapeSeqNdx(cursor_invisible) then
+        If Console<>ttyFreeBSD Then
          SendEscapeSeq(#27'[?1c');
      End;
   else
     begin
       If not SendEscapeSeqNdx(cursor_normal) then
-        SendEscapeSeq(#27'[?2c');
+        If Console<>ttyFreeBSD Then
+         SendEscapeSeq(#27'[?2c');
     end;
   end;
 end;
@@ -826,7 +898,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.15  2003-10-17 22:13:30  olle
+  Revision 1.16  2003-10-24 17:51:39  marco
+   * merged some fixes from 1.0.x
+
+  Revision 1.15  2003/10/17 22:13:30  olle
     * changed i386 to cpui386
 
   Revision 1.14  2003/09/14 20:15:01  marco