mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 18:09:27 +02:00
+ get winsize at startup
+ ConsoleBuf to interface
This commit is contained in:
parent
8d3acbf569
commit
0f609f0ee2
117
rtl/linux/crt.pp
117
rtl/linux/crt.pp
@ -1,8 +1,8 @@
|
||||
{
|
||||
$Id$
|
||||
This file is part of the Free Pascal run time library.
|
||||
Copyright (c) 1993,97 by Michael Van Canneyt,
|
||||
member of the Free Pascal development team.
|
||||
Copyright (c) 1993-98 by Michael Van Canneyt and Peter Vreman,
|
||||
members of the Free Pascal development team.
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
@ -17,9 +17,7 @@ Interface
|
||||
|
||||
Const
|
||||
{ Controlling consts }
|
||||
Flushing=false; {if true then don't buffer output}
|
||||
ScreenWidth = 80;
|
||||
ScreenHeight = 25;
|
||||
Flushing=false; {if true then don't buffer output}
|
||||
|
||||
{ CRT modes }
|
||||
BW40 = 0; { 40x25 B/W on Color Adapter }
|
||||
@ -57,7 +55,6 @@ Const
|
||||
Blink = 128;
|
||||
|
||||
{Other Defaults}
|
||||
|
||||
TextAttr : Byte = $07;
|
||||
LastMode : Word = 3;
|
||||
WindMin : Word = $0;
|
||||
@ -68,6 +65,23 @@ var
|
||||
CheckSnow,
|
||||
DirectVideo: Boolean;
|
||||
|
||||
Const
|
||||
ScreenHeight : longint=25;
|
||||
ScreenWidth : longint=80;
|
||||
|
||||
ConsoleMaxX=1024;
|
||||
ConsoleMaxY=1024;
|
||||
Type
|
||||
TCharAttr=packed record
|
||||
ch : char;
|
||||
attr : byte;
|
||||
end;
|
||||
TConsoleBuf=Array[0..ConsoleMaxX*ConsoleMaxY-1] of TCharAttr;
|
||||
PConsoleBuf=^TConsoleBuf;
|
||||
var
|
||||
ConsoleBuf : PConsoleBuf;
|
||||
|
||||
|
||||
Procedure AssignCrt(Var F: Text);
|
||||
Function KeyPressed: Boolean;
|
||||
Function ReadKey: Char;
|
||||
@ -98,18 +112,10 @@ uses Linux;
|
||||
The definitions of TextRec and FileRec are in separate files.
|
||||
}
|
||||
{$i textrec.inc}
|
||||
{$i filerec.inc}
|
||||
|
||||
Const
|
||||
OldTextAttr : byte = $07;
|
||||
|
||||
Type
|
||||
TScreen=Array[1..ScreenHeight,1..ScreenWidth] of char;
|
||||
TScreenColors=Array[1..ScreenHeight,1..ScreenWidth] of byte;
|
||||
|
||||
Var
|
||||
Scrn : TScreen;
|
||||
ScrnCol : TScreenColors;
|
||||
CurrX,CurrY : Byte;
|
||||
ExitSave : Pointer;
|
||||
Redir : boolean; { is the output being redirected (not a TTY) }
|
||||
@ -468,14 +474,15 @@ procedure ttyWrite(const s:string);
|
||||
Write a string to the output, memory copy and Current X&Y are also updated
|
||||
}
|
||||
var
|
||||
i : longint;
|
||||
idx,i : longint;
|
||||
begin
|
||||
ttySendStr(s);
|
||||
{Update MemCopy}
|
||||
idx:=(CurrY-1)*ScreenWidth-1;
|
||||
for i:=1to length(s) do
|
||||
begin
|
||||
Scrn[CurrY,CurrX]:=s[i];
|
||||
ScrnCol[CurrY,CurrX]:=TextAttr;
|
||||
ConsoleBuf^[idx+CurrX].ch:=s[i];
|
||||
ConsoleBuf^[idx+CurrX].attr:=TextAttr;
|
||||
inc(CurrX);
|
||||
if CurrX>ScreenWidth then
|
||||
CurrX:=ScreenWidth;
|
||||
@ -484,7 +491,7 @@ end;
|
||||
|
||||
|
||||
|
||||
Function WinMinX: Byte;
|
||||
Function WinMinX: Longint;
|
||||
{
|
||||
Current Minimum X coordinate
|
||||
}
|
||||
@ -494,7 +501,7 @@ End;
|
||||
|
||||
|
||||
|
||||
Function WinMinY: Byte;
|
||||
Function WinMinY: Longint;
|
||||
{
|
||||
Current Minimum Y Coordinate
|
||||
}
|
||||
@ -504,7 +511,7 @@ End;
|
||||
|
||||
|
||||
|
||||
Function WinMaxX: Byte;
|
||||
Function WinMaxX: Longint;
|
||||
{
|
||||
Current Maximum X coordinate
|
||||
}
|
||||
@ -514,7 +521,7 @@ End;
|
||||
|
||||
|
||||
|
||||
Function WinMaxY: Byte;
|
||||
Function WinMaxY: Longint;
|
||||
{
|
||||
Current Maximum Y coordinate;
|
||||
}
|
||||
@ -529,7 +536,7 @@ Function FullWin:boolean;
|
||||
Full Screen 80x25? Window(1,1,80,25) is used, allows faster routines
|
||||
}
|
||||
begin
|
||||
FullWin:=(WindMax-WindMin=$184f);
|
||||
FullWin:=(WinMaxX=ScreenWidth) and (WinMaxY=ScreenHeight);
|
||||
end;
|
||||
|
||||
|
||||
@ -557,8 +564,7 @@ begin
|
||||
ttyGotoXY(xl,y);
|
||||
len:=xh-xl+1;
|
||||
LineWrite(Space(len));
|
||||
FillChar(Scrn[y,xl],len,' ');
|
||||
FillChar(ScrnCol[y,xl],len,TextAttr);
|
||||
FillWord(ConsoleBuf^[(y-1)*ScreenWidth+xl-1],len,(TextAttr shl 8)+ord(' '));
|
||||
end;
|
||||
|
||||
|
||||
@ -569,22 +575,25 @@ procedure DoScrollLine(y1,y2,xl,xh:longint);
|
||||
}
|
||||
var
|
||||
Temp : string;
|
||||
len,
|
||||
idx,
|
||||
OldAttr,
|
||||
x,attr : longint;
|
||||
begin
|
||||
ttyGotoXY(xl,y2);
|
||||
{ precalc ConsoleBuf[] y-offset }
|
||||
idx:=(y1-1)*ScreenWidth-1;
|
||||
{ update screen }
|
||||
OldAttr:=$ff;
|
||||
Temp:='';
|
||||
For x:=xl To xh Do
|
||||
Begin
|
||||
attr:=ScrnCol[y1,x];
|
||||
if attr<>OldAttr then
|
||||
attr:=ConsoleBuf^[idx+x].attr;
|
||||
if (attr<>OldAttr) and (not Redir) then
|
||||
begin
|
||||
temp:=temp+Attr2Ansi(Attr,OldAttr);
|
||||
OldAttr:=Attr;
|
||||
end;
|
||||
Temp:=Temp+Scrn[y1,x];
|
||||
Temp:=Temp+ConsoleBuf^[idx+x].ch;
|
||||
if (x=xh) or (length(Temp)>240) then
|
||||
begin
|
||||
LineWrite(Temp);
|
||||
@ -592,9 +601,7 @@ begin
|
||||
end;
|
||||
End;
|
||||
{Update memory copy}
|
||||
len:=xh-xl+1;
|
||||
Move(Scrn[y1,xl],Scrn[y2,xl],len);
|
||||
Move(ScrnCol[y1,xl],ScrnCol[y2,xl],len);
|
||||
Move(ConsoleBuf^[(y1-1)*ScreenWidth+xl-1],ConsoleBuf^[(y2-1)*ScreenWidth+xl-1],(xh-xl+1)*2);
|
||||
end;
|
||||
|
||||
|
||||
@ -686,10 +693,8 @@ Procedure ClrScr;
|
||||
Clear the current window, and set the cursor on x1,y1
|
||||
}
|
||||
Var
|
||||
CY : Integer;
|
||||
CY,i : Longint;
|
||||
oldflush : boolean;
|
||||
I : Integer;
|
||||
|
||||
Begin
|
||||
{ See if color has changed }
|
||||
if OldTextAttr<>TextAttr then
|
||||
@ -705,8 +710,7 @@ Begin
|
||||
ttySendStr(#27'[H'#27'[2J');
|
||||
CurrX:=1;
|
||||
CurrY:=1;
|
||||
FillChar(Scrn,sizeof(Scrn),' ');
|
||||
FillChar(ScrnCol,sizeof(ScrnCol),TextAttr);
|
||||
FillWord(ConsoleBuf^,ScreenWidth*ScreenHeight,(TextAttr shl 8)+ord(' '));
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -847,7 +851,7 @@ var
|
||||
|
||||
Procedure PushKey(Ch:char);
|
||||
Var
|
||||
Tmp : Word;
|
||||
Tmp : Longint;
|
||||
Begin
|
||||
Tmp:=KeyPut;
|
||||
Inc(KeyPut);
|
||||
@ -1407,6 +1411,26 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
Procedure GetConsoleBuf;
|
||||
var
|
||||
WinInfo : TWinSize;
|
||||
begin
|
||||
if Assigned(ConsoleBuf) then
|
||||
FreeMem(ConsoleBuf,ScreenHeight*ScreenWidth*2);
|
||||
if (not Redir) and IOCtl(TextRec(Output).Handle,TIOCGWINSZ,@Wininfo) then
|
||||
begin
|
||||
ScreenWidth:=Wininfo.ws_col;
|
||||
ScreenHeight:=Wininfo.ws_row;
|
||||
end
|
||||
else
|
||||
begin
|
||||
ScreenWidth:=80;
|
||||
ScreenHeight:=25;
|
||||
end;
|
||||
GetMem(ConsoleBuf,ScreenHeight*ScreenWidth*2);
|
||||
FillChar(ConsoleBuf^,ScreenHeight*ScreenWidth*2,0);
|
||||
end;
|
||||
|
||||
|
||||
Procedure CrtExit;
|
||||
{
|
||||
@ -1415,6 +1439,9 @@ Procedure CrtExit;
|
||||
Begin
|
||||
ttyFlushOutput;
|
||||
SetRawMode(False);
|
||||
{ remove console buf }
|
||||
if Assigned(ConsoleBuf) then
|
||||
FreeMem(ConsoleBuf,ScreenHeight*ScreenWidth*2);
|
||||
ExitProc:=ExitSave;
|
||||
End;
|
||||
|
||||
@ -1433,8 +1460,8 @@ Begin
|
||||
TextRec(Input).Handle:=StdInputHandle;
|
||||
{ Are we redirected to a file ? }
|
||||
Redir:=not IsAtty(TextRec(Output).Handle);
|
||||
{Set default Terminal Settings}
|
||||
SetRawMode(True);
|
||||
{ Get Size of terminal }
|
||||
GetConsoleBuf;
|
||||
{Get Current X&Y or Reset to Home}
|
||||
if Redir then
|
||||
begin
|
||||
@ -1443,6 +1470,9 @@ Begin
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ Set default Terminal Settings }
|
||||
SetRawMode(True);
|
||||
{ Get current X,Y if not set already }
|
||||
GetXY(CurrX,CurrY);
|
||||
if (CurrX=0) then
|
||||
begin
|
||||
@ -1456,7 +1486,11 @@ Begin
|
||||
End.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.8 1998-08-28 11:00:20 peter
|
||||
Revision 1.9 1998-10-15 08:31:53 peter
|
||||
+ get winsize at startup
|
||||
+ ConsoleBuf to interface
|
||||
|
||||
Revision 1.8 1998/08/28 11:00:20 peter
|
||||
* fixed #8 writing
|
||||
|
||||
Revision 1.7 1998/07/04 11:17:18 peter
|
||||
@ -1477,7 +1511,4 @@ End.
|
||||
Revision 1.2 1998/04/05 13:56:54 peter
|
||||
- fixed mouse to compile with $i386_att
|
||||
+ linux crt supports redirecting (not Esc-codes anymore)
|
||||
|
||||
Revision 1.1.1.1 1998/03/25 11:18:43 root
|
||||
* Restored version
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user