Don't add multiple event handlers for the core

Basically, because we were projecting the event straight trhough the control, from core->page, basically when we would do a PasteRequested, we'd call the handler registered on the first control, then also the handler added by the second.
This commit is contained in:
Mike Griese
2023-02-07 11:43:10 -06:00
parent c9ed8dc042
commit 1cef94e696
2 changed files with 23 additions and 8 deletions

View File

@@ -93,6 +93,16 @@ namespace winrt::Microsoft::Terminal::Control::implementation
_interactivity.OpenHyperlink({ get_weak(), &TermControl::_HyperlinkHandler });
_interactivity.ScrollPositionChanged({ 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 });
_interactivity.PasteFromClipboard({ 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
_layoutUpdatedRevoker = SwapChainPanel().LayoutUpdated(winrt::auto_revoke, [this](auto /*s*/, auto /*e*/) {

View File

@@ -144,19 +144,24 @@ namespace winrt::Microsoft::Terminal::Control::implementation
WINRT_CALLBACK(PropertyChanged, Windows::UI::Xaml::Data::PropertyChangedEventHandler);
// Same thing, but handler is a projected type, not an implementation
#define BUBBLED_FORWARDED_TYPED_EVENT(name, sender, args) \
TYPED_EVENT(name, sender, args) \
void _bubble##name(const sender& s, const args& a) { _##name##Handlers(s, a); }
// -------------------------------- WinRT Events ---------------------------------
// clang-format off
WINRT_CALLBACK(FontSizeChanged, Control::FontSizeChangedEventArgs);
PROJECTED_FORWARDED_TYPED_EVENT(CopyToClipboard, IInspectable, Control::CopyToClipboardEventArgs, _core, CopyToClipboard);
PROJECTED_FORWARDED_TYPED_EVENT(TitleChanged, IInspectable, Control::TitleChangedEventArgs, _core, TitleChanged);
PROJECTED_FORWARDED_TYPED_EVENT(TabColorChanged, IInspectable, IInspectable, _core, TabColorChanged);
PROJECTED_FORWARDED_TYPED_EVENT(SetTaskbarProgress, IInspectable, IInspectable, _core, TaskbarProgressChanged);
PROJECTED_FORWARDED_TYPED_EVENT(ConnectionStateChanged, IInspectable, IInspectable, _core, ConnectionStateChanged);
PROJECTED_FORWARDED_TYPED_EVENT(ShowWindowChanged, IInspectable, Control::ShowWindowArgs, _core, ShowWindowChanged);
PROJECTED_FORWARDED_TYPED_EVENT(CloseTerminalRequested, IInspectable, IInspectable, _core, CloseTerminalRequested);
BUBBLED_FORWARDED_TYPED_EVENT(CopyToClipboard, IInspectable, Control::CopyToClipboardEventArgs);
BUBBLED_FORWARDED_TYPED_EVENT(TitleChanged, IInspectable, Control::TitleChangedEventArgs);
BUBBLED_FORWARDED_TYPED_EVENT(TabColorChanged, IInspectable, IInspectable);
BUBBLED_FORWARDED_TYPED_EVENT(SetTaskbarProgress, IInspectable, IInspectable);
BUBBLED_FORWARDED_TYPED_EVENT(ConnectionStateChanged, IInspectable, IInspectable);
BUBBLED_FORWARDED_TYPED_EVENT(ShowWindowChanged, IInspectable, Control::ShowWindowArgs);
BUBBLED_FORWARDED_TYPED_EVENT(CloseTerminalRequested, IInspectable, IInspectable);
PROJECTED_FORWARDED_TYPED_EVENT(PasteFromClipboard, IInspectable, Control::PasteFromClipboardEventArgs, _interactivity, PasteFromClipboard);
BUBBLED_FORWARDED_TYPED_EVENT(PasteFromClipboard, IInspectable, Control::PasteFromClipboardEventArgs);
TYPED_EVENT(OpenHyperlink, IInspectable, Control::OpenHyperlinkEventArgs);
TYPED_EVENT(RaiseNotice, IInspectable, Control::NoticeEventArgs);