mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-07-28 01:27:58 +02:00
254 lines
6.3 KiB
ObjectPascal
254 lines
6.3 KiB
ObjectPascal
{
|
|
$Id$
|
|
|
|
System independent low-level video interface
|
|
Based on Daniel Mantion's interface designs
|
|
|
|
Copyright (c) 1997 Balazs Scheidler (bazsi@balabit.hu)
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public
|
|
License along with this library; if not, write to the Free
|
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
****************************************************************************
|
|
|
|
Todo:
|
|
- getting escape sequences from termcap
|
|
|
|
****************************************************************************}
|
|
unit Video;
|
|
|
|
interface
|
|
|
|
uses
|
|
ApiComm;
|
|
|
|
{$i platform.inc}
|
|
|
|
type
|
|
PVideoMode = ^TVideoMode;
|
|
TVideoMode = record
|
|
Col,Row : Word;
|
|
Color : Boolean;
|
|
end;
|
|
TVideoModeSelector = function (const VideoMode: TVideoMode; Params: Longint): Boolean;
|
|
|
|
TVideoCell = Word;
|
|
PVideoCell = ^TVideoCell;
|
|
|
|
TVideoBuf = array[0..32759] of TVideoCell;
|
|
PVideoBuf = ^TVideoBuf;
|
|
|
|
const
|
|
{ Foreground and background color constants }
|
|
Black = 0;
|
|
Blue = 1;
|
|
Green = 2;
|
|
Cyan = 3;
|
|
Red = 4;
|
|
Magenta = 5;
|
|
Brown = 6;
|
|
LightGray = 7;
|
|
|
|
{ Foreground color constants }
|
|
DarkGray = 8;
|
|
LightBlue = 9;
|
|
LightGreen = 10;
|
|
LightCyan = 11;
|
|
LightRed = 12;
|
|
LightMagenta = 13;
|
|
Yellow = 14;
|
|
White = 15;
|
|
|
|
{ Add-in for blinking }
|
|
Blink = 128;
|
|
|
|
{ Capabilities bitmask }
|
|
cpUnderLine = $0001;
|
|
cpBlink = $0002;
|
|
cpColor = $0004;
|
|
cpChangeFont = $0008;
|
|
cpChangeMode = $0010;
|
|
cpChangeCursor = $0020;
|
|
|
|
{ Possible cursor types }
|
|
crHidden = 0;
|
|
crUnderLine = 1;
|
|
crBlock = 2;
|
|
crHalfBlock = 3;
|
|
|
|
{ Possible error codes }
|
|
vioOK = 0;
|
|
errVioInit = errVioBase + 1; { Initialization error, shouldn't occur on DOS, but may
|
|
on Linux }
|
|
errVioNotSupported = errVioBase + 2; { call to an unsupported function }
|
|
errVioNoSuchMode = errVioBase + 3; { No such video mode }
|
|
|
|
const
|
|
ScreenWidth : Word = 0;
|
|
ScreenHeight : Word = 0;
|
|
|
|
var
|
|
ScreenColor : Boolean;
|
|
CursorX,
|
|
CursorY : Word;
|
|
LockUpdateScreen : Word;
|
|
VideoBuf : PVideoBuf;
|
|
VideoBufSize : Longint;
|
|
CursorLines : Byte;
|
|
const
|
|
LowAscii : Boolean = true;
|
|
NoExtendedFrame : Boolean = false;
|
|
FVMaxWidth = 132;
|
|
|
|
procedure InitVideo;
|
|
{ Initializes the video subsystem }
|
|
procedure DoneVideo;
|
|
{ Deinitializes the video subsystem }
|
|
function GetCapabilities: Word;
|
|
{ Return the capabilities of the current environment }
|
|
procedure ClearScreen;
|
|
{ Clears the screen }
|
|
procedure UpdateScreen(Force: Boolean);
|
|
{ Force specifies whether the whole screen has to be redrawn, or (if target
|
|
platform supports it) its parts only }
|
|
procedure SetCursorPos(NewCursorX, NewCursorY: Word);
|
|
{ Position the cursor to the given position }
|
|
function GetCursorType: Word;
|
|
{ Return the cursor type: Hidden, UnderLine or Block }
|
|
procedure SetCursorType(NewType: Word);
|
|
{ Set the cursor to the given type }
|
|
function DefaultVideoModeSelector(const VideoMode: TVideoMode; Params: Longint): Boolean;
|
|
|
|
procedure GetVideoMode(var Mode: TVideoMode);
|
|
{ Return dimensions of the current video mode }
|
|
procedure SetVideoMode(Mode: TVideoMode);
|
|
{ Set video-mode to have Mode dimensions, may return errVioNoSuchMode }
|
|
procedure RegisterVideoMode(Col, Row: Word; Color: Boolean; VideoModeSelector: TVideoModeSelector; Params: Longint);
|
|
{ Registers a video mode to be selectable by SetVideoMode }
|
|
|
|
{ moved to interface because we need a way to retrieve the modes }
|
|
{ System independent part }
|
|
type
|
|
PVideoModeList = ^TVideoModeList;
|
|
TVideoModeList = record
|
|
Col, Row: Word;
|
|
Color: Boolean;
|
|
VideoModeSelector: TVideoModeSelector;
|
|
Params: Longint;
|
|
Next: PVideoModeList;
|
|
end;
|
|
|
|
const
|
|
Modes: PVideoModeList = nil;
|
|
{$ifdef go32v2}
|
|
var
|
|
VideoSeg : word;
|
|
{$endif go32v2}
|
|
implementation
|
|
|
|
|
|
{ Include system dependent part }
|
|
{ must declare TargetEntry and TargetExit procedures
|
|
which can be empty of course }
|
|
{$i video.inc}
|
|
|
|
procedure GetVideoMode(var Mode: TVideoMode);
|
|
begin
|
|
Mode.Col := ScreenWidth;
|
|
Mode.Row := ScreenHeight;
|
|
Mode.Color := ScreenColor;
|
|
end;
|
|
|
|
procedure SetVideoMode(Mode: TVideoMode);
|
|
var
|
|
P: PVideoModeList;
|
|
begin
|
|
P := Modes;
|
|
while (P<>Nil) and ((P^.Row <> Mode.Row) or (P^.Col <> Mode.Col) or (P^.Color<>Mode.Color)) do
|
|
P := P^.Next;
|
|
if P <> nil then begin
|
|
DoneVideo;
|
|
ScreenWidth:=$ffff;
|
|
ScreenHeight:=$ffff;
|
|
P^.VideoModeSelector(PVideoMode(P)^, P^.Params);
|
|
InitVideo;
|
|
end
|
|
else begin
|
|
ErrorHandler(errVioNoSuchMode, @Mode);
|
|
end;
|
|
end;
|
|
|
|
procedure RegisterVideoMode(Col, Row: Word; Color: Boolean; VideoModeSelector: TVideoModeSelector; Params: Longint);
|
|
var
|
|
P: PVideoModeList;
|
|
begin
|
|
New(P);
|
|
P^.Col := Col;
|
|
P^.Row := Row;
|
|
P^.Color := Color;
|
|
P^.VideoModeSelector := VideoModeSelector;
|
|
P^.Params := Params;
|
|
P^.Next := Modes;
|
|
Modes := P;
|
|
end;
|
|
|
|
|
|
var
|
|
OldExitProc : pointer;
|
|
|
|
procedure UnRegisterVideoModes;{$ifdef PPC_BP}far;{$endif}
|
|
var
|
|
P: PVideoModeList;
|
|
begin
|
|
ExitProc:=OldExitProc;
|
|
TargetExit;
|
|
while assigned(modes) do
|
|
begin
|
|
p:=modes;
|
|
modes:=modes^.next;
|
|
dispose(p);
|
|
end;
|
|
end;
|
|
|
|
|
|
begin
|
|
RegisterVideoModes;
|
|
TargetEntry;
|
|
OldExitProc:=ExitProc;
|
|
ExitProc:=@UnRegisterVideoModes;
|
|
end.
|
|
{
|
|
$Log$
|
|
Revision 1.6 2000-11-13 17:22:22 pierre
|
|
merge NoExtendedFrame
|
|
|
|
Revision 1.1.2.4 2000/11/09 08:49:22 pierre
|
|
+ NoExtendedFrame for terminals with only one graphic set
|
|
|
|
Revision 1.5 2000/10/15 20:50:17 hajny
|
|
* TVideoBuf again TP-compatible
|
|
|
|
Revision 1.4 2000/10/15 09:22:40 peter
|
|
* FVMaxWidth
|
|
|
|
Revision 1.3 2000/10/04 11:53:31 pierre
|
|
Add TargetEntry and TargetExit (merged)
|
|
|
|
Revision 1.2 2000/09/24 19:52:21 hajny
|
|
* max TVideoBuf size extended
|
|
|
|
Revision 1.1 2000/07/13 06:29:39 michael
|
|
+ Initial import
|
|
|
|
} |