Merge remote-tracking branch 'origin/master' into dev/migrie/f/command-palette-iterateOn

# Conflicts:
#	src/cascadia/TerminalApp/ColorScheme.cpp
#	src/cascadia/TerminalApp/ColorScheme.h
This commit is contained in:
Mike Griese
2020-08-04 11:44:50 -05:00
24 changed files with 104 additions and 64 deletions

View File

@@ -127,7 +127,7 @@ namespace TerminalAppLocalTests
void SettingsTests::TryCreateWinRTType() void SettingsTests::TryCreateWinRTType()
{ {
winrt::Microsoft::Terminal::Settings::TerminalSettings settings; TerminalSettings settings;
VERIFY_IS_NOT_NULL(settings); VERIFY_IS_NOT_NULL(settings);
auto oldFontSize = settings.FontSize(); auto oldFontSize = settings.FontSize();
settings.FontSize(oldFontSize + 5); settings.FontSize(oldFontSize + 5);

View File

@@ -84,7 +84,7 @@ namespace TerminalAppLocalTests
{ {
// Verify we can create a WinRT type we authored // Verify we can create a WinRT type we authored
// Just creating it is enough to know that everything is working. // Just creating it is enough to know that everything is working.
winrt::Microsoft::Terminal::Settings::TerminalSettings settings; TerminalSettings settings;
VERIFY_IS_NOT_NULL(settings); VERIFY_IS_NOT_NULL(settings);
auto oldFontSize = settings.FontSize(); auto oldFontSize = settings.FontSize();
settings.FontSize(oldFontSize + 5); settings.FontSize(oldFontSize + 5);
@@ -140,7 +140,7 @@ namespace TerminalAppLocalTests
// 4. one of our types that uses MUX/Xaml in this dll (Tab). // 4. one of our types that uses MUX/Xaml in this dll (Tab).
// Just creating all of them is enough to know that everything is working. // Just creating all of them is enough to know that everything is working.
const auto profileGuid{ Utils::CreateGuid() }; const auto profileGuid{ Utils::CreateGuid() };
winrt::Microsoft::Terminal::Settings::TerminalSettings settings{}; TerminalSettings settings{};
VERIFY_IS_NOT_NULL(settings); VERIFY_IS_NOT_NULL(settings);
winrt::Microsoft::Terminal::TerminalConnection::EchoConnection conn{}; winrt::Microsoft::Terminal::TerminalConnection::EchoConnection conn{};
VERIFY_IS_NOT_NULL(conn); VERIFY_IS_NOT_NULL(conn);

View File

@@ -55,10 +55,29 @@ try
if (terminal) if (terminal)
{ {
if (_IsMouseMessage(uMsg) && terminal->_CanSendVTMouseInput()) if (_IsMouseMessage(uMsg))
{ {
if (terminal->_SendMouseEvent(uMsg, wParam, lParam)) if (terminal->_CanSendVTMouseInput() && terminal->_SendMouseEvent(uMsg, wParam, lParam))
{ {
// GH#6401: Capturing the mouse ensures that we get drag/release events
// even if the user moves outside the window.
// _SendMouseEvent returns false if the terminal's not in VT mode, so we'll
// fall through to release the capture.
switch (uMsg)
{
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
SetCapture(hwnd);
break;
case WM_LBUTTONUP:
case WM_MBUTTONUP:
case WM_RBUTTONUP:
ReleaseCapture();
break;
}
// Suppress all mouse events that made it into the terminal.
return 0; return 0;
} }
} }
@@ -76,6 +95,10 @@ try
return 0; return 0;
case WM_LBUTTONUP: case WM_LBUTTONUP:
terminal->_singleClickTouchdownPos = std::nullopt; terminal->_singleClickTouchdownPos = std::nullopt;
[[fallthrough]];
case WM_MBUTTONUP:
case WM_RBUTTONUP:
ReleaseCapture();
break; break;
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
if (WI_IsFlagSet(wParam, MK_LBUTTON)) if (WI_IsFlagSet(wParam, MK_LBUTTON))

View File

@@ -54,8 +54,8 @@ public:
static const CascadiaSettings& GetCurrentAppSettings(); static const CascadiaSettings& GetCurrentAppSettings();
std::tuple<GUID, winrt::Microsoft::Terminal::Settings::TerminalSettings> BuildSettings(const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs) const; std::tuple<GUID, winrt::TerminalApp::TerminalSettings> BuildSettings(const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs) const;
winrt::Microsoft::Terminal::Settings::TerminalSettings BuildSettings(GUID profileGuid) const; winrt::TerminalApp::TerminalSettings BuildSettings(GUID profileGuid) const;
GlobalAppSettings& GlobalSettings(); GlobalAppSettings& GlobalSettings();

View File

@@ -10,7 +10,7 @@
using namespace ::Microsoft::Console; using namespace ::Microsoft::Console;
using namespace TerminalApp; using namespace TerminalApp;
using namespace winrt::Microsoft::Terminal::Settings; using namespace winrt::TerminalApp;
static constexpr std::string_view NameKey{ "name" }; static constexpr std::string_view NameKey{ "name" };
static constexpr std::string_view ForegroundKey{ "foreground" }; static constexpr std::string_view ForegroundKey{ "foreground" };

View File

@@ -15,7 +15,7 @@ Author(s):
--*/ --*/
#pragma once #pragma once
#include <winrt/Microsoft.Terminal.Settings.h> #include "TerminalSettings.h"
#include "../../inc/conattrs.hpp" #include "../../inc/conattrs.hpp"
// fwdecl unittest classes // fwdecl unittest classes
@@ -37,7 +37,7 @@ public:
ColorScheme(std::wstring name, til::color defaultFg, til::color defaultBg, til::color cursorColor); ColorScheme(std::wstring name, til::color defaultFg, til::color defaultBg, til::color cursorColor);
~ColorScheme(); ~ColorScheme();
void ApplyScheme(winrt::Microsoft::Terminal::Settings::TerminalSettings terminalSettings) const; void ApplyScheme(winrt::TerminalApp::TerminalSettings terminalSettings) const;
static ColorScheme FromJson(const Json::Value& json); static ColorScheme FromJson(const Json::Value& json);
bool ShouldBeLayered(const Json::Value& json) const; bool ShouldBeLayered(const Json::Value& json) const;

View File

@@ -46,7 +46,7 @@ public:
static GlobalAppSettings FromJson(const Json::Value& json); static GlobalAppSettings FromJson(const Json::Value& json);
void LayerJson(const Json::Value& json); void LayerJson(const Json::Value& json);
void ApplyToSettings(winrt::Microsoft::Terminal::Settings::TerminalSettings& settings) const noexcept; void ApplyToSettings(winrt::TerminalApp::TerminalSettings& settings) const noexcept;
std::vector<TerminalApp::SettingsLoadWarnings> GetKeybindingsWarnings() const; std::vector<TerminalApp::SettingsLoadWarnings> GetKeybindingsWarnings() const;

View File

@@ -51,7 +51,7 @@ public:
void ClearActive(); void ClearActive();
void SetActive(); void SetActive();
void UpdateSettings(const winrt::Microsoft::Terminal::Settings::TerminalSettings& settings, void UpdateSettings(const winrt::TerminalApp::TerminalSettings& settings,
const GUID& profile); const GUID& profile);
void ResizeContent(const winrt::Windows::Foundation::Size& newSize); void ResizeContent(const winrt::Windows::Foundation::Size& newSize);
void Relayout(); void Relayout();

View File

@@ -12,6 +12,7 @@
#include "TerminalSettingsSerializationHelpers.h" #include "TerminalSettingsSerializationHelpers.h"
using namespace TerminalApp; using namespace TerminalApp;
using namespace winrt::TerminalApp;
using namespace winrt::Microsoft::Terminal::Settings; using namespace winrt::Microsoft::Terminal::Settings;
using namespace winrt::Windows::UI::Xaml; using namespace winrt::Windows::UI::Xaml;
using namespace ::Microsoft::Console; using namespace ::Microsoft::Console;

View File

@@ -46,7 +46,7 @@ public:
~Profile(); ~Profile();
winrt::Microsoft::Terminal::Settings::TerminalSettings CreateTerminalSettings(const std::unordered_map<std::wstring, ColorScheme>& schemes) const; winrt::TerminalApp::TerminalSettings CreateTerminalSettings(const std::unordered_map<std::wstring, ColorScheme>& schemes) const;
Json::Value GenerateStub() const; Json::Value GenerateStub() const;
static Profile FromJson(const Json::Value& json); static Profile FromJson(const Json::Value& json);

View File

@@ -46,7 +46,7 @@ namespace winrt::TerminalApp::implementation
void ResizePane(const winrt::TerminalApp::Direction& direction); void ResizePane(const winrt::TerminalApp::Direction& direction);
void NavigateFocus(const winrt::TerminalApp::Direction& direction); void NavigateFocus(const winrt::TerminalApp::Direction& direction);
void UpdateSettings(const winrt::Microsoft::Terminal::Settings::TerminalSettings& settings, const GUID& profile); void UpdateSettings(const winrt::TerminalApp::TerminalSettings& settings, const GUID& profile);
winrt::hstring GetActiveTitle() const; winrt::hstring GetActiveTitle() const;
void Shutdown(); void Shutdown();

View File

@@ -32,7 +32,6 @@ using namespace winrt::Windows::UI::Text;
using namespace winrt::Microsoft::Terminal; using namespace winrt::Microsoft::Terminal;
using namespace winrt::Microsoft::Terminal::TerminalControl; using namespace winrt::Microsoft::Terminal::TerminalControl;
using namespace winrt::Microsoft::Terminal::TerminalConnection; using namespace winrt::Microsoft::Terminal::TerminalConnection;
using namespace winrt::Microsoft::Terminal::Settings;
using namespace ::TerminalApp; using namespace ::TerminalApp;
using namespace ::Microsoft::Console; using namespace ::Microsoft::Console;
@@ -677,7 +676,7 @@ namespace winrt::TerminalApp::implementation
// currently displayed, it will be shown. // currently displayed, it will be shown.
// Arguments: // Arguments:
// - settings: the TerminalSettings object to use to create the TerminalControl with. // - settings: the TerminalSettings object to use to create the TerminalControl with.
void TerminalPage::_CreateNewTabFromSettings(GUID profileGuid, TerminalSettings settings) void TerminalPage::_CreateNewTabFromSettings(GUID profileGuid, TerminalApp::TerminalSettings settings)
{ {
// Initialize the new tab // Initialize the new tab
@@ -778,7 +777,7 @@ namespace winrt::TerminalApp::implementation
// Return value: // Return value:
// - the desired connection // - the desired connection
TerminalConnection::ITerminalConnection TerminalPage::_CreateConnectionFromSettings(GUID profileGuid, TerminalConnection::ITerminalConnection TerminalPage::_CreateConnectionFromSettings(GUID profileGuid,
winrt::Microsoft::Terminal::Settings::TerminalSettings settings) TerminalApp::TerminalSettings settings)
{ {
const auto* const profile = _settings->FindProfile(profileGuid); const auto* const profile = _settings->FindProfile(profileGuid);
@@ -1419,7 +1418,7 @@ namespace winrt::TerminalApp::implementation
try try
{ {
auto focusedTab = _GetStrongTabImpl(*indexOpt); auto focusedTab = _GetStrongTabImpl(*indexOpt);
winrt::Microsoft::Terminal::Settings::TerminalSettings controlSettings; TerminalApp::TerminalSettings controlSettings;
GUID realGuid; GUID realGuid;
bool profileFound = false; bool profileFound = false;

View File

@@ -118,8 +118,8 @@ namespace winrt::TerminalApp::implementation
void _CreateNewTabFlyout(); void _CreateNewTabFlyout();
void _OpenNewTabDropdown(); void _OpenNewTabDropdown();
void _OpenNewTab(const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs); void _OpenNewTab(const winrt::TerminalApp::NewTerminalArgs& newTerminalArgs);
void _CreateNewTabFromSettings(GUID profileGuid, winrt::Microsoft::Terminal::Settings::TerminalSettings settings); void _CreateNewTabFromSettings(GUID profileGuid, TerminalApp::TerminalSettings settings);
winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection _CreateConnectionFromSettings(GUID profileGuid, winrt::Microsoft::Terminal::Settings::TerminalSettings settings); winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection _CreateConnectionFromSettings(GUID profileGuid, TerminalApp::TerminalSettings settings);
void _SettingsButtonOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); void _SettingsButtonOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs);
void _FeedbackButtonOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs); void _FeedbackButtonOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs);

View File

@@ -6,7 +6,7 @@
#include "TerminalSettings.g.cpp" #include "TerminalSettings.g.cpp"
namespace winrt::Microsoft::Terminal::Settings::implementation namespace winrt::TerminalApp::implementation
{ {
uint32_t TerminalSettings::GetColorTableEntry(int32_t index) const noexcept uint32_t TerminalSettings::GetColorTableEntry(int32_t index) const noexcept
{ {

View File

@@ -19,7 +19,7 @@ Author(s):
#include <DefaultSettings.h> #include <DefaultSettings.h>
#include <conattrs.hpp> #include <conattrs.hpp>
namespace winrt::Microsoft::Terminal::Settings::implementation namespace winrt::TerminalApp::implementation
{ {
struct TerminalSettings : TerminalSettingsT<TerminalSettings> struct TerminalSettings : TerminalSettingsT<TerminalSettings>
{ {
@@ -49,7 +49,7 @@ namespace winrt::Microsoft::Terminal::Settings::implementation
GETSET_PROPERTY(bool, SnapOnInput, true); GETSET_PROPERTY(bool, SnapOnInput, true);
GETSET_PROPERTY(bool, AltGrAliasing, true); GETSET_PROPERTY(bool, AltGrAliasing, true);
GETSET_PROPERTY(uint32_t, CursorColor, DEFAULT_CURSOR_COLOR); GETSET_PROPERTY(uint32_t, CursorColor, DEFAULT_CURSOR_COLOR);
GETSET_PROPERTY(CursorStyle, CursorShape, CursorStyle::Vintage); GETSET_PROPERTY(Microsoft::Terminal::Settings::CursorStyle, CursorShape, Microsoft::Terminal::Settings::CursorStyle::Vintage);
GETSET_PROPERTY(uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT); GETSET_PROPERTY(uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT);
GETSET_PROPERTY(hstring, WordDelimiters, DEFAULT_WORD_DELIMITERS); GETSET_PROPERTY(hstring, WordDelimiters, DEFAULT_WORD_DELIMITERS);
GETSET_PROPERTY(bool, CopyOnSelect, false); GETSET_PROPERTY(bool, CopyOnSelect, false);
@@ -78,7 +78,7 @@ namespace winrt::Microsoft::Terminal::Settings::implementation
BackgroundImageVerticalAlignment, BackgroundImageVerticalAlignment,
winrt::Windows::UI::Xaml::VerticalAlignment::Center); winrt::Windows::UI::Xaml::VerticalAlignment::Center);
GETSET_PROPERTY(IKeyBindings, KeyBindings, nullptr); GETSET_PROPERTY(Microsoft::Terminal::Settings::IKeyBindings, KeyBindings, nullptr);
GETSET_PROPERTY(hstring, Commandline); GETSET_PROPERTY(hstring, Commandline);
GETSET_PROPERTY(hstring, StartingDirectory); GETSET_PROPERTY(hstring, StartingDirectory);
@@ -86,9 +86,9 @@ namespace winrt::Microsoft::Terminal::Settings::implementation
GETSET_PROPERTY(bool, SuppressApplicationTitle); GETSET_PROPERTY(bool, SuppressApplicationTitle);
GETSET_PROPERTY(hstring, EnvironmentVariables); GETSET_PROPERTY(hstring, EnvironmentVariables);
GETSET_PROPERTY(ScrollbarState, ScrollState, ScrollbarState::Visible); GETSET_PROPERTY(Microsoft::Terminal::Settings::ScrollbarState, ScrollState, Microsoft::Terminal::Settings::ScrollbarState::Visible);
GETSET_PROPERTY(TextAntialiasingMode, AntialiasingMode, TextAntialiasingMode::Grayscale); GETSET_PROPERTY(Microsoft::Terminal::Settings::TextAntialiasingMode, AntialiasingMode, Microsoft::Terminal::Settings::TextAntialiasingMode::Grayscale);
GETSET_PROPERTY(bool, RetroTerminalEffect, false); GETSET_PROPERTY(bool, RetroTerminalEffect, false);
GETSET_PROPERTY(bool, ForceFullRepaintRendering, false); GETSET_PROPERTY(bool, ForceFullRepaintRendering, false);
@@ -102,7 +102,7 @@ namespace winrt::Microsoft::Terminal::Settings::implementation
}; };
} }
namespace winrt::Microsoft::Terminal::Settings::factory_implementation namespace winrt::TerminalApp::factory_implementation
{ {
BASIC_FACTORY(TerminalSettings); BASIC_FACTORY(TerminalSettings);
} }

View File

@@ -1,10 +1,7 @@
// Copyright (c) Microsoft Corporation. // Copyright (c) Microsoft Corporation.
// Licensed under the MIT license. // Licensed under the MIT license.
import "ICoreSettings.idl"; namespace TerminalApp
import "IControlSettings.idl";
namespace Microsoft.Terminal.Settings
{ {
// Class Description: // Class Description:
// TerminalSettings encapsulates all settings that control the // TerminalSettings encapsulates all settings that control the
@@ -15,8 +12,8 @@ namespace Microsoft.Terminal.Settings
// The TerminalControl will pull settings it requires from this object, // The TerminalControl will pull settings it requires from this object,
// and pass along the Core properties to the terminal core. // and pass along the Core properties to the terminal core.
[default_interface] [default_interface]
runtimeclass TerminalSettings : ICoreSettings, runtimeclass TerminalSettings : Microsoft.Terminal.Settings.ICoreSettings,
IControlSettings Microsoft.Terminal.Settings.IControlSettings
{ {
TerminalSettings(); TerminalSettings();
}; };

View File

@@ -117,6 +117,9 @@
<ClInclude Include="../AzureCloudShellGenerator.h" /> <ClInclude Include="../AzureCloudShellGenerator.h" />
<ClInclude Include="../TelnetGenerator.h" /> <ClInclude Include="../TelnetGenerator.h" />
<ClInclude Include="../ColorHelper.h" /> <ClInclude Include="../ColorHelper.h" />
<ClInclude Include="../TerminalSettings.h">
<DependentUpon>../TerminalSettings.idl</DependentUpon>
</ClInclude>
<ClInclude Include="pch.h" /> <ClInclude Include="pch.h" />
<ClInclude Include="../ShortcutActionDispatch.h"> <ClInclude Include="../ShortcutActionDispatch.h">
<DependentUpon>../ShortcutActionDispatch.idl</DependentUpon> <DependentUpon>../ShortcutActionDispatch.idl</DependentUpon>
@@ -186,6 +189,9 @@
<ClCompile Include="../Pane.LayoutSizeNode.cpp" /> <ClCompile Include="../Pane.LayoutSizeNode.cpp" />
<ClCompile Include="../ColorHelper.cpp" /> <ClCompile Include="../ColorHelper.cpp" />
<ClCompile Include="../DebugTapConnection.cpp" /> <ClCompile Include="../DebugTapConnection.cpp" />
<ClCompile Include="../TerminalSettings.cpp">
<DependentUpon>../TerminalSettings.idl</DependentUpon>
</ClCompile>
<ClCompile Include="pch.cpp"> <ClCompile Include="pch.cpp">
<PrecompiledHeader>Create</PrecompiledHeader> <PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile> </ClCompile>
@@ -256,6 +262,7 @@
<Midl Include="../Command.idl" /> <Midl Include="../Command.idl" />
<Midl Include="../CommandKeyChordVisibilityConverter.idl" /> <Midl Include="../CommandKeyChordVisibilityConverter.idl" />
<Midl Include="../Tab.idl" /> <Midl Include="../Tab.idl" />
<Midl Include="../TerminalSettings.idl" />
</ItemGroup> </ItemGroup>
<!-- ========================= Misc Files ======================== --> <!-- ========================= Misc Files ======================== -->
<ItemGroup> <ItemGroup>

View File

@@ -59,7 +59,7 @@
<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="../CommandSerialization.cpp"> <ClCompile Include="../TerminalSettings.cpp">
<Filter>settings</Filter> <Filter>settings</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
@@ -119,7 +119,7 @@
<ClInclude Include="../TelnetGenerator.h"> <ClInclude Include="../TelnetGenerator.h">
<Filter>profileGeneration</Filter> <Filter>profileGeneration</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="../CommandSerialization.h"> <ClInclude Include="../TerminalSettings.h">
<Filter>settings</Filter> <Filter>settings</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
@@ -139,10 +139,14 @@
<Midl Include="../Tab.idl"> <Midl Include="../Tab.idl">
<Filter>tab</Filter> <Filter>tab</Filter>
</Midl> </Midl>
<Midl Include="../IF7Listener.idl" />
<Midl Include="../Command.idl"> <Midl Include="../Command.idl">
<Filter>commandPalette</Filter> <Filter>commandPalette</Filter>
</Midl> </Midl>
<Midl Include="../IDirectKeyListener.idl" />
<Midl Include="../CommandKeyChordVisibilityConverter.idl" />
<Midl Include="../TerminalSettings.idl">
<Filter>settings</Filter>
</Midl>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="../packages.config" /> <None Include="../packages.config" />
@@ -198,4 +202,4 @@
<Filter>app</Filter> <Filter>app</Filter>
</ApplicationDefinition> </ApplicationDefinition>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -56,11 +56,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation
return initialized; return initialized;
} }
TermControl::TermControl() :
TermControl(Settings::TerminalSettings{}, TerminalConnection::ITerminalConnection{ nullptr })
{
}
TermControl::TermControl(Settings::IControlSettings settings, TerminalConnection::ITerminalConnection connection) : TermControl::TermControl(Settings::IControlSettings settings, TerminalConnection::ITerminalConnection connection) :
_connection{ connection }, _connection{ connection },
_initializedTerminal{ false }, _initializedTerminal{ false },

View File

@@ -56,7 +56,6 @@ namespace winrt::Microsoft::Terminal::TerminalControl::implementation
struct TermControl : TermControlT<TermControl> struct TermControl : TermControlT<TermControl>
{ {
TermControl();
TermControl(Settings::IControlSettings settings, TerminalConnection::ITerminalConnection connection); TermControl(Settings::IControlSettings settings, TerminalConnection::ITerminalConnection connection);
winrt::fire_and_forget UpdateSettings(Settings::IControlSettings newSettings); winrt::fire_and_forget UpdateSettings(Settings::IControlSettings newSettings);

View File

@@ -32,7 +32,6 @@ namespace Microsoft.Terminal.TerminalControl
[default_interface] runtimeclass TermControl : Windows.UI.Xaml.Controls.UserControl, IDirectKeyListener, IMouseWheelListener [default_interface] runtimeclass TermControl : Windows.UI.Xaml.Controls.UserControl, IDirectKeyListener, IMouseWheelListener
{ {
TermControl();
TermControl(Microsoft.Terminal.Settings.IControlSettings settings, Microsoft.Terminal.TerminalConnection.ITerminalConnection connection); TermControl(Microsoft.Terminal.Settings.IControlSettings settings, Microsoft.Terminal.TerminalConnection.ITerminalConnection connection);
static Windows.Foundation.Size GetProposedDimensions(Microsoft.Terminal.Settings.IControlSettings settings, UInt32 dpi); static Windows.Foundation.Size GetProposedDimensions(Microsoft.Terminal.Settings.IControlSettings settings, UInt32 dpi);

View File

@@ -486,14 +486,14 @@ bool Terminal::SendKeyEvent(const WORD vkey,
// - false if we did not translate the key, and it should be processed into a character. // - false if we did not translate the key, and it should be processed into a character.
bool Terminal::SendMouseEvent(const COORD viewportPos, const unsigned int uiButton, const ControlKeyStates states, const short wheelDelta) bool Terminal::SendMouseEvent(const COORD viewportPos, const unsigned int uiButton, const ControlKeyStates states, const short wheelDelta)
{ {
// viewportPos must be within the dimensions of the viewport // GH#6401: VT applications should be able to receive mouse events from outside the
const auto viewportDimensions = _mutableViewport.Dimensions(); // terminal buffer. This is likely to happen when the user drags the cursor offscreen.
if (viewportPos.X < 0 || viewportPos.X >= viewportDimensions.X || viewportPos.Y < 0 || viewportPos.Y >= viewportDimensions.Y) // We shouldn't throw away perfectly good events when they're offscreen, so we just
{ // clamp them to be within the range [(0, 0), (W, H)].
return false; #pragma warning(suppress : 26496) // analysis can't tell we're assigning through a reference below
} auto clampedPos{ viewportPos };
_mutableViewport.ToOrigin().Clamp(clampedPos);
return _terminalInput->HandleMouse(viewportPos, uiButton, GET_KEYSTATE_WPARAM(states.Value()), wheelDelta); return _terminalInput->HandleMouse(clampedPos, uiButton, GET_KEYSTATE_WPARAM(states.Value()), wheelDelta);
} }
// Method Description: // Method Description:

View File

@@ -17,18 +17,13 @@
--> -->
<NoOutputRedirection>true</NoOutputRedirection> <NoOutputRedirection>true</NoOutputRedirection>
</PropertyGroup> </PropertyGroup>
<Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" /> <Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.pre.props" /> <Import Project="$(OpenConsoleDir)src\cppwinrt.build.pre.props" />
<ItemGroup> <ItemGroup>
<ClInclude Include="pch.h" /> <ClInclude Include="pch.h" />
<ClInclude Include="KeyChord.h"> <ClInclude Include="KeyChord.h">
<DependentUpon>KeyChord.idl</DependentUpon> <DependentUpon>KeyChord.idl</DependentUpon>
</ClInclude> </ClInclude>
<ClInclude Include="TerminalSettings.h">
<DependentUpon>TerminalSettings.idl</DependentUpon>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="pch.cpp"> <ClCompile Include="pch.cpp">
@@ -37,13 +32,9 @@
<ClCompile Include="KeyChord.cpp"> <ClCompile Include="KeyChord.cpp">
<DependentUpon>KeyChord.idl</DependentUpon> <DependentUpon>KeyChord.idl</DependentUpon>
</ClCompile> </ClCompile>
<ClCompile Include="TerminalSettings.cpp">
<DependentUpon>TerminalSettings.idl</DependentUpon>
</ClCompile>
<ClCompile Include="$(GeneratedFilesDir)module.g.cpp" /> <ClCompile Include="$(GeneratedFilesDir)module.g.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Midl Include="TerminalSettings.idl" />
<Midl Include="ICoreSettings.idl" /> <Midl Include="ICoreSettings.idl" />
<Midl Include="IControlSettings.idl" /> <Midl Include="IControlSettings.idl" />
<Midl Include="KeyChord.idl" /> <Midl Include="KeyChord.idl" />
@@ -53,6 +44,5 @@
<None Include="packages.config" /> <None Include="packages.config" />
<None Include="TerminalSettings.def" /> <None Include="TerminalSettings.def" />
</ItemGroup> </ItemGroup>
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.post.props" /> <Import Project="$(OpenConsoleDir)src\cppwinrt.build.post.props" />
</Project> </Project>

View File

@@ -123,7 +123,14 @@ bool HandleTerminalMouseEvent(const COORD cMousePosition,
// Virtual terminal input mode // Virtual terminal input mode
if (IsInVirtualTerminalInputMode()) if (IsInVirtualTerminalInputMode())
{ {
fWasHandled = gci.GetActiveInputBuffer()->GetTerminalInput().HandleMouse(cMousePosition, uiButton, sModifierKeystate, sWheelDelta); // GH#6401: VT applications should be able to receive mouse events from outside the
// terminal buffer. This is likely to happen when the user drags the cursor offscreen.
// We shouldn't throw away perfectly good events when they're offscreen, so we just
// clamp them to be within the range [(0, 0), (W, H)].
auto clampedPosition{ cMousePosition };
const auto clampViewport{ gci.GetActiveOutputBuffer().GetViewport().ToOrigin() };
clampViewport.Clamp(clampedPosition);
fWasHandled = gci.GetActiveInputBuffer()->GetTerminalInput().HandleMouse(clampedPosition, uiButton, sModifierKeystate, sWheelDelta);
} }
return fWasHandled; return fWasHandled;
@@ -635,6 +642,25 @@ BOOL HandleMouseEvent(const SCREEN_INFORMATION& ScreenInfo,
if (HandleTerminalMouseEvent(MousePosition, Message, GET_KEYSTATE_WPARAM(wParam), sDelta)) if (HandleTerminalMouseEvent(MousePosition, Message, GET_KEYSTATE_WPARAM(wParam), sDelta))
{ {
// GH#6401: Capturing the mouse ensures that we get drag/release events
// even if the user moves outside the window.
// HandleTerminalMouseEvent returns false if the terminal's not in VT mode,
// so capturing/releasing here should not impact other console mouse event
// consumers.
switch (Message)
{
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
SetCapture(ServiceLocator::LocateConsoleWindow()->GetWindowHandle());
break;
case WM_LBUTTONUP:
case WM_MBUTTONUP:
case WM_RBUTTONUP:
ReleaseCapture();
break;
}
return FALSE; return FALSE;
} }
} }