mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 06:49:27 +02:00
+ 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:
parent
ec95ce1f48
commit
eac9bbd068
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user