Blame 0008-MdeModulePkg-TerminalDxe-set-xterm-resolution-on-mod.patch

0a0d662
From 819bac260661159fb0423eaf549cddc567ef2b8c Mon Sep 17 00:00:00 2001
3485002
From: Laszlo Ersek <lersek@redhat.com>
3485002
Date: Tue, 25 Feb 2014 22:40:01 +0100
2941706
Subject: [PATCH] MdeModulePkg: TerminalDxe: set xterm resolution on mode
7ae6f15
 change (RH only)
3485002
3485002
The
3485002
3485002
  CSI Ps ; Ps ; Ps t
3485002
3485002
escape sequence serves for window manipulation. We can use the
3485002
3485002
  CSI 8 ; <rows> ; <columns> t
3485002
3485002
sequence to adapt eg. the xterm window size to the selected console mode.
3485002
3485002
Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase:
3485002
3485002
- refresh commit 519b9751573e against various context changes
3485002
3485002
Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase:
3485002
3485002
- Refresh downstream-only commit 2909e025db68 against "MdeModulePkg.dec"
3485002
  context change from upstream commits e043f7895b83 ("MdeModulePkg: Add
3485002
  PCD PcdPteMemoryEncryptionAddressOrMask", 2017-02-27) and 76081dfcc5b2
3485002
  ("MdeModulePkg: Add PROMPT&HELP string of pcd to UNI file", 2017-03-03).
3485002
3485002
Reference: <http://rtfm.etla.org/xterm/ctlseq.html>
3485002
Contributed-under: TianoCore Contribution Agreement 1.0
3485002
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
3485002
(cherry picked from commit 2909e025db6878723b49644a8a0cf160d07e6444)
7ae6f15
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
3485002
---
7ae6f15
 MdeModulePkg/MdeModulePkg.dec                 |  4 +++
7ae6f15
 .../Console/TerminalDxe/TerminalConOut.c      | 30 +++++++++++++++++++
7ae6f15
 .../Console/TerminalDxe/TerminalDxe.inf       |  2 ++
3485002
 3 files changed, 36 insertions(+)
3485002
3485002
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
0a0d662
index 91a3c60823..0929560b65 100644
3485002
--- a/MdeModulePkg/MdeModulePkg.dec
3485002
+++ b/MdeModulePkg/MdeModulePkg.dec
0a0d662
@@ -2021,6 +2021,10 @@
0a0d662
   # @Prompt TCG Platform Firmware Profile revision.
0a0d662
   gEfiMdeModulePkgTokenSpaceGuid.PcdTcgPfpMeasurementRevision|0|UINT32|0x00010077
3485002
 
3485002
+  ## Controls whether TerminalDxe outputs an XTerm resize sequence on terminal
3485002
+  #  mode change.
3485002
+  gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE|BOOLEAN|0x00010080
3485002
+
3485002
 [PcdsPatchableInModule]
3485002
   ## Specify memory size with page number for PEI code when
3485002
   #  Loading Module at Fixed Address feature is enabled.
3485002
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
0a0d662
index aae470e956..26156857aa 100644
3485002
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
3485002
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
7407978
@@ -7,6 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
3485002
 
3485002
 **/
3485002
 
3485002
+#include <Library/PrintLib.h>
3485002
+
3485002
 #include "Terminal.h"
3485002
 
3485002
 //
7407978
@@ -80,6 +82,16 @@ CHAR16 mSetCursorPositionString[]  = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0
7ae6f15
 CHAR16 mCursorForwardString[]      = { ESC, '[', '0', '0', 'C', 0 };
3485002
 CHAR16 mCursorBackwardString[]     = { ESC, '[', '0', '0', 'D', 0 };
3485002
 
7ae6f15
+//
3485002
+// Note that this is an ASCII format string, taking two INT32 arguments:
3485002
+// rows, columns.
3485002
+//
3485002
+// A %d (INT32) format specification can expand to at most 11 characters.
3485002
+//
3485002
+CHAR8 mResizeTextAreaFormatString[] = "\x1B[8;%d;%dt";
3485002
+#define RESIZE_SEQ_SIZE (sizeof mResizeTextAreaFormatString + 2 * (11 - 2))
3485002
+
3485002
+
7ae6f15
 //
3485002
 // Body of the ConOut functions
3485002
 //
0a0d662
@@ -506,6 +518,24 @@ TerminalConOutSetMode (
3485002
     return EFI_DEVICE_ERROR;
3485002
   }
3485002
 
3485002
+  if (PcdGetBool (PcdResizeXterm)) {
3485002
+    CHAR16 ResizeSequence[RESIZE_SEQ_SIZE];
3485002
+
3485002
+    UnicodeSPrintAsciiFormat (
3485002
+      ResizeSequence,
3485002
+      sizeof ResizeSequence,
3485002
+      mResizeTextAreaFormatString,
3485002
+      (INT32) TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows,
3485002
+      (INT32) TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns
3485002
+      );
3485002
+    TerminalDevice->OutputEscChar = TRUE;
3485002
+    Status                        = This->OutputString (This, ResizeSequence);
3485002
+    TerminalDevice->OutputEscChar = FALSE;
3485002
+    if (EFI_ERROR (Status)) {
3485002
+      return EFI_DEVICE_ERROR;
3485002
+    }
3485002
+  }
3485002
+
3485002
   This->Mode->Mode  = (INT32) ModeNumber;
3485002
 
3485002
   Status            = This->ClearScreen (This);
3485002
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
0a0d662
index b2a8aeba85..eff6253465 100644
3485002
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
3485002
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
7407978
@@ -55,6 +55,7 @@
3485002
   DebugLib
3485002
   PcdLib
3485002
   BaseLib
3485002
+  PrintLib
3485002
 
3485002
 [Guids]
3485002
   ## SOMETIMES_PRODUCES ## Variable:L"ConInDev"
0a0d662
@@ -87,6 +88,7 @@
3485002
 [Pcd]
3485002
   gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType           ## SOMETIMES_CONSUMES
3485002
   gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable    ## CONSUMES
3485002
+  gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm             ## CONSUMES
3485002
 
3485002
 # [Event]
3485002
 # # Relative timer event set by UnicodeToEfiKey(), used to be one 2 seconds input timeout.