mirror of
https://github.com/microsoft/terminal.git
synced 2026-05-18 01:39:55 +00:00
Compare commits
7 Commits
v1.25.1241
...
dev/duhowe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
740f9f4452 | ||
|
|
f96be52442 | ||
|
|
8a0c03619d | ||
|
|
9096325b36 | ||
|
|
f13a40dae4 | ||
|
|
ee30fc4ff1 | ||
|
|
8481c409ad |
@@ -2816,14 +2816,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlCore::AnchorContextMenu(const til::point viewportRelativeCharacterPosition)
|
|
||||||
{
|
|
||||||
// viewportRelativeCharacterPosition is relative to the current
|
|
||||||
// viewport, so adjust for that:
|
|
||||||
const auto lock = _terminal->LockForReading();
|
|
||||||
_contextMenuBufferPosition = _terminal->GetViewport().Origin() + viewportRelativeCharacterPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ControlCore::_contextMenuSelectMark(
|
void ControlCore::_contextMenuSelectMark(
|
||||||
const til::point& pos,
|
const til::point& pos,
|
||||||
bool (*filter)(const ::MarkExtents&),
|
bool (*filter)(const ::MarkExtents&),
|
||||||
@@ -2859,17 +2851,19 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlCore::ContextMenuSelectCommand()
|
void ControlCore::ContextMenuSelectCommand(Core::Point viewportRelativeCharacterPosition)
|
||||||
{
|
{
|
||||||
|
const auto contextMenuBufferPosition = _terminal->GetViewport().Origin() + til::point{ viewportRelativeCharacterPosition };
|
||||||
_contextMenuSelectMark(
|
_contextMenuSelectMark(
|
||||||
_contextMenuBufferPosition,
|
contextMenuBufferPosition,
|
||||||
[](const ::MarkExtents& m) -> bool { return !m.HasCommand(); },
|
[](const ::MarkExtents& m) -> bool { return !m.HasCommand(); },
|
||||||
[](const ::MarkExtents& m) { return til::point_span{ m.end, *m.commandEnd }; });
|
[](const ::MarkExtents& m) { return til::point_span{ m.end, *m.commandEnd }; });
|
||||||
}
|
}
|
||||||
void ControlCore::ContextMenuSelectOutput()
|
void ControlCore::ContextMenuSelectOutput(Core::Point viewportRelativeCharacterPosition)
|
||||||
{
|
{
|
||||||
|
const auto contextMenuBufferPosition = _terminal->GetViewport().Origin() + til::point{ viewportRelativeCharacterPosition };
|
||||||
_contextMenuSelectMark(
|
_contextMenuSelectMark(
|
||||||
_contextMenuBufferPosition,
|
contextMenuBufferPosition,
|
||||||
[](const ::MarkExtents& m) -> bool { return !m.HasOutput(); },
|
[](const ::MarkExtents& m) -> bool { return !m.HasOutput(); },
|
||||||
[](const ::MarkExtents& m) { return til::point_span{ *m.commandEnd, *m.outputEnd }; });
|
[](const ::MarkExtents& m) { return til::point_span{ *m.commandEnd, *m.outputEnd }; });
|
||||||
}
|
}
|
||||||
@@ -2909,24 +2903,19 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Method Description:
|
MenuAction ControlCore::GetApplicableMenuActionsAtPosition(Core::Point viewportRelativeCharacterPosition)
|
||||||
// * Don't show this if the click was on the _current_ selection
|
|
||||||
// * Don't show this if the click wasn't on a mark with at least a command
|
|
||||||
// * Otherwise yea, show it.
|
|
||||||
bool ControlCore::ShouldShowSelectCommand()
|
|
||||||
{
|
{
|
||||||
// Relies on the anchor set in AnchorContextMenu
|
const auto contextMenuBufferPosition = _terminal->GetViewport().Origin() + til::point{ viewportRelativeCharacterPosition };
|
||||||
return _clickedOnMark(_contextMenuBufferPosition,
|
MenuAction r{};
|
||||||
[](const ::MarkExtents& m) -> bool { return !m.HasCommand(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
// Method Description:
|
const auto clickedOnCommand = _clickedOnMark(contextMenuBufferPosition,
|
||||||
// * Same as ShouldShowSelectCommand, but with the mark needing output
|
[](const ::MarkExtents& m) -> bool { return !m.HasCommand(); });
|
||||||
bool ControlCore::ShouldShowSelectOutput()
|
const auto clickedOnOutput = _clickedOnMark(contextMenuBufferPosition,
|
||||||
{
|
[](const ::MarkExtents& m) -> bool { return !m.HasOutput(); });
|
||||||
// Relies on the anchor set in AnchorContextMenu
|
|
||||||
return _clickedOnMark(_contextMenuBufferPosition,
|
WI_UpdateFlag(r, MenuAction::SelectCommand, clickedOnCommand);
|
||||||
[](const ::MarkExtents& m) -> bool { return !m.HasOutput(); });
|
WI_UpdateFlag(r, MenuAction::SelectOutput, clickedOnOutput);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ControlCore::PreviewInput(std::wstring_view input)
|
void ControlCore::PreviewInput(std::wstring_view input)
|
||||||
|
|||||||
@@ -186,8 +186,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
void SelectCommand(const bool goUp);
|
void SelectCommand(const bool goUp);
|
||||||
void SelectOutput(const bool goUp);
|
void SelectOutput(const bool goUp);
|
||||||
|
|
||||||
void ContextMenuSelectCommand();
|
void ContextMenuSelectCommand(winrt::Microsoft::Terminal::Core::Point viewportRelativeCharacterPosition);
|
||||||
void ContextMenuSelectOutput();
|
void ContextMenuSelectOutput(winrt::Microsoft::Terminal::Core::Point viewportRelativeCharacterPosition);
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
||||||
#pragma region ITerminalInput
|
#pragma region ITerminalInput
|
||||||
@@ -258,10 +258,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
TerminalConnection::ITerminalConnection Connection();
|
TerminalConnection::ITerminalConnection Connection();
|
||||||
void Connection(const TerminalConnection::ITerminalConnection& connection);
|
void Connection(const TerminalConnection::ITerminalConnection& connection);
|
||||||
|
|
||||||
void AnchorContextMenu(til::point viewportRelativeCharacterPosition);
|
MenuAction GetApplicableMenuActionsAtPosition(winrt::Microsoft::Terminal::Core::Point viewportRelativeCharacterPosition);
|
||||||
|
|
||||||
bool ShouldShowSelectCommand();
|
|
||||||
bool ShouldShowSelectOutput();
|
|
||||||
|
|
||||||
void PreviewInput(std::wstring_view input);
|
void PreviewInput(std::wstring_view input);
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ namespace Microsoft.Terminal.Control
|
|||||||
IsRightButtonDown = 0x4
|
IsRightButtonDown = 0x4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[flags] enum MenuAction {
|
||||||
|
SelectCommand = 0x1,
|
||||||
|
SelectOutput = 0x2,
|
||||||
|
};
|
||||||
|
|
||||||
enum ClearBufferType
|
enum ClearBufferType
|
||||||
{
|
{
|
||||||
Screen,
|
Screen,
|
||||||
@@ -163,10 +168,9 @@ namespace Microsoft.Terminal.Control
|
|||||||
|
|
||||||
void ColorSelection(SelectionColor fg, SelectionColor bg, Microsoft.Terminal.Core.MatchMode matchMode);
|
void ColorSelection(SelectionColor fg, SelectionColor bg, Microsoft.Terminal.Core.MatchMode matchMode);
|
||||||
|
|
||||||
void ContextMenuSelectCommand();
|
MenuAction GetApplicableMenuActionsAtPosition(Microsoft.Terminal.Core.Point pos);
|
||||||
void ContextMenuSelectOutput();
|
void ContextMenuSelectCommand(Microsoft.Terminal.Core.Point pos);
|
||||||
Boolean ShouldShowSelectCommand();
|
void ContextMenuSelectOutput(Microsoft.Terminal.Core.Point pos);
|
||||||
Boolean ShouldShowSelectOutput();
|
|
||||||
|
|
||||||
void ClearQuickFix();
|
void ClearQuickFix();
|
||||||
|
|
||||||
|
|||||||
@@ -301,12 +301,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
{
|
{
|
||||||
if (_core->Settings().RightClickContextMenu())
|
if (_core->Settings().RightClickContextMenu())
|
||||||
{
|
{
|
||||||
// Let the core know we're about to open a menu here. It has
|
auto contextArgs = winrt::make<ContextMenuRequestedEventArgs>(
|
||||||
// some separate conditional logic based on _where_ the user
|
til::point{ pixelPosition }.to_winrt_point(),
|
||||||
// wanted to open the menu.
|
terminalPosition.to_core_point());
|
||||||
_core->AnchorContextMenu(terminalPosition);
|
|
||||||
|
|
||||||
auto contextArgs = winrt::make<ContextMenuRequestedEventArgs>(til::point{ pixelPosition }.to_winrt_point());
|
|
||||||
ContextMenuRequested.raise(*this, contextArgs);
|
ContextMenuRequested.raise(*this, contextArgs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -49,10 +49,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
struct ContextMenuRequestedEventArgs : public ContextMenuRequestedEventArgsT<ContextMenuRequestedEventArgs>
|
struct ContextMenuRequestedEventArgs : public ContextMenuRequestedEventArgsT<ContextMenuRequestedEventArgs>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ContextMenuRequestedEventArgs(winrt::Windows::Foundation::Point pos) :
|
ContextMenuRequestedEventArgs(winrt::Windows::Foundation::Point pos, winrt::Microsoft::Terminal::Core::Point pos2) :
|
||||||
_Position(pos) {}
|
_PixelPosition(pos),
|
||||||
|
_TerminalPosition(pos2) {}
|
||||||
|
|
||||||
WINRT_PROPERTY(winrt::Windows::Foundation::Point, Position);
|
WINRT_PROPERTY(winrt::Windows::Foundation::Point, PixelPosition);
|
||||||
|
WINRT_PROPERTY(winrt::Microsoft::Terminal::Core::Point, TerminalPosition);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PasteFromClipboardEventArgs : public PasteFromClipboardEventArgsT<PasteFromClipboardEventArgs>
|
struct PasteFromClipboardEventArgs : public PasteFromClipboardEventArgsT<PasteFromClipboardEventArgs>
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ namespace Microsoft.Terminal.Control
|
|||||||
|
|
||||||
runtimeclass ContextMenuRequestedEventArgs
|
runtimeclass ContextMenuRequestedEventArgs
|
||||||
{
|
{
|
||||||
Windows.Foundation.Point Position { get; };
|
Windows.Foundation.Point PixelPosition { get; };
|
||||||
|
Microsoft.Terminal.Core.Point TerminalPosition { get; };
|
||||||
}
|
}
|
||||||
|
|
||||||
runtimeclass TitleChangedEventArgs
|
runtimeclass TitleChangedEventArgs
|
||||||
|
|||||||
@@ -253,14 +253,6 @@ Please either install the missing font or choose another one.</value>
|
|||||||
<value>Copy</value>
|
<value>Copy</value>
|
||||||
<comment>The tooltip for a copy button</comment>
|
<comment>The tooltip for a copy button</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="PasteWithSelectionCommandButton.Label" xml:space="preserve">
|
|
||||||
<value>Paste</value>
|
|
||||||
<comment>The label of a button for pasting the contents of the clipboard.</comment>
|
|
||||||
</data>
|
|
||||||
<data name="PasteWithSelectionCommandButton.ToolTipService.ToolTip" xml:space="preserve">
|
|
||||||
<value>Paste</value>
|
|
||||||
<comment>The tooltip for a paste button</comment>
|
|
||||||
</data>
|
|
||||||
<data name="SearchCommandButton.Label" xml:space="preserve">
|
<data name="SearchCommandButton.Label" xml:space="preserve">
|
||||||
<value>Find...</value>
|
<value>Find...</value>
|
||||||
<comment>The label of a button for searching for the selected text</comment>
|
<comment>The label of a button for searching for the selected text</comment>
|
||||||
@@ -285,22 +277,6 @@ Please either install the missing font or choose another one.</value>
|
|||||||
<value>Select output</value>
|
<value>Select output</value>
|
||||||
<comment>The tooltip for a button for selecting all of a command's output</comment>
|
<comment>The tooltip for a button for selecting all of a command's output</comment>
|
||||||
</data>
|
</data>
|
||||||
<data name="SelectCommandWithSelectionButton.Label" xml:space="preserve">
|
|
||||||
<value>Select command</value>
|
|
||||||
<comment>The label of a button for selecting all of the text of a command</comment>
|
|
||||||
</data>
|
|
||||||
<data name="SelectCommandWithSelectionButton.ToolTipService.ToolTip" xml:space="preserve">
|
|
||||||
<value>Select command</value>
|
|
||||||
<comment>The tooltip for a button for selecting all of the text of a command</comment>
|
|
||||||
</data>
|
|
||||||
<data name="SelectOutputWithSelectionButton.Label" xml:space="preserve">
|
|
||||||
<value>Select output</value>
|
|
||||||
<comment>The label of a button for selecting all of a command's output</comment>
|
|
||||||
</data>
|
|
||||||
<data name="SelectOutputWithSelectionButton.ToolTipService.ToolTip" xml:space="preserve">
|
|
||||||
<value>Select output</value>
|
|
||||||
<comment>The tooltip for a button for selecting all of a command's output</comment>
|
|
||||||
</data>
|
|
||||||
<data name="QuickFixButton.ToolTipService.ToolTip" xml:space="preserve">
|
<data name="QuickFixButton.ToolTipService.ToolTip" xml:space="preserve">
|
||||||
<value>Quick fix</value>
|
<value>Quick fix</value>
|
||||||
</data>
|
</data>
|
||||||
@@ -334,4 +310,4 @@ Please either install the missing font or choose another one.</value>
|
|||||||
<value>Suggested input: {0}</value>
|
<value>Suggested input: {0}</value>
|
||||||
<comment>{Locked="{0}"} {0} will be replaced with a string of input that is suggested for the user to input</comment>
|
<comment>{Locked="{0}"} {0} will be replaced with a string of input that is suggested for the user to input</comment>
|
||||||
</data>
|
</data>
|
||||||
</root>
|
</root>
|
||||||
|
|||||||
@@ -3844,6 +3844,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
this->TransformToVisual(nullptr).TransformPoint(Windows::Foundation::Point(0, 0)) };
|
this->TransformToVisual(nullptr).TransformPoint(Windows::Foundation::Point(0, 0)) };
|
||||||
|
|
||||||
const auto pos = (absolutePointerPos - absoluteWindowOrigin - controlOrigin);
|
const auto pos = (absolutePointerPos - absoluteWindowOrigin - controlOrigin);
|
||||||
|
_lastContextMenuTerminalPosition = args.TerminalPosition();
|
||||||
_showContextMenuAt(pos);
|
_showContextMenuAt(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3854,14 +3855,18 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
myOption.Placement(Controls::Primitives::FlyoutPlacementMode::TopEdgeAlignedLeft);
|
myOption.Placement(Controls::Primitives::FlyoutPlacementMode::TopEdgeAlignedLeft);
|
||||||
myOption.Position(controlRelativePos.to_winrt_point());
|
myOption.Position(controlRelativePos.to_winrt_point());
|
||||||
|
|
||||||
|
const auto applicableActions{ _core.GetApplicableMenuActionsAtPosition(_lastContextMenuTerminalPosition) };
|
||||||
|
|
||||||
|
const auto applicabilityToVisibility = [applicableActions](MenuAction a) {
|
||||||
|
return (applicableActions & a) != (MenuAction)0 ? Visibility::Visible : Visibility::Collapsed;
|
||||||
|
};
|
||||||
|
|
||||||
// The "Select command" and "Select output" buttons should only be
|
// The "Select command" and "Select output" buttons should only be
|
||||||
// visible if shell integration is actually turned on.
|
// visible if shell integration is actually turned on.
|
||||||
const auto shouldShowSelectCommand{ _core.ShouldShowSelectCommand() };
|
SelectCommandButton().Visibility(applicabilityToVisibility(MenuAction::SelectCommand));
|
||||||
const auto shouldShowSelectOutput{ _core.ShouldShowSelectOutput() };
|
SelectCommandWithSelectionButton().Visibility(applicabilityToVisibility(MenuAction::SelectCommand));
|
||||||
SelectCommandButton().Visibility(shouldShowSelectCommand ? Visibility::Visible : Visibility::Collapsed);
|
SelectOutputButton().Visibility(applicabilityToVisibility(MenuAction::SelectOutput));
|
||||||
SelectOutputButton().Visibility(shouldShowSelectOutput ? Visibility::Visible : Visibility::Collapsed);
|
SelectOutputWithSelectionButton().Visibility(applicabilityToVisibility(MenuAction::SelectOutput));
|
||||||
SelectCommandWithSelectionButton().Visibility(shouldShowSelectCommand ? Visibility::Visible : Visibility::Collapsed);
|
|
||||||
SelectOutputWithSelectionButton().Visibility(shouldShowSelectOutput ? Visibility::Visible : Visibility::Collapsed);
|
|
||||||
|
|
||||||
(_core.HasSelection() ? SelectionContextMenu() :
|
(_core.HasSelection() ? SelectionContextMenu() :
|
||||||
ContextMenu())
|
ContextMenu())
|
||||||
@@ -3881,6 +3886,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
// * {+1,+1} if there's no selection, to be on the bottom-right corner of
|
// * {+1,+1} if there's no selection, to be on the bottom-right corner of
|
||||||
// the cursor position
|
// the cursor position
|
||||||
cursorPos += til::point{ hasSelection ? 0 : 1, 1 };
|
cursorPos += til::point{ hasSelection ? 0 : 1, 1 };
|
||||||
|
_lastContextMenuTerminalPosition = cursorPos.to_core_point();
|
||||||
_showContextMenuAt(_toControlOrigin(cursorPos));
|
_showContextMenuAt(_toControlOrigin(cursorPos));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4014,7 +4020,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
{
|
{
|
||||||
ContextMenu().Hide();
|
ContextMenu().Hide();
|
||||||
SelectionContextMenu().Hide();
|
SelectionContextMenu().Hide();
|
||||||
_core.ContextMenuSelectCommand();
|
_core.ContextMenuSelectCommand(_lastContextMenuTerminalPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TermControl::_SelectOutputHandler(const IInspectable& /*sender*/,
|
void TermControl::_SelectOutputHandler(const IInspectable& /*sender*/,
|
||||||
@@ -4022,7 +4028,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
{
|
{
|
||||||
ContextMenu().Hide();
|
ContextMenu().Hide();
|
||||||
SelectionContextMenu().Hide();
|
SelectionContextMenu().Hide();
|
||||||
_core.ContextMenuSelectOutput();
|
_core.ContextMenuSelectOutput(_lastContextMenuTerminalPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Should the text cursor be displayed, even when the control isn't focused?
|
// Should the text cursor be displayed, even when the control isn't focused?
|
||||||
|
|||||||
@@ -275,6 +275,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||||||
std::optional<std::chrono::high_resolution_clock::time_point> _lastAutoScrollUpdateTime;
|
std::optional<std::chrono::high_resolution_clock::time_point> _lastAutoScrollUpdateTime;
|
||||||
bool _pointerPressedInBounds{ false };
|
bool _pointerPressedInBounds{ false };
|
||||||
|
|
||||||
|
winrt::Microsoft::Terminal::Core::Point _lastContextMenuTerminalPosition{};
|
||||||
|
|
||||||
winrt::Windows::UI::Composition::ScalarKeyFrameAnimation _bellLightAnimation{ nullptr };
|
winrt::Windows::UI::Composition::ScalarKeyFrameAnimation _bellLightAnimation{ nullptr };
|
||||||
winrt::Windows::UI::Composition::ScalarKeyFrameAnimation _bellDarkAnimation{ nullptr };
|
winrt::Windows::UI::Composition::ScalarKeyFrameAnimation _bellDarkAnimation{ nullptr };
|
||||||
SafeDispatcherTimer _bellLightTimer;
|
SafeDispatcherTimer _bellLightTimer;
|
||||||
|
|||||||
@@ -60,7 +60,7 @@
|
|||||||
Click="_CopyCommandHandler"
|
Click="_CopyCommandHandler"
|
||||||
Icon="Copy" />
|
Icon="Copy" />
|
||||||
<AppBarButton x:Name="PasteWithSelectionCommandButton"
|
<AppBarButton x:Name="PasteWithSelectionCommandButton"
|
||||||
x:Uid="PasteWithSelectionCommandButton"
|
x:Uid="PasteCommandButton"
|
||||||
Click="_PasteCommandHandler"
|
Click="_PasteCommandHandler"
|
||||||
Icon="Paste" />
|
Icon="Paste" />
|
||||||
<mux:CommandBarFlyout.SecondaryCommands>
|
<mux:CommandBarFlyout.SecondaryCommands>
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
Click="_SearchCommandHandler"
|
Click="_SearchCommandHandler"
|
||||||
Icon="Find" />
|
Icon="Find" />
|
||||||
<AppBarButton x:Name="SelectCommandWithSelectionButton"
|
<AppBarButton x:Name="SelectCommandWithSelectionButton"
|
||||||
x:Uid="SelectCommandWithSelectionButton"
|
x:Uid="SelectCommandButton"
|
||||||
Click="_SelectCommandHandler">
|
Click="_SelectCommandHandler">
|
||||||
<AppBarButton.Icon>
|
<AppBarButton.Icon>
|
||||||
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
|
<FontIcon FontFamily="{ThemeResource SymbolThemeFontFamily}"
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
</AppBarButton.Icon>
|
</AppBarButton.Icon>
|
||||||
</AppBarButton>
|
</AppBarButton>
|
||||||
<AppBarButton x:Name="SelectOutputWithSelectionButton"
|
<AppBarButton x:Name="SelectOutputWithSelectionButton"
|
||||||
x:Uid="SelectOutputWithSelectionButton"
|
x:Uid="SelectOutputButton"
|
||||||
Click="_SelectOutputHandler"
|
Click="_SelectOutputHandler"
|
||||||
Icon="AlignLeft" />
|
Icon="AlignLeft" />
|
||||||
</mux:CommandBarFlyout.SecondaryCommands>
|
</mux:CommandBarFlyout.SecondaryCommands>
|
||||||
|
|||||||
Reference in New Issue
Block a user