dcbf7c74f1
`VkKeyScanW` as well as `MapVirtualKeyW` are used throughout the project, but are input method sensitive functions. Since #10666 `win+sc(41)` is used as the quake mode keybinding, which is then mapped to a virtual key in order to call `RegisterHotKey`. This mapping is highly dependent on the input method and the quake mode key binding will fail to work once the input method was changed. <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist * [x] Closes #10729 * [x] I work here * [ ] Tests added/passed ## Validation Steps Performed * win+` opens quake window before & after changing keyboard layout ✔️ * keyboard layout changes while WT is minimized trigger reloaded ✔️
43 lines
1.3 KiB
C++
43 lines
1.3 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
#include "pch.h"
|
|
#include "LanguageProfileNotifier.h"
|
|
|
|
using namespace winrt::TerminalApp::implementation;
|
|
|
|
LanguageProfileNotifier::LanguageProfileNotifier(std::function<void()>&& callback) :
|
|
_callback{ std::move(callback) },
|
|
_currentKeyboardLayout{ GetKeyboardLayout(0) }
|
|
{
|
|
const auto manager = wil::CoCreateInstance<ITfThreadMgr>(CLSID_TF_ThreadMgr);
|
|
_source = manager.query<ITfSource>();
|
|
if (FAILED(_source->AdviseSink(IID_ITfInputProcessorProfileActivationSink, static_cast<ITfInputProcessorProfileActivationSink*>(this), &_cookie)))
|
|
{
|
|
_cookie = TF_INVALID_COOKIE;
|
|
THROW_LAST_ERROR();
|
|
}
|
|
}
|
|
|
|
LanguageProfileNotifier::~LanguageProfileNotifier()
|
|
{
|
|
if (_cookie != TF_INVALID_COOKIE)
|
|
{
|
|
_source->UnadviseSink(_cookie);
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP LanguageProfileNotifier::OnActivated(DWORD /*dwProfileType*/, LANGID /*langid*/, REFCLSID /*clsid*/, REFGUID /*catid*/, REFGUID /*guidProfile*/, HKL hkl, DWORD /*dwFlags*/)
|
|
{
|
|
if (hkl && hkl != _currentKeyboardLayout)
|
|
{
|
|
_currentKeyboardLayout = hkl;
|
|
try
|
|
{
|
|
_callback();
|
|
}
|
|
CATCH_RETURN();
|
|
}
|
|
return S_OK;
|
|
}
|