From 8f31658d0f5760628cc06300d3e77500143f6be7 Mon Sep 17 00:00:00 2001 From: BDisp Date: Sat, 30 May 2026 20:51:38 +0100 Subject: [PATCH 1/4] Fixes #5453. Fix Windows VT input encoding for IME and non-ASCII characters --- .../WindowsHelpers/WindowsVTInputHelper.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs index 931b78918f..fdbf43d0ee 100644 --- a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs +++ b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs @@ -51,6 +51,9 @@ internal sealed class WindowsVTInputHelper : IDisposable [DllImport ("kernel32.dll")] private static extern uint GetConsoleCP (); + [DllImport ("kernel32.dll", SetLastError = true)] + private static extern bool SetConsoleCP (uint wCodePageID); + #endregion private const int ERROR_NOT_FOUND = 1168; @@ -68,6 +71,21 @@ internal sealed class WindowsVTInputHelper : IDisposable private uint _originalConsoleMode; private bool _disposed; + private const uint CP_UTF8 = 65001; + + private readonly uint _originalConsoleCP; + private readonly Encoding _utf8 = new UTF8Encoding (encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); + + public WindowsVTInputHelper () + { + _originalConsoleCP = GetConsoleCP (); + + if (_originalConsoleCP != CP_UTF8) + { + SetConsoleCP (CP_UTF8); + } + } + /// /// Gets whether VTS input mode was successfully enabled. /// @@ -238,6 +256,7 @@ public void Restore () try { + SetConsoleCP (_originalConsoleCP); SetConsoleMode (InputHandle, _originalConsoleMode); IsEnabled = false; } From d6a63c507a8db523754093fc71e16dfca492661d Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 1 Jun 2026 00:10:48 +0100 Subject: [PATCH 2/4] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs index fdbf43d0ee..499cd433e8 100644 --- a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs +++ b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs @@ -82,7 +82,11 @@ public WindowsVTInputHelper () if (_originalConsoleCP != CP_UTF8) { - SetConsoleCP (CP_UTF8); + if (!SetConsoleCP (CP_UTF8)) + { + int error = Marshal.GetLastWin32Error (); + Logging.Warning ($"{nameof (WindowsVTInputHelper)}: Failed to set console input code page to UTF-8. Win32 error: {error}"); + } } } From 44010fbf68085647e9a2987493954ed3c39ea700 Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 1 Jun 2026 00:20:59 +0100 Subject: [PATCH 3/4] Cleanup code --- .../Drivers/WindowsHelpers/WindowsVTInputHelper.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs index 499cd433e8..56afc297be 100644 --- a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs +++ b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs @@ -80,14 +80,12 @@ public WindowsVTInputHelper () { _originalConsoleCP = GetConsoleCP (); - if (_originalConsoleCP != CP_UTF8) + if (_originalConsoleCP == CP_UTF8 || SetConsoleCP (CP_UTF8)) { - if (!SetConsoleCP (CP_UTF8)) - { - int error = Marshal.GetLastWin32Error (); - Logging.Warning ($"{nameof (WindowsVTInputHelper)}: Failed to set console input code page to UTF-8. Win32 error: {error}"); - } + return; } + int error = Marshal.GetLastWin32Error (); + Logging.Warning ($"{nameof (WindowsVTInputHelper)}: Failed to set console input code page to UTF-8. Win32 error: {error}"); } /// From 0496095d28a535648f5ffa2cb0845909df866980 Mon Sep 17 00:00:00 2001 From: BDisp Date: Mon, 1 Jun 2026 00:22:04 +0100 Subject: [PATCH 4/4] Apply suggested changes related with review feedback --- Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs index 56afc297be..c17a440c99 100644 --- a/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs +++ b/Terminal.Gui/Drivers/WindowsHelpers/WindowsVTInputHelper.cs @@ -74,7 +74,6 @@ internal sealed class WindowsVTInputHelper : IDisposable private const uint CP_UTF8 = 65001; private readonly uint _originalConsoleCP; - private readonly Encoding _utf8 = new UTF8Encoding (encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); public WindowsVTInputHelper () {