]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/TerminalDxe: Optimize TtyTerm cursor motion
authorBrian J. Johnson <bjohnson@sgi.com>
Fri, 7 Oct 2016 14:53:59 +0000 (22:53 +0800)
committerFeng Tian <feng.tian@intel.com>
Thu, 27 Oct 2016 01:11:15 +0000 (09:11 +0800)
For TtyTerm terminals, output a shorter escape sequence when possible
to move the cursor within the current line, and don't print any escape
sequence if the cursor is already at the correct position.  This
removes extra cursor motion activity at the EFI shell prompt,
improving performance.  It also makes it possible in many cases to
successfully use a terminal window which is taller than the driver's
mode setting (eg. 80x25.)

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Brian Johnson <bjohnson@sgi.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Tested-by: Ryan Harkin <ryan.harkin@linaro.org>
Reviewed-by: Feng Tian <feng.tian@intel.com>
MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c

index 269d2aeb5a08311b7c5a037ba31a39474a7113d8..3ee396984e6a8a95374aa8e2190d561ddb637425 100644 (file)
@@ -2,6 +2,7 @@
   Header file for Terminal driver.\r
 \r
 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (C) 2016 Silicon Graphics, Inc. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -157,6 +158,7 @@ typedef union {
 #define BACKGROUND_CONTROL_OFFSET 11\r
 #define ROW_OFFSET                2\r
 #define COLUMN_OFFSET             5\r
+#define FW_BACK_OFFSET            2\r
 \r
 typedef struct {\r
   UINT16  Unicode;\r
index b11e83f4f24a648ac3015f4f87a21a2c8806a44b..e9b5ed07cf00e432659cdb26ade44716efd97145 100644 (file)
@@ -83,6 +83,8 @@ CHAR16 mSetModeString[]            = { ESC, '[', '=', '3', 'h', 0 };
 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
@@ -755,6 +757,7 @@ TerminalConOutSetCursorPosition (
   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
@@ -782,13 +785,36 @@ TerminalConOutSetCursorPosition (
   //\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