From: Laszlo Ersek <ler...@redhat.com> TerminalDxe driver can send xterm control sequences. Reference: <http://rtfm.etla.org/xterm/ctlseq.html>
This way it can trigger client window resize (xterm, gnome-terminal etc.) accordingly, to a specified number of rows and columns. It improves user experience when handling text mode based operations. New PcdResizeXterm config switch has been added to enable or disable this behaviour. Signed-off-by: Laszlo Ersek <ler...@redhat.com> Pawel Polawski: Updated commit message for re-submission Cc: Jian J Wang <jian.j.w...@intel.com> Cc: Liming Gao <gaolim...@byosoft.com.cn> Signed-off-by: Paweł Poławski <ppola...@redhat.com> --- MdeModulePkg/MdeModulePkg.dec | 4 +++ MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf | 2 ++ MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c | 29 ++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 9605c617b7a8..76007e0af42a 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -2107,6 +2107,10 @@ [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] # @Prompt The shared bit mask when Intel Tdx is enabled. gEfiMdeModulePkgTokenSpaceGuid.PcdTdxSharedBitMask|0x0|UINT64|0x10000025 + ## Controls whether TerminalDxe outputs an XTerm resize sequence on terminal + # mode change. + gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm|FALSE|BOOLEAN|0x00010080 + [PcdsPatchableInModule] ## Specify memory size with page number for PEI code when # Loading Module at Fixed Address feature is enabled. diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf index b2a8aeba8510..eff625346539 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf @@ -55,6 +55,7 @@ [LibraryClasses] DebugLib PcdLib BaseLib + PrintLib [Guids] ## SOMETIMES_PRODUCES ## Variable:L"ConInDev" @@ -87,6 +88,7 @@ [Protocols] [Pcd] gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType ## SOMETIMES_CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable ## CONSUMES + gEfiMdeModulePkgTokenSpaceGuid.PcdResizeXterm ## CONSUMES # [Event] # # Relative timer event set by UnicodeToEfiKey(), used to be one 2 seconds input timeout. diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c index 7809869e7d49..496849458db4 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c @@ -7,6 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ +#include <Library/PrintLib.h> + #include "Terminal.h" // @@ -80,6 +82,15 @@ CHAR16 mSetCursorPositionString[] = { ESC, '[', '0', '0', ';', '0', '0', 'H', 0 CHAR16 mCursorForwardString[] = { ESC, '[', '0', '0', 'C', 0 }; CHAR16 mCursorBackwardString[] = { ESC, '[', '0', '0', 'D', 0 }; +// +// Note that this is an ASCII format string, taking two INT32 arguments: +// rows, columns. +// +// A %d (INT32) format specification can expand to at most 11 characters. +// +CHAR8 mResizeTextAreaFormatString[] = "\x1B[8;%d;%dt"; +#define RESIZE_SEQ_SIZE (sizeof mResizeTextAreaFormatString + 2 * (11 - 2)) + // // Body of the ConOut functions // @@ -498,6 +509,24 @@ TerminalConOutSetMode ( return EFI_DEVICE_ERROR; } + if (PcdGetBool (PcdResizeXterm)) { + CHAR16 ResizeSequence[RESIZE_SEQ_SIZE]; + + UnicodeSPrintAsciiFormat ( + ResizeSequence, + sizeof ResizeSequence, + mResizeTextAreaFormatString, + (INT32)TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows, + (INT32)TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns + ); + TerminalDevice->OutputEscChar = TRUE; + Status = This->OutputString (This, ResizeSequence); + TerminalDevice->OutputEscChar = FALSE; + if (EFI_ERROR (Status)) { + return EFI_DEVICE_ERROR; + } + } + This->Mode->Mode = (INT32)ModeNumber; Status = This->ClearScreen (This); -- 2.39.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100316): https://edk2.groups.io/g/devel/message/100316 Mute This Topic: https://groups.io/mt/97027219/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-