Blame SOURCES/0013-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch

eb7fe6
From 2909e025db6878723b49644a8a0cf160d07e6444 Mon Sep 17 00:00:00 2001
eb7fe6
From: Laszlo Ersek <lersek@redhat.com>
eb7fe6
Date: Tue, 25 Feb 2014 22:40:01 +0100
eb7fe6
Subject: MdeModulePkg: TerminalDxe: set xterm resolution on mode change (RH
eb7fe6
 only)
eb7fe6
eb7fe6
The
eb7fe6
eb7fe6
  CSI Ps ; Ps ; Ps t
eb7fe6
eb7fe6
escape sequence serves for window manipulation. We can use the
eb7fe6
eb7fe6
  CSI 8 ; <rows> ; <columns> t
eb7fe6
eb7fe6
sequence to adapt eg. the xterm window size to the selected console mode.
eb7fe6
eb7fe6
Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase:
eb7fe6
eb7fe6
- refresh commit 519b9751573e against various context changes
eb7fe6
eb7fe6
Reference: <http://rtfm.etla.org/xterm/ctlseq.html>
eb7fe6
Contributed-under: TianoCore Contribution Agreement 1.0
eb7fe6
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
eb7fe6
---
eb7fe6
 MdeModulePkg/MdeModulePkg.dec                      |  4 +++
eb7fe6
 .../Universal/Console/TerminalDxe/TerminalConOut.c | 30 ++++++++++++++++++++++
eb7fe6
 .../Universal/Console/TerminalDxe/TerminalDxe.inf  |  2 ++
eb7fe6
 3 files changed, 36 insertions(+)
eb7fe6
eb7fe6
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
eb7fe6
index 426634f..b4a7c3a 100644
eb7fe6
--- a/MdeModulePkg/MdeModulePkg.dec
eb7fe6
+++ b/MdeModulePkg/MdeModulePkg.dec
eb7fe6
@@ -1702,6 +1702,10 @@
eb7fe6
   # @Prompt A list of system FMP ImageTypeId GUIDs
eb7fe6
   gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid|{0x0}|VOID*|0x30001046
eb7fe6
 
eb7fe6
+  ## Controls whether TerminalDxe outputs an XTerm resize sequence on terminal
eb7fe6
+  #  mode change.
eb7fe6
+  gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE|BOOLEAN|0x00010080
eb7fe6
+
eb7fe6
 [PcdsPatchableInModule]
eb7fe6
   ## Specify memory size with page number for PEI code when
eb7fe6
   #  Loading Module at Fixed Address feature is enabled.
eb7fe6
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
eb7fe6
index e677a76..e2bdc31 100644
eb7fe6
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
eb7fe6
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
eb7fe6
@@ -13,6 +13,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
eb7fe6
 
eb7fe6
 **/
eb7fe6
 
eb7fe6
+#include <Library/PrintLib.h>
eb7fe6
+
eb7fe6
 #include "Terminal.h"
eb7fe6
 
eb7fe6
 //
eb7fe6
@@ -87,6 +89,16 @@ CHAR16 mCursorForwardString[]      = { ESC, '[', '0', '0', 'C', 0 };
eb7fe6
 CHAR16 mCursorBackwardString[]     = { ESC, '[', '0', '0', 'D', 0 };
eb7fe6
 
eb7fe6
 //
eb7fe6
+// Note that this is an ASCII format string, taking two INT32 arguments:
eb7fe6
+// rows, columns.
eb7fe6
+//
eb7fe6
+// A %d (INT32) format specification can expand to at most 11 characters.
eb7fe6
+//
eb7fe6
+CHAR8 mResizeTextAreaFormatString[] = "\x1B[8;%d;%dt";
eb7fe6
+#define RESIZE_SEQ_SIZE (sizeof mResizeTextAreaFormatString + 2 * (11 - 2))
eb7fe6
+
eb7fe6
+
eb7fe6
+//
eb7fe6
 // Body of the ConOut functions
eb7fe6
 //
eb7fe6
 
eb7fe6
@@ -508,6 +520,24 @@ TerminalConOutSetMode (
eb7fe6
     return EFI_DEVICE_ERROR;
eb7fe6
   }
eb7fe6
 
eb7fe6
+  if (PcdGetBool (PcdResizeXterm)) {
eb7fe6
+    CHAR16 ResizeSequence[RESIZE_SEQ_SIZE];
eb7fe6
+
eb7fe6
+    UnicodeSPrintAsciiFormat (
eb7fe6
+      ResizeSequence,
eb7fe6
+      sizeof ResizeSequence,
eb7fe6
+      mResizeTextAreaFormatString,
eb7fe6
+      (INT32) TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows,
eb7fe6
+      (INT32) TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns
eb7fe6
+      );
eb7fe6
+    TerminalDevice->OutputEscChar = TRUE;
eb7fe6
+    Status                        = This->OutputString (This, ResizeSequence);
eb7fe6
+    TerminalDevice->OutputEscChar = FALSE;
eb7fe6
+    if (EFI_ERROR (Status)) {
eb7fe6
+      return EFI_DEVICE_ERROR;
eb7fe6
+    }
eb7fe6
+  }
eb7fe6
+
eb7fe6
   This->Mode->Mode  = (INT32) ModeNumber;
eb7fe6
 
eb7fe6
   Status            = This->ClearScreen (This);
eb7fe6
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
eb7fe6
index 0780296..bd2ba82 100644
eb7fe6
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
eb7fe6
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
eb7fe6
@@ -60,6 +60,7 @@
eb7fe6
   DebugLib
eb7fe6
   PcdLib
eb7fe6
   BaseLib
eb7fe6
+  PrintLib
eb7fe6
 
eb7fe6
 [Guids]
eb7fe6
   ## SOMETIMES_PRODUCES ## Variable:L"ConInDev"
eb7fe6
@@ -88,6 +89,7 @@
eb7fe6
 [Pcd]
eb7fe6
   gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType           ## SOMETIMES_CONSUMES
eb7fe6
   gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable    ## CONSUMES
eb7fe6
+  gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm             ## CONSUMES
eb7fe6
 
eb7fe6
 # [Event]
eb7fe6
 # # Relative timer event set by UnicodeToEfiKey(), used to be one 2 seconds input timeout.
eb7fe6
-- 
eb7fe6
1.8.3.1
eb7fe6