CHAR16 mSetAttributeString[] = { ESC, '[', '0', 'm', ESC, '[', '4', '0', 'm', ESC, '[', '4', '0', 'm', 0 };\r
CHAR16 mClearScreenString[] = { ESC, '[', '2', 'J', 0 };\r
CHAR16 mSetCursorPositionString[] = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0 };\r
+CHAR16 mCursorForwardString[] = { ESC, '[', '0', '0', 'C', 0 };\r
+CHAR16 mCursorBackwardString[] = { ESC, '[', '0', '0', 'D', 0 };\r
\r
//\r
// Body of the ConOut functions\r
UINTN MaxRow;\r
EFI_STATUS Status;\r
TERMINAL_DEV *TerminalDevice;\r
+ CHAR16 *String;\r
\r
TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);\r
\r
//\r
// control sequence to move the cursor\r
//\r
- mSetCursorPositionString[ROW_OFFSET + 0] = (CHAR16) ('0' + ((Row + 1) / 10));\r
- mSetCursorPositionString[ROW_OFFSET + 1] = (CHAR16) ('0' + ((Row + 1) % 10));\r
- mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16) ('0' + ((Column + 1) / 10));\r
- mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16) ('0' + ((Column + 1) % 10));\r
+ // Optimize cursor motion control sequences for TtyTerm. Move\r
+ // within the current line if possible, and don't output anyting if\r
+ // it isn't necessary.\r
+ //\r
+ if (TerminalDevice->TerminalType == TTYTERMTYPE &&\r
+ Mode->CursorRow == Row) {\r
+ if (Mode->CursorColumn > Column) {\r
+ mCursorBackwardString[FW_BACK_OFFSET + 0] = (CHAR16) ('0' + ((Mode->CursorColumn - Column) / 10));\r
+ mCursorBackwardString[FW_BACK_OFFSET + 1] = (CHAR16) ('0' + ((Mode->CursorColumn - Column) % 10));\r
+ String = mCursorBackwardString;\r
+ }\r
+ else if (Column > Mode->CursorColumn) {\r
+ mCursorForwardString[FW_BACK_OFFSET + 0] = (CHAR16) ('0' + ((Column - Mode->CursorColumn) / 10));\r
+ mCursorForwardString[FW_BACK_OFFSET + 1] = (CHAR16) ('0' + ((Column - Mode->CursorColumn) % 10));\r
+ String = mCursorForwardString;\r
+ }\r
+ else {\r
+ String = L""; // No cursor motion necessary\r
+ }\r
+ }\r
+ else {\r
+ mSetCursorPositionString[ROW_OFFSET + 0] = (CHAR16) ('0' + ((Row + 1) / 10));\r
+ mSetCursorPositionString[ROW_OFFSET + 1] = (CHAR16) ('0' + ((Row + 1) % 10));\r
+ mSetCursorPositionString[COLUMN_OFFSET + 0] = (CHAR16) ('0' + ((Column + 1) / 10));\r
+ mSetCursorPositionString[COLUMN_OFFSET + 1] = (CHAR16) ('0' + ((Column + 1) % 10));\r
+ String = mSetCursorPositionString;\r
+ }\r
\r
TerminalDevice->OutputEscChar = TRUE;\r
- Status = This->OutputString (This, mSetCursorPositionString);\r
+ Status = This->OutputString (This, String);\r
TerminalDevice->OutputEscChar = FALSE;\r
\r
if (EFI_ERROR (Status)) {\r