From 63b6bba433d49f0c8ec523a7e552c4ebc01236bb Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Fri, 17 Apr 2026 20:32:18 +0200 Subject: [PATCH] Fixed SetTerminalInputKeyboardLayout --- .github/actions/spelling/expect/expect.txt | 1 - src/terminal/adapter/ut_adapter/TestHook.cpp | 14 ++++++++++++++ src/terminal/adapter/ut_adapter/TestHook.h | 1 + src/terminal/adapter/ut_adapter/inputTest.cpp | 8 ++------ .../adapter/ut_adapter/kittyKeyboardProtocol.cpp | 7 ++----- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.github/actions/spelling/expect/expect.txt b/.github/actions/spelling/expect/expect.txt index b82142391b..f6ebb617f1 100644 --- a/.github/actions/spelling/expect/expect.txt +++ b/.github/actions/spelling/expect/expect.txt @@ -28,7 +28,6 @@ ALIGNRIGHT allocing alpc ALTERNATENAME -alternatename ALTF ALTGR ALTNUMPAD diff --git a/src/terminal/adapter/ut_adapter/TestHook.cpp b/src/terminal/adapter/ut_adapter/TestHook.cpp index 2b6759a89e..50f6fe1956 100644 --- a/src/terminal/adapter/ut_adapter/TestHook.cpp +++ b/src/terminal/adapter/ut_adapter/TestHook.cpp @@ -94,6 +94,11 @@ LayoutGuard& LayoutGuard::operator=(LayoutGuard&& other) noexcept return *this; } +LayoutGuard::operator bool() const noexcept +{ + return _layout != nullptr; +} + LayoutGuard::operator HKL() const noexcept { return _layout; @@ -103,6 +108,15 @@ LayoutGuard TestHook::SetTerminalInputKeyboardLayout(const wchar_t* klid) { THROW_HR_IF_MSG(E_UNEXPECTED, g_keyboardLayout != nullptr, "Nested layout test overrides are not supported"); + // Check if the layout is installed. LoadKeyboardLayoutW silently returns the + // current active layout if the requested one is missing. + const auto keyPath = fmt::format(FMT_COMPILE(L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\{}"), klid); + wil::unique_hkey key; + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, keyPath.c_str(), 0, KEY_READ, key.addressof()) != ERROR_SUCCESS) + { + return {}; + } + const auto layout = LoadKeyboardLayoutW(klid, KLF_NOTELLSHELL); THROW_LAST_ERROR_IF_NULL(layout); diff --git a/src/terminal/adapter/ut_adapter/TestHook.h b/src/terminal/adapter/ut_adapter/TestHook.h index ffecb97584..f7e14e25a3 100644 --- a/src/terminal/adapter/ut_adapter/TestHook.h +++ b/src/terminal/adapter/ut_adapter/TestHook.h @@ -13,6 +13,7 @@ namespace TestHook LayoutGuard(LayoutGuard&& other) noexcept; LayoutGuard& operator=(LayoutGuard&& other) noexcept; + explicit operator bool() const noexcept; operator HKL() const noexcept; private: diff --git a/src/terminal/adapter/ut_adapter/inputTest.cpp b/src/terminal/adapter/ut_adapter/inputTest.cpp index 2967a695d1..cb221906bf 100644 --- a/src/terminal/adapter/ut_adapter/inputTest.cpp +++ b/src/terminal/adapter/ut_adapter/inputTest.cpp @@ -628,12 +628,8 @@ void InputTest::TerminalInputNullKeyTests() { using namespace std::string_view_literals; - TestHook::LayoutGuard layout; - try - { - layout = TestHook::SetTerminalInputKeyboardLayout(L"00000409"); // US English - } - catch (...) + auto layout = TestHook::SetTerminalInputKeyboardLayout(L"00000409"); // US English + if (!layout) { Log::Result(TestResults::Result::Skipped); return; diff --git a/src/terminal/adapter/ut_adapter/kittyKeyboardProtocol.cpp b/src/terminal/adapter/ut_adapter/kittyKeyboardProtocol.cpp index ff01246365..44f5418701 100644 --- a/src/terminal/adapter/ut_adapter/kittyKeyboardProtocol.cpp +++ b/src/terminal/adapter/ut_adapter/kittyKeyboardProtocol.cpp @@ -258,11 +258,8 @@ class KittyKeyboardProtocolTests TEST_CLASS_SETUP(ClassSetup) { - try - { - layout = TestHook::SetTerminalInputKeyboardLayout(L"0001040c"); // French (Standard, AZERTY) - } - catch (...) + layout = TestHook::SetTerminalInputKeyboardLayout(L"0001040c"); // French (Standard, AZERTY) + if (!layout) { Log::Result(TestResults::Result::Skipped); }