mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 17:06:29 +00:00
[SACDRV]: A few more ANSI commands. Also now that I grok ANSI, CursorX and CursorY were actually back/fore colors. Also define cursor flags/attributes that SAC supports (bold, inverted, blinking).
WANTED: The fact that the SAC developers cherry-picked *which* ANSI standard and VT standard they were going to follow, threw in ANSI.SYS compatibility, and then added a bunch of bugs, makes me wonder if real people use SAC on Windows... svn path=/trunk/; revision=59826
This commit is contained in:
parent
5027e45444
commit
02ed8a9b93
|
@ -175,6 +175,13 @@
|
|||
#define SAC_CHANNEL_FLAG_REDRAW_EVENT 0x10
|
||||
#define SAC_CHANNEL_FLAG_APPLICATION 0x20
|
||||
|
||||
//
|
||||
// Cursor Flags
|
||||
//
|
||||
#define SAC_CURSOR_FLAG_BLINK 1
|
||||
#define SAC_CURSOR_FLAG_BOLD 2
|
||||
#define SAC_CURSOR_FLAG_INVERTED 4
|
||||
|
||||
//
|
||||
// Forward definitions
|
||||
//
|
||||
|
@ -226,6 +233,8 @@ typedef enum _SAC_ANSI_COMMANDS
|
|||
SacEraseEndOfScreen,
|
||||
SacEraseStartOfScreen,
|
||||
SacEraseScreen,
|
||||
SacSetCursorPosition,
|
||||
SacSetScrollRegion,
|
||||
SacSetBackgroundColor = 21,
|
||||
SacSetFontColor
|
||||
} SAC_ANSI_COMMANDS;
|
||||
|
@ -272,9 +281,9 @@ typedef struct _SAC_CHANNEL_LOCK
|
|||
//
|
||||
typedef struct _SAC_CURSOR_DATA
|
||||
{
|
||||
UCHAR CursorX;
|
||||
UCHAR CursorY;
|
||||
UCHAR CursorVisible;
|
||||
UCHAR CursorBackColor;
|
||||
UCHAR CursorColor;
|
||||
UCHAR CursorFlags;
|
||||
WCHAR CursorValue;
|
||||
} SAC_CURSOR_DATA, *PSAC_CURSOR_DATA;
|
||||
C_ASSERT(sizeof(SAC_CURSOR_DATA) == 6);
|
||||
|
@ -403,9 +412,9 @@ typedef struct _SAC_CHANNEL
|
|||
LONG ChannelHasNewIBufferData;
|
||||
UCHAR CursorRow;
|
||||
UCHAR CursorCol;
|
||||
UCHAR CursorY;
|
||||
UCHAR CursorX;
|
||||
UCHAR CursorVisible;
|
||||
UCHAR CursorColor;
|
||||
UCHAR CursorBackColor;
|
||||
UCHAR CursorFlags;
|
||||
PCHAR OBuffer;
|
||||
ULONG OBufferIndex;
|
||||
ULONG OBufferFirstGoodIndex;
|
||||
|
|
|
@ -161,6 +161,9 @@ typedef enum _VT_ANSI_ATTRIBUTES
|
|||
|
||||
#define VT_ANSI_SET_ATTRIBUTE_CHAR L'm'
|
||||
#define VT_ANSI_SEPARATOR_CHAR L';'
|
||||
#define VT_ANSI_HVP_CURSOR_CHAR L'f'
|
||||
#define VT_ANSI_CUP_CURSOR_CHAR L'H'
|
||||
#define VT_ANSI_SCROLL_CHAR L'r'
|
||||
|
||||
SAC_STATIC_ESCAPE_STRING SacStaticEscapeStrings [] =
|
||||
{
|
||||
|
@ -343,8 +346,8 @@ VTUTF8ChannelConsumeEscapeSequence(IN PSAC_CHANNEL Channel,
|
|||
}
|
||||
|
||||
if (*Sequence != VT_ANSI_SEPARATOR_CHAR) return 0;
|
||||
Sequence++;
|
||||
|
||||
Sequence++;
|
||||
if (!VTUTF8ChannelScanForNumber(Sequence, &Number2)) return 0;
|
||||
while ((*Sequence >= L'0') && (*Sequence <= L'9')) Sequence++;
|
||||
|
||||
|
@ -354,9 +357,9 @@ VTUTF8ChannelConsumeEscapeSequence(IN PSAC_CHANNEL Channel,
|
|||
goto ProcessString;
|
||||
}
|
||||
|
||||
if (*Sequence == L'H')
|
||||
if (*Sequence == VT_ANSI_CUP_CURSOR_CHAR)
|
||||
{
|
||||
Action = 18;
|
||||
Action = SacSetCursorPosition;
|
||||
goto ProcessString;
|
||||
}
|
||||
|
||||
|
@ -364,15 +367,16 @@ VTUTF8ChannelConsumeEscapeSequence(IN PSAC_CHANNEL Channel,
|
|||
|
||||
Sequence++;
|
||||
|
||||
if ((*Sequence == L'H') || (*Sequence == L'f'))
|
||||
if ((*Sequence == VT_ANSI_CUP_CURSOR_CHAR) ||
|
||||
(*Sequence == VT_ANSI_HVP_CURSOR_CHAR))
|
||||
{
|
||||
Action = 18;
|
||||
Action = SacSetCursorPosition;
|
||||
goto ProcessString;
|
||||
}
|
||||
|
||||
if (*Sequence == L'r')
|
||||
if (*Sequence == VT_ANSI_SCROLL_CHAR)
|
||||
{
|
||||
Action = 19;
|
||||
Action = SacSetScrollRegion;
|
||||
goto ProcessString;
|
||||
}
|
||||
|
||||
|
@ -394,7 +398,7 @@ ProcessString:
|
|||
VTUTF8ChannelAssertCursor(Channel);
|
||||
switch (Action)
|
||||
{
|
||||
case 0:
|
||||
case SacCursorUp:
|
||||
if (Channel->CursorRow < Number)
|
||||
{
|
||||
Channel->CursorRow = 0;
|
||||
|
@ -406,7 +410,7 @@ ProcessString:
|
|||
VTUTF8ChannelAssertCursor(Channel);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
case SacCursorDown:
|
||||
if (Channel->CursorRow >= SAC_VTUTF8_ROW_HEIGHT)
|
||||
{
|
||||
Channel->CursorRow = SAC_VTUTF8_ROW_HEIGHT;
|
||||
|
@ -418,7 +422,7 @@ ProcessString:
|
|||
VTUTF8ChannelAssertCursor(Channel);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
case SacCursorLeft:
|
||||
if (Channel->CursorCol < Number)
|
||||
{
|
||||
Channel->CursorCol = 0;
|
||||
|
@ -430,7 +434,7 @@ ProcessString:
|
|||
VTUTF8ChannelAssertCursor(Channel);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case SacCursorRight:
|
||||
if (Channel->CursorCol >= SAC_VTUTF8_COL_WIDTH)
|
||||
{
|
||||
Channel->CursorCol = SAC_VTUTF8_COL_WIDTH;
|
||||
|
@ -442,110 +446,110 @@ ProcessString:
|
|||
VTUTF8ChannelAssertCursor(Channel);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
Channel->CursorVisible = 0;
|
||||
Channel->CursorX = 40;
|
||||
Channel->CursorY = 37;
|
||||
case SacFontNormal:
|
||||
Channel->CursorFlags = 0;
|
||||
Channel->CursorBackColor = SetBackColorBlack;
|
||||
Channel->CursorColor = SetColorWhite;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
Channel->CursorVisible |= 1;
|
||||
case SacFontBlink:
|
||||
Channel->CursorFlags |= SAC_CURSOR_FLAG_BLINK;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
Channel->CursorVisible &= ~1;
|
||||
case SacFontBlinkOff:
|
||||
Channel->CursorFlags &= ~SAC_CURSOR_FLAG_BLINK;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
Channel->CursorVisible |= 2;
|
||||
case SacFontBold:
|
||||
Channel->CursorFlags |= SAC_CURSOR_FLAG_BOLD;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
Channel->CursorVisible &= ~2;
|
||||
case SacFontBoldOff:
|
||||
Channel->CursorFlags &= ~SAC_CURSOR_FLAG_BOLD;
|
||||
break;
|
||||
|
||||
case 9:
|
||||
Channel->CursorVisible |= 4;
|
||||
case SacFontInverse:
|
||||
Channel->CursorFlags |= SAC_CURSOR_FLAG_INVERTED;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
Channel->CursorVisible &= ~4;
|
||||
case SacFontInverseOff:
|
||||
Channel->CursorFlags &= ~SAC_CURSOR_FLAG_INVERTED;
|
||||
break;
|
||||
|
||||
case 12:
|
||||
case SacEraseEndOfLine:
|
||||
for (i = Channel->CursorCol; i < SAC_VTUTF8_COL_WIDTH; i++)
|
||||
{
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorVisible = Channel->CursorVisible;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorFlags = Channel->CursorFlags;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorX = Channel->CursorY;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorBackColor = Channel->CursorColor;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorY = Channel->CursorX;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorColor = Channel->CursorBackColor;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorValue = ' ';
|
||||
}
|
||||
break;
|
||||
|
||||
case 13:
|
||||
case SacEraseStartOfLine:
|
||||
for (i = 0; i < (Channel->CursorCol + 1); i++)
|
||||
{
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorVisible = Channel->CursorVisible;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorFlags = Channel->CursorFlags;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorX = Channel->CursorY;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorBackColor = Channel->CursorColor;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorY = Channel->CursorX;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorColor = Channel->CursorBackColor;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorValue = ' ';
|
||||
}
|
||||
break;
|
||||
|
||||
case 14:
|
||||
case SacEraseLine:
|
||||
for (i = 0; i < SAC_VTUTF8_COL_WIDTH; i++)
|
||||
{
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorVisible = Channel->CursorVisible;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorFlags = Channel->CursorFlags;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorX = Channel->CursorY;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorBackColor = Channel->CursorColor;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorY = Channel->CursorX;
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorColor = Channel->CursorBackColor;
|
||||
Cursor[(Channel->CursorRow * SAC_VTUTF8_COL_WIDTH) +
|
||||
(i * SAC_VTUTF8_ROW_HEIGHT)].CursorValue = ' ';
|
||||
}
|
||||
break;
|
||||
|
||||
case 15:
|
||||
case SacEraseEndOfScreen:
|
||||
break;
|
||||
|
||||
case 16:
|
||||
case SacEraseStartOfScreen:
|
||||
break;
|
||||
|
||||
case 17:
|
||||
case SacEraseScreen:
|
||||
break;
|
||||
|
||||
case 18:
|
||||
case SacSetCursorPosition:
|
||||
break;
|
||||
|
||||
case 19:
|
||||
case SacSetScrollRegion:
|
||||
break;
|
||||
|
||||
case 20:
|
||||
Channel->CursorY = Number;
|
||||
Channel->CursorX = Number2;
|
||||
Channel->CursorColor = Number;
|
||||
Channel->CursorBackColor = Number2;
|
||||
break;
|
||||
|
||||
case 21:
|
||||
Channel->CursorX = Number;
|
||||
case SacSetBackgroundColor:
|
||||
Channel->CursorBackColor = Number;
|
||||
break;
|
||||
|
||||
case 22:
|
||||
Channel->CursorY = Number;
|
||||
case SacSetFontColor:
|
||||
Channel->CursorColor = Number;
|
||||
break;
|
||||
|
||||
case 23:
|
||||
Channel->CursorVisible = Number;
|
||||
Channel->CursorY = Number2;
|
||||
Channel->CursorX = Number3;
|
||||
Channel->CursorFlags = Number;
|
||||
Channel->CursorColor = Number2;
|
||||
Channel->CursorBackColor = Number3;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -563,13 +567,13 @@ VTUTF8ChannelOInit(IN PSAC_CHANNEL Channel)
|
|||
CHECK_PARAMETER(Channel);
|
||||
|
||||
/* Set the current channel cursor parameters */
|
||||
Channel->CursorVisible = 0;
|
||||
Channel->CursorX = 40;
|
||||
Channel->CursorY = 37;
|
||||
Channel->CursorFlags = 0;
|
||||
Channel->CursorBackColor = SetBackColorBlack;
|
||||
Channel->CursorColor = SetColorWhite;
|
||||
|
||||
/* Loop the output buffer height by width */
|
||||
Cursor = (PSAC_CURSOR_DATA)Channel->OBuffer;
|
||||
y = SAC_VTUTF8_COL_HEIGHT - 1;
|
||||
y = SAC_VTUTF8_ROW_HEIGHT;
|
||||
do
|
||||
{
|
||||
x = SAC_VTUTF8_COL_WIDTH;
|
||||
|
@ -577,8 +581,8 @@ VTUTF8ChannelOInit(IN PSAC_CHANNEL Channel)
|
|||
{
|
||||
/* For every character, set the defaults */
|
||||
Cursor->CursorValue = ' ';
|
||||
Cursor->CursorX = 40;
|
||||
Cursor->CursorY = 38;
|
||||
Cursor->CursorBackColor = SetBackColorBlack;
|
||||
Cursor->CursorColor = SetColorWhite;
|
||||
|
||||
/* Move to the next character */
|
||||
Cursor++;
|
||||
|
|
Loading…
Reference in a new issue