+ added preserving of rawness of terminal when going though

init/donevideo
  * del_term() is now called in donevideo
  * if initvideo is called while the video is already initialized, the
    screen is cleared and the cursor is set home, instead of going
    through the whole donevideo and then initvideo
  (merged from fixes branch)
This commit is contained in:
Jonas Maebe 2000-09-26 08:18:29 +00:00
parent ec95ce1f48
commit eac9bbd068

View File

@ -11,7 +11,14 @@ var
TtyFd: Longint;
Console: Boolean;
OldVideoBuf: PVideoBuf;
{$ifdef logging}
f: file;
const
logstart: string = '';
nl: char = #10;
logend: string = #10#10;
{$endif logging}
{$ASMMODE ATT}
procedure SendEscapeSeqNdx(Ndx: Word);
@ -177,8 +184,16 @@ var
end;
move(hstr[1],outbuf[outptr],length(hstr));
inc(outptr,length(hstr));
if outptr>1024 then
if outptr>=1024 then
begin
{$ifdef logging}
blockwrite(f,logstart[1],length(logstart));
blockwrite(f,nl,1);
blockwrite(f,outptr,sizeof(outptr));
blockwrite(f,nl,1);
blockwrite(f,outbuf,outptr);
blockwrite(f,nl,1);
{$endif logging}
fdWrite(TTYFd,outbuf,outptr);
outptr:=0;
end;
@ -273,9 +288,81 @@ begin
end;
eol:=0;
OutData(XY2Ansi(CursorX,CursorY,LastX,LastY));
{$ifdef logging}
blockwrite(f,logstart[1],length(logstart));
blockwrite(f,nl,1);
blockwrite(f,outptr,sizeof(outptr));
blockwrite(f,nl,1);
blockwrite(f,outbuf,outptr);
blockwrite(f,nl,1);
{$endif logging}
fdWrite(TTYFd,outbuf,outptr);
end;
var
preInitVideoTio, postInitVideoTio: linux.termios;
inputRaw, outputRaw: boolean;
procedure saveRawSettings(const tio: linux.termios);
Begin
with tio do
begin
inputRaw :=
((c_iflag and (IGNBRK or BRKINT or PARMRK or ISTRIP or
INLCR or IGNCR or ICRNL or IXON)) = 0) and
((c_lflag and (ECHO or ECHONL or ICANON or ISIG or IEXTEN)) = 0);
outPutRaw :=
((c_oflag and OPOST) = 0) and
((c_cflag and (CSIZE or PARENB)) = 0) and
((c_cflag and CS8) <> 0);
end;
end;
procedure restoreRawSettings(tio: linux.termios);
begin
with tio do
begin
if inputRaw then
begin
c_iflag := c_iflag and (not (IGNBRK or BRKINT or PARMRK or ISTRIP or
INLCR or IGNCR or ICRNL or IXON));
c_lflag := c_lflag and
(not (ECHO or ECHONL or ICANON or ISIG or IEXTEN));
end;
if outPutRaw then
begin
c_oflag := c_oflag and not(OPOST);
c_cflag := c_cflag and not(CSIZE or PARENB) or CS8;
end;
end;
TCSetAttr(1,TCSANOW,tio);
end;
procedure prepareInitVideo;
begin
TCGetAttr(1,preInitVideoTio);
saveRawSettings(preInitVideoTio);
end;
procedure videoInitDone;
begin
TCGetAttr(1,postInitVideoTio);
restoreRawSettings(postInitVideoTio);
end;
procedure prepareDoneVideo;
var
tio: linux.termios;
begin
TCGetAttr(1,tio);
saveRawSettings(tio);
TCSetAttr(1,TCSANOW,postInitVideoTio);
end;
procedure doneVideoDone;
begin
restoreRawSettings(preInitVideoTio);
end;
procedure InitVideo;
const
@ -290,11 +377,23 @@ var
begin
LowAscii:=false;
if VideoBufSize<>0 then
DoneVideo;
begin
clearscreen;
if Console then
SetCursorPos(1,1)
else
begin
SendEscapeSeqNdx(cursor_home);
SendEscapeSeq(#27'[H');
end;
exit;
end;
{ check for tty }
ThisTTY:=TTYName(stdin);
if IsATTY(stdin) then
begin
{ save current terminal characteristics and remove rawness }
prepareInitVideo;
{ write code to set a correct font }
fdWrite(stdout,fontstr[1],length(fontstr));
{ running on a tty, find out whether locally or remotely }
@ -340,6 +439,12 @@ begin
SetCursorType(crUnderLine);
end;
ClearScreen;
{$ifdef logging}
assign(f,'video.log');
rewrite(f,1);
{$endif logging}
{ save new terminal characteristics and possible restore rawness }
videoInitDone;
end
else
ErrorCode:=errVioInit; { not a TTY }
@ -349,6 +454,7 @@ procedure DoneVideo;
begin
if VideoBufSize=0 then
exit;
prepareDoneVideo;
ClearScreen;
if Console then
SetCursorPos(1,1)
@ -364,6 +470,11 @@ begin
FreeMem(VideoBuf,VideoBufSize);
FreeMem(OldVideoBuf,VideoBufSize);
VideoBufSize:=0;
doneVideoDone;
del_curterm(cur_term);
{$ifdef logging}
close(f);
{$endif logging}
end;
@ -478,7 +589,16 @@ end;
{
$Log$
Revision 1.3 2000-08-02 12:39:22 jonas
Revision 1.4 2000-09-26 08:18:29 jonas
+ added preserving of rawness of terminal when going though
init/donevideo
* del_term() is now called in donevideo
* if initvideo is called while the video is already initialized, the
screen is cleared and the cursor is set home, instead of going
through the whole donevideo and then initvideo
(merged from fixes branch)
Revision 1.3 2000/08/02 12:39:22 jonas
* fixed crashes under ncurses 4 by adding auto-detection for ncurses 4/5
* cur_term is not directly usable anymore for the largest part because
of a different record layout in ncurses 4/5, therefore the pointers