mirror of
https://github.com/microsoft/terminal.git
synced 2026-07-09 02:26:45 +00:00
Add auto_revokers to all TermControl ev handlers, but that wasn't what ended up fixing this bug.
All we actually needed was to do a _FontSizeChangedHandlers() to set up the font size and the markers in the TermControl.
This commit is contained in:
@@ -233,7 +233,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
{
|
||||
_settings->KeyBindings(keyBindings);
|
||||
_setupDispatcherAndCallbacks();
|
||||
|
||||
const auto actualNewSize = _actualFont.GetSize();
|
||||
// Bubble this up, so our new control knows how big we want the font.
|
||||
_FontSizeChangedHandlers(actualNewSize.width, actualNewSize.height, true);
|
||||
_AttachedHandlers(*this, nullptr);
|
||||
}
|
||||
|
||||
|
||||
@@ -72,36 +72,36 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
// These events might all be triggered by the connection, but that
|
||||
// should be drained and closed before we complete destruction. So these
|
||||
// are safe.
|
||||
_core.ScrollPositionChanged({ get_weak(), &TermControl::_ScrollPositionChanged });
|
||||
_core.WarningBell({ get_weak(), &TermControl::_coreWarningBell });
|
||||
_core.CursorPositionChanged({ get_weak(), &TermControl::_CursorPositionChanged });
|
||||
_revokers.coreScrollPositionChanged = _core.ScrollPositionChanged(winrt::auto_revoke, { get_weak(), &TermControl::_ScrollPositionChanged });
|
||||
_revokers.WarningBell = _core.WarningBell(winrt::auto_revoke, { get_weak(), &TermControl::_coreWarningBell });
|
||||
_revokers.CursorPositionChanged = _core.CursorPositionChanged(winrt::auto_revoke, { get_weak(), &TermControl::_CursorPositionChanged });
|
||||
|
||||
// This event is specifically triggered by the renderer thread, a BG thread. Use a weak ref here.
|
||||
_core.RendererEnteredErrorState({ get_weak(), &TermControl::_RendererEnteredErrorState });
|
||||
_revokers.RendererEnteredErrorState = _core.RendererEnteredErrorState(winrt::auto_revoke, { get_weak(), &TermControl::_RendererEnteredErrorState });
|
||||
|
||||
// These callbacks can only really be triggered by UI interactions. So
|
||||
// they don't need weak refs - they can't be triggered unless we're
|
||||
// alive.
|
||||
_core.BackgroundColorChanged({ get_weak(), &TermControl::_coreBackgroundColorChanged });
|
||||
_core.FontSizeChanged({ get_weak(), &TermControl::_coreFontSizeChanged });
|
||||
_core.TransparencyChanged({ get_weak(), &TermControl::_coreTransparencyChanged });
|
||||
_core.RaiseNotice({ get_weak(), &TermControl::_coreRaisedNotice });
|
||||
_core.HoveredHyperlinkChanged({ get_weak(), &TermControl::_hoveredHyperlinkChanged });
|
||||
_core.FoundMatch({ get_weak(), &TermControl::_coreFoundMatch });
|
||||
_core.UpdateSelectionMarkers({ get_weak(), &TermControl::_updateSelectionMarkers });
|
||||
_core.OpenHyperlink({ get_weak(), &TermControl::_HyperlinkHandler });
|
||||
_interactivity.OpenHyperlink({ get_weak(), &TermControl::_HyperlinkHandler });
|
||||
_interactivity.ScrollPositionChanged({ get_weak(), &TermControl::_ScrollPositionChanged });
|
||||
_revokers.BackgroundColorChanged = _core.BackgroundColorChanged(winrt::auto_revoke, { get_weak(), &TermControl::_coreBackgroundColorChanged });
|
||||
_revokers.FontSizeChanged = _core.FontSizeChanged(winrt::auto_revoke, { get_weak(), &TermControl::_coreFontSizeChanged });
|
||||
_revokers.TransparencyChanged = _core.TransparencyChanged(winrt::auto_revoke, { get_weak(), &TermControl::_coreTransparencyChanged });
|
||||
_revokers.RaiseNotice = _core.RaiseNotice(winrt::auto_revoke, { get_weak(), &TermControl::_coreRaisedNotice });
|
||||
_revokers.HoveredHyperlinkChanged = _core.HoveredHyperlinkChanged(winrt::auto_revoke, { get_weak(), &TermControl::_hoveredHyperlinkChanged });
|
||||
_revokers.FoundMatch = _core.FoundMatch(winrt::auto_revoke, { get_weak(), &TermControl::_coreFoundMatch });
|
||||
_revokers.UpdateSelectionMarkers = _core.UpdateSelectionMarkers(winrt::auto_revoke, { get_weak(), &TermControl::_updateSelectionMarkers });
|
||||
_revokers.coreOpenHyperlink = _core.OpenHyperlink(winrt::auto_revoke, { get_weak(), &TermControl::_HyperlinkHandler });
|
||||
_revokers.interactivityOpenHyperlink = _interactivity.OpenHyperlink(winrt::auto_revoke, { get_weak(), &TermControl::_HyperlinkHandler });
|
||||
_revokers.interactivityScrollPositionChanged = _interactivity.ScrollPositionChanged(winrt::auto_revoke, { get_weak(), &TermControl::_ScrollPositionChanged });
|
||||
|
||||
_core.CopyToClipboard({ get_weak(), &TermControl::_bubbleCopyToClipboard });
|
||||
_core.TitleChanged({ get_weak(), &TermControl::_bubbleTitleChanged });
|
||||
_core.TabColorChanged({ get_weak(), &TermControl::_bubbleTabColorChanged });
|
||||
_core.TaskbarProgressChanged({ get_weak(), &TermControl::_bubbleSetTaskbarProgress });
|
||||
_core.ConnectionStateChanged({ get_weak(), &TermControl::_bubbleConnectionStateChanged });
|
||||
_core.ShowWindowChanged({ get_weak(), &TermControl::_bubbleShowWindowChanged });
|
||||
_core.CloseTerminalRequested({ get_weak(), &TermControl::_bubbleCloseTerminalRequested });
|
||||
_revokers.CopyToClipboard = _core.CopyToClipboard(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleCopyToClipboard });
|
||||
_revokers.TitleChanged = _core.TitleChanged(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleTitleChanged });
|
||||
_revokers.TabColorChanged = _core.TabColorChanged(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleTabColorChanged });
|
||||
_revokers.TaskbarProgressChanged = _core.TaskbarProgressChanged(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleSetTaskbarProgress });
|
||||
_revokers.ConnectionStateChanged = _core.ConnectionStateChanged(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleConnectionStateChanged });
|
||||
_revokers.ShowWindowChanged = _core.ShowWindowChanged(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleShowWindowChanged });
|
||||
_revokers.CloseTerminalRequested = _core.CloseTerminalRequested(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleCloseTerminalRequested });
|
||||
|
||||
_interactivity.PasteFromClipboard({ get_weak(), &TermControl::_bubblePasteFromClipboard });
|
||||
_revokers.PasteFromClipboard = _interactivity.PasteFromClipboard(winrt::auto_revoke, { get_weak(), &TermControl::_bubblePasteFromClipboard });
|
||||
|
||||
// Initialize the terminal only once the swapchainpanel is loaded - that
|
||||
// way, we'll be able to query the real pixel size it got on layout
|
||||
@@ -153,13 +153,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
_autoScrollTimer.Interval(AutoScrollUpdateInterval);
|
||||
_autoScrollTimer.Tick({ get_weak(), &TermControl::_UpdateAutoScroll });
|
||||
|
||||
// _interactivity.Attached([weakThis = get_weak()]{
|
||||
// if (auto control{ weakThis.get() }; !control->_IsClosing())
|
||||
// {
|
||||
// CloseTerminalRequested
|
||||
// }
|
||||
// });
|
||||
|
||||
_ApplyUISettings();
|
||||
}
|
||||
|
||||
@@ -886,7 +879,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
// after Enable, then it'll be possible to paint the frame once
|
||||
// _before_ the warning handler is set up, and then warnings from
|
||||
// the first paint will be ignored!
|
||||
_core.RendererWarning({ get_weak(), &TermControl::_RendererWarning });
|
||||
_revokers.RendererWarning = _core.RendererWarning(winrt::auto_revoke, { get_weak(), &TermControl::_RendererWarning });
|
||||
|
||||
// If we're re-attaching an existing content, then we want to proceed even though the Terminal was already initialized.
|
||||
if (!reattach)
|
||||
@@ -905,7 +898,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
_core.SizeOrScaleChanged(panelWidth, panelHeight, panelScaleX);
|
||||
}
|
||||
|
||||
_core.SwapChainChanged({ get_weak(), &TermControl::RenderEngineSwapChainChanged });
|
||||
_revokers.SwapChainChanged = _core.SwapChainChanged(winrt::auto_revoke, { get_weak(), &TermControl::RenderEngineSwapChainChanged });
|
||||
_core.EnablePainting();
|
||||
|
||||
auto bufferHeight = _core.BufferHeight();
|
||||
@@ -2072,6 +2065,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
}
|
||||
void TermControl::Detach()
|
||||
{
|
||||
_revokers = {};
|
||||
_detached = true;
|
||||
}
|
||||
|
||||
@@ -3008,9 +3002,16 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
|
||||
// Ensure the marker is oriented properly
|
||||
// (i.e. if start is at the beginning of the buffer, it should be flipped)
|
||||
auto transform{ marker.RenderTransform().as<Windows::UI::Xaml::Media::ScaleTransform>() };
|
||||
transform.ScaleX(std::abs(transform.ScaleX()) * (flipMarker ? -1.0 : 1.0));
|
||||
marker.RenderTransform(transform);
|
||||
//
|
||||
// Note - This RenderTransform might not be a
|
||||
// ScaleTransform, if we haven't had a _coreFontSizeChanged
|
||||
// handled yet, because that's the first place we set the
|
||||
// RenderTransform
|
||||
if (const auto& transform{ marker.RenderTransform().try_as<Windows::UI::Xaml::Media::ScaleTransform>() })
|
||||
{
|
||||
transform.ScaleX(std::abs(transform.ScaleX()) * (flipMarker ? -1.0 : 1.0));
|
||||
marker.RenderTransform(transform);
|
||||
}
|
||||
|
||||
// Compute the location of the top left corner of the cell in DIPS
|
||||
auto terminalPos{ targetEnd ? markerData.EndPos : markerData.StartPos };
|
||||
|
||||
@@ -327,6 +327,36 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
|
||||
til::point _toPosInDips(const Core::Point terminalCellPos);
|
||||
void _throttledUpdateScrollbar(const ScrollBarUpdate& update);
|
||||
|
||||
struct Revokers
|
||||
{
|
||||
Control::ControlCore::ScrollPositionChanged_revoker coreScrollPositionChanged;
|
||||
Control::ControlCore::WarningBell_revoker WarningBell;
|
||||
Control::ControlCore::CursorPositionChanged_revoker CursorPositionChanged;
|
||||
Control::ControlCore::RendererEnteredErrorState_revoker RendererEnteredErrorState;
|
||||
Control::ControlCore::BackgroundColorChanged_revoker BackgroundColorChanged;
|
||||
Control::ControlCore::FontSizeChanged_revoker FontSizeChanged;
|
||||
Control::ControlCore::TransparencyChanged_revoker TransparencyChanged;
|
||||
Control::ControlCore::RaiseNotice_revoker RaiseNotice;
|
||||
Control::ControlCore::HoveredHyperlinkChanged_revoker HoveredHyperlinkChanged;
|
||||
Control::ControlCore::FoundMatch_revoker FoundMatch;
|
||||
Control::ControlCore::UpdateSelectionMarkers_revoker UpdateSelectionMarkers;
|
||||
Control::ControlCore::OpenHyperlink_revoker coreOpenHyperlink;
|
||||
Control::ControlCore::CopyToClipboard_revoker CopyToClipboard;
|
||||
Control::ControlCore::TitleChanged_revoker TitleChanged;
|
||||
Control::ControlCore::TabColorChanged_revoker TabColorChanged;
|
||||
Control::ControlCore::TaskbarProgressChanged_revoker TaskbarProgressChanged;
|
||||
Control::ControlCore::ConnectionStateChanged_revoker ConnectionStateChanged;
|
||||
Control::ControlCore::ShowWindowChanged_revoker ShowWindowChanged;
|
||||
Control::ControlCore::CloseTerminalRequested_revoker CloseTerminalRequested;
|
||||
// These are set up in _InitializeTerminal
|
||||
Control::ControlCore::RendererWarning_revoker RendererWarning;
|
||||
Control::ControlCore::SwapChainChanged_revoker SwapChainChanged;
|
||||
|
||||
Control::ControlInteractivity::OpenHyperlink_revoker interactivityOpenHyperlink;
|
||||
Control::ControlInteractivity::ScrollPositionChanged_revoker interactivityScrollPositionChanged;
|
||||
Control::ControlInteractivity::PasteFromClipboard_revoker PasteFromClipboard;
|
||||
} _revokers{};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user