Reload settings when the input method changes (#10876)
`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 ✔️
This commit is contained in:
parent
76793b1e3f
commit
dcbf7c74f1
|
@ -209,6 +209,10 @@ namespace winrt::TerminalApp::implementation
|
||||||
self->_ReloadSettings();
|
self->_ReloadSettings();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_languageProfileNotifier = winrt::make_self<LanguageProfileNotifier>([this]() {
|
||||||
|
_reloadSettings->Run();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
// Method Description:
|
||||||
|
|
|
@ -5,8 +5,9 @@
|
||||||
|
|
||||||
#include "AppLogic.g.h"
|
#include "AppLogic.g.h"
|
||||||
#include "FindTargetWindowResult.g.h"
|
#include "FindTargetWindowResult.g.h"
|
||||||
#include "TerminalPage.h"
|
|
||||||
#include "Jumplist.h"
|
#include "Jumplist.h"
|
||||||
|
#include "LanguageProfileNotifier.h"
|
||||||
|
#include "TerminalPage.h"
|
||||||
|
|
||||||
#include <inc/cppwinrt_utils.h>
|
#include <inc/cppwinrt_utils.h>
|
||||||
#include <ThrottledFunc.h>
|
#include <ThrottledFunc.h>
|
||||||
|
@ -110,12 +111,8 @@ namespace winrt::TerminalApp::implementation
|
||||||
// ALSO: If you add any UIElements as roots here, make sure they're
|
// ALSO: If you add any UIElements as roots here, make sure they're
|
||||||
// updated in _ApplyTheme. The root currently is _root.
|
// updated in _ApplyTheme. The root currently is _root.
|
||||||
winrt::com_ptr<TerminalPage> _root{ nullptr };
|
winrt::com_ptr<TerminalPage> _root{ nullptr };
|
||||||
|
|
||||||
Microsoft::Terminal::Settings::Model::CascadiaSettings _settings{ nullptr };
|
Microsoft::Terminal::Settings::Model::CascadiaSettings _settings{ nullptr };
|
||||||
|
|
||||||
wil::unique_folder_change_reader_nothrow _reader;
|
|
||||||
std::shared_ptr<ThrottledFuncTrailing<>> _reloadSettings;
|
|
||||||
til::throttled_func_trailing<> _reloadState;
|
|
||||||
winrt::hstring _settingsLoadExceptionText;
|
winrt::hstring _settingsLoadExceptionText;
|
||||||
HRESULT _settingsLoadedResult = S_OK;
|
HRESULT _settingsLoadedResult = S_OK;
|
||||||
bool _loadedInitialSettings = false;
|
bool _loadedInitialSettings = false;
|
||||||
|
@ -124,6 +121,15 @@ namespace winrt::TerminalApp::implementation
|
||||||
|
|
||||||
::TerminalApp::AppCommandlineArgs _appArgs;
|
::TerminalApp::AppCommandlineArgs _appArgs;
|
||||||
::TerminalApp::AppCommandlineArgs _settingsAppArgs;
|
::TerminalApp::AppCommandlineArgs _settingsAppArgs;
|
||||||
|
|
||||||
|
std::shared_ptr<ThrottledFuncTrailing<>> _reloadSettings;
|
||||||
|
til::throttled_func_trailing<> _reloadState;
|
||||||
|
|
||||||
|
// These fields invoke _reloadSettings and must be destroyed before _reloadSettings.
|
||||||
|
// (C++ destroys members in reverse-declaration-order.)
|
||||||
|
winrt::com_ptr<LanguageProfileNotifier> _languageProfileNotifier;
|
||||||
|
wil::unique_folder_change_reader_nothrow _reader;
|
||||||
|
|
||||||
static TerminalApp::FindTargetWindowResult _doFindTargetWindow(winrt::array_view<const hstring> args,
|
static TerminalApp::FindTargetWindowResult _doFindTargetWindow(winrt::array_view<const hstring> args,
|
||||||
const Microsoft::Terminal::Settings::Model::WindowingMode& windowingBehavior);
|
const Microsoft::Terminal::Settings::Model::WindowingMode& windowingBehavior);
|
||||||
|
|
||||||
|
|
42
src/cascadia/TerminalApp/LanguageProfileNotifier.cpp
Normal file
42
src/cascadia/TerminalApp/LanguageProfileNotifier.cpp
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
// 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;
|
||||||
|
}
|
21
src/cascadia/TerminalApp/LanguageProfileNotifier.h
Normal file
21
src/cascadia/TerminalApp/LanguageProfileNotifier.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT license.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace winrt::TerminalApp::implementation
|
||||||
|
{
|
||||||
|
class LanguageProfileNotifier : public winrt::implements<LanguageProfileNotifier, ITfInputProcessorProfileActivationSink>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit LanguageProfileNotifier(std::function<void()>&& callback);
|
||||||
|
~LanguageProfileNotifier();
|
||||||
|
STDMETHODIMP OnActivated(DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid, REFGUID guidProfile, HKL hkl, DWORD dwFlags);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::function<void()> _callback;
|
||||||
|
wil::com_ptr<ITfSource> _source;
|
||||||
|
DWORD _cookie = TF_INVALID_COOKIE;
|
||||||
|
HKL _currentKeyboardLayout;
|
||||||
|
};
|
||||||
|
}
|
|
@ -53,7 +53,7 @@
|
||||||
<Page Include="TabRowControl.xaml">
|
<Page Include="TabRowControl.xaml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Page>
|
||||||
<Page Include="TabHeaderControl.xaml">
|
<Page Include="TabHeaderControl.xaml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</Page>
|
</Page>
|
||||||
<Page Include="HighlightedTextControl.xaml">
|
<Page Include="HighlightedTextControl.xaml">
|
||||||
|
@ -74,6 +74,7 @@
|
||||||
<ClInclude Include="Commandline.h" />
|
<ClInclude Include="Commandline.h" />
|
||||||
<ClInclude Include="CommandLinePaletteItem.h" />
|
<ClInclude Include="CommandLinePaletteItem.h" />
|
||||||
<ClInclude Include="Jumplist.h" />
|
<ClInclude Include="Jumplist.h" />
|
||||||
|
<ClInclude Include="LanguageProfileNotifier.h" />
|
||||||
<ClInclude Include="MinMaxCloseControl.h">
|
<ClInclude Include="MinMaxCloseControl.h">
|
||||||
<DependentUpon>MinMaxCloseControl.xaml</DependentUpon>
|
<DependentUpon>MinMaxCloseControl.xaml</DependentUpon>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -112,7 +113,7 @@
|
||||||
<ClInclude Include="HighlightedTextControl.h">
|
<ClInclude Include="HighlightedTextControl.h">
|
||||||
<DependentUpon>HighlightedTextControl.xaml</DependentUpon>
|
<DependentUpon>HighlightedTextControl.xaml</DependentUpon>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="HighlightedText.h" />
|
<ClInclude Include="HighlightedText.h" />
|
||||||
<ClInclude Include="ColorPickupFlyout.h">
|
<ClInclude Include="ColorPickupFlyout.h">
|
||||||
<DependentUpon>ColorPickupFlyout.xaml</DependentUpon>
|
<DependentUpon>ColorPickupFlyout.xaml</DependentUpon>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -139,7 +140,7 @@
|
||||||
<ClInclude Include="AppLogic.h">
|
<ClInclude Include="AppLogic.h">
|
||||||
<DependentUpon>AppLogic.idl</DependentUpon>
|
<DependentUpon>AppLogic.idl</DependentUpon>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="Toast.h"/>
|
<ClInclude Include="Toast.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!-- ========================= Cpp Files ======================== -->
|
<!-- ========================= Cpp Files ======================== -->
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -149,6 +150,7 @@
|
||||||
<ClCompile Include="AppCommandlineArgs.cpp" />
|
<ClCompile Include="AppCommandlineArgs.cpp" />
|
||||||
<ClCompile Include="Commandline.cpp" />
|
<ClCompile Include="Commandline.cpp" />
|
||||||
<ClCompile Include="Jumplist.cpp" />
|
<ClCompile Include="Jumplist.cpp" />
|
||||||
|
<ClCompile Include="LanguageProfileNotifier.cpp" />
|
||||||
<ClCompile Include="MinMaxCloseControl.cpp">
|
<ClCompile Include="MinMaxCloseControl.cpp">
|
||||||
<DependentUpon>MinMaxCloseControl.xaml</DependentUpon>
|
<DependentUpon>MinMaxCloseControl.xaml</DependentUpon>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -195,7 +197,7 @@
|
||||||
<ClCompile Include="HighlightedTextControl.cpp">
|
<ClCompile Include="HighlightedTextControl.cpp">
|
||||||
<DependentUpon>HighlightedTextControl.xaml</DependentUpon>
|
<DependentUpon>HighlightedTextControl.xaml</DependentUpon>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="HighlightedText.cpp" />
|
<ClCompile Include="HighlightedText.cpp" />
|
||||||
<ClCompile Include="ColorPickupFlyout.cpp">
|
<ClCompile Include="ColorPickupFlyout.cpp">
|
||||||
<DependentUpon>ColorPickupFlyout.xaml</DependentUpon>
|
<DependentUpon>ColorPickupFlyout.xaml</DependentUpon>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -280,7 +282,7 @@
|
||||||
<DependentUpon>HighlightedTextControl.xaml</DependentUpon>
|
<DependentUpon>HighlightedTextControl.xaml</DependentUpon>
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Midl>
|
</Midl>
|
||||||
<Midl Include="HighlightedText.idl" />
|
<Midl Include="HighlightedText.idl" />
|
||||||
<Midl Include="ColorPickupFlyout.idl">
|
<Midl Include="ColorPickupFlyout.idl">
|
||||||
<DependentUpon>ColorPickupFlyout.xaml</DependentUpon>
|
<DependentUpon>ColorPickupFlyout.xaml</DependentUpon>
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
|
|
|
@ -13,9 +13,6 @@
|
||||||
<ClCompile Include="Pane.cpp">
|
<ClCompile Include="Pane.cpp">
|
||||||
<Filter>pane</Filter>
|
<Filter>pane</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="Tab.cpp">
|
|
||||||
<Filter>tab</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Pane.LayoutSizeNode.cpp">
|
<ClCompile Include="Pane.LayoutSizeNode.cpp">
|
||||||
<Filter>pane</Filter>
|
<Filter>pane</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -23,7 +20,6 @@
|
||||||
<ClCompile Include="Commandline.cpp" />
|
<ClCompile Include="Commandline.cpp" />
|
||||||
<ClCompile Include="ColorHelper.cpp" />
|
<ClCompile Include="ColorHelper.cpp" />
|
||||||
<ClCompile Include="DebugTapConnection.cpp" />
|
<ClCompile Include="DebugTapConnection.cpp" />
|
||||||
<ClCompile Include="Utils.cpp" />
|
|
||||||
<ClCompile Include="Jumplist.cpp" />
|
<ClCompile Include="Jumplist.cpp" />
|
||||||
<ClCompile Include="Tab.cpp">
|
<ClCompile Include="Tab.cpp">
|
||||||
<Filter>tab</Filter>
|
<Filter>tab</Filter>
|
||||||
|
@ -49,10 +45,10 @@
|
||||||
<ClCompile Include="HighlightedText.cpp">
|
<ClCompile Include="HighlightedText.cpp">
|
||||||
<Filter>highlightedText</Filter>
|
<Filter>highlightedText</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Toast.cpp" />
|
||||||
|
<ClCompile Include="LanguageProfileNotifier.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="Utils.h" />
|
|
||||||
<ClInclude Include="TerminalWarnings.h" />
|
|
||||||
<ClInclude Include="pch.h" />
|
<ClInclude Include="pch.h" />
|
||||||
<ClInclude Include="App.base.h">
|
<ClInclude Include="App.base.h">
|
||||||
<Filter>app</Filter>
|
<Filter>app</Filter>
|
||||||
|
@ -60,9 +56,6 @@
|
||||||
<ClInclude Include="Pane.h">
|
<ClInclude Include="Pane.h">
|
||||||
<Filter>pane</Filter>
|
<Filter>pane</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="Tab.h">
|
|
||||||
<Filter>tab</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="AppCommandlineArgs.h" />
|
<ClInclude Include="AppCommandlineArgs.h" />
|
||||||
<ClInclude Include="Commandline.h" />
|
<ClInclude Include="Commandline.h" />
|
||||||
<ClInclude Include="DebugTapConnection.h" />
|
<ClInclude Include="DebugTapConnection.h" />
|
||||||
|
@ -92,14 +85,13 @@
|
||||||
<ClInclude Include="HighlightedText.h">
|
<ClInclude Include="HighlightedText.h">
|
||||||
<Filter>highlightedText</Filter>
|
<Filter>highlightedText</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Toast.h" />
|
||||||
|
<ClInclude Include="LanguageProfileNotifier.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Midl Include="AppLogic.idl">
|
<Midl Include="AppLogic.idl">
|
||||||
<Filter>app</Filter>
|
<Filter>app</Filter>
|
||||||
</Midl>
|
</Midl>
|
||||||
<Midl Include="ActionArgs.idl">
|
|
||||||
<Filter>settings</Filter>
|
|
||||||
</Midl>
|
|
||||||
<Midl Include="AppKeyBindings.idl">
|
<Midl Include="AppKeyBindings.idl">
|
||||||
<Filter>settings</Filter>
|
<Filter>settings</Filter>
|
||||||
</Midl>
|
</Midl>
|
||||||
|
@ -107,9 +99,6 @@
|
||||||
<Filter>settings</Filter>
|
<Filter>settings</Filter>
|
||||||
</Midl>
|
</Midl>
|
||||||
<Midl Include="IDirectKeyListener.idl" />
|
<Midl Include="IDirectKeyListener.idl" />
|
||||||
<Midl Include="ITab.idl">
|
|
||||||
<Filter>tab</Filter>
|
|
||||||
</Midl>
|
|
||||||
<Midl Include="SettingsTab.idl">
|
<Midl Include="SettingsTab.idl">
|
||||||
<Filter>tab</Filter>
|
<Filter>tab</Filter>
|
||||||
</Midl>
|
</Midl>
|
||||||
|
@ -125,6 +114,9 @@
|
||||||
<Midl Include="TerminalTabStatus.idl">
|
<Midl Include="TerminalTabStatus.idl">
|
||||||
<Filter>tab</Filter>
|
<Filter>tab</Filter>
|
||||||
</Midl>
|
</Midl>
|
||||||
|
<Midl Include="PaletteItemTemplateSelector.idl" />
|
||||||
|
<Midl Include="TabBase.idl" />
|
||||||
|
<Midl Include="EmptyStringVisibilityConverter.idl" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
|
@ -160,9 +152,6 @@
|
||||||
<Midl Include="ActionPaletteItem.idl">
|
<Midl Include="ActionPaletteItem.idl">
|
||||||
<Filter>commandPalette</Filter>
|
<Filter>commandPalette</Filter>
|
||||||
</Midl>
|
</Midl>
|
||||||
<Midl Include="FilterableListItem.idl">
|
|
||||||
<Filter>commandPalette</Filter>
|
|
||||||
</Midl>
|
|
||||||
<Midl Include="CommandLinePaletteItem.idl">
|
<Midl Include="CommandLinePaletteItem.idl">
|
||||||
<Filter>commandPalette</Filter>
|
<Filter>commandPalette</Filter>
|
||||||
</Midl>
|
</Midl>
|
||||||
|
|
|
@ -66,6 +66,7 @@ TRACELOGGING_DECLARE_PROVIDER(g_hTerminalAppProvider);
|
||||||
#include <telemetry/ProjectTelemetry.h>
|
#include <telemetry/ProjectTelemetry.h>
|
||||||
#include <TraceLoggingActivity.h>
|
#include <TraceLoggingActivity.h>
|
||||||
|
|
||||||
|
#include <msctf.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
#include <shobjidl_core.h>
|
#include <shobjidl_core.h>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue