Skip to content

Commit 5e69b61

Browse files
committed
Add support for OSC777 (Send Notification)
1 parent 9df166e commit 5e69b61

33 files changed

+145
-1
lines changed

doc/cascadia/profiles.schema.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2774,6 +2774,11 @@
27742774
"description": "When set to true, VT applications will be allowed to set the contents of the local clipboard using OSC 52 (Manipulate Selection Data).",
27752775
"type": "boolean"
27762776
},
2777+
"compatibility.allowOSC777": {
2778+
"default": true,
2779+
"description": "When set to true, applications can send OSC 777 escape sequences to trigger desktop toast notifications with a custom title and body.",
2780+
"type": "boolean"
2781+
},
27772782
"unfocusedAppearance": {
27782783
"$ref": "#/$defs/AppearanceConfig",
27792784
"description": "Sets the appearance of the terminal when it is unfocused.",

src/cascadia/TerminalApp/TerminalPaneContent.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ namespace winrt::TerminalApp::implementation
4242
_controlEvents._SetTaskbarProgress = _control.SetTaskbarProgress(winrt::auto_revoke, { get_weak(), &TerminalPaneContent::_controlSetTaskbarProgress });
4343
_controlEvents._ReadOnlyChanged = _control.ReadOnlyChanged(winrt::auto_revoke, { get_weak(), &TerminalPaneContent::_controlReadOnlyChanged });
4444
_controlEvents._FocusFollowMouseRequested = _control.FocusFollowMouseRequested(winrt::auto_revoke, { get_weak(), &TerminalPaneContent::_controlFocusFollowMouseRequested });
45+
_controlEvents._ShowNotification = _control.ShowNotification(winrt::auto_revoke, { get_weak(), &TerminalPaneContent::_controlShowNotification });
4546
}
4647
void TerminalPaneContent::_removeControlEvents()
4748
{
@@ -182,6 +183,11 @@ namespace winrt::TerminalApp::implementation
182183
FocusRequested.raise(*this, nullptr);
183184
}
184185

186+
void TerminalPaneContent::_controlShowNotification(const IInspectable& /*sender*/, const ShowNotificationEventArgs& args)
187+
{
188+
NotificationRequested.raise(*this, winrt::make<implementation::NotificationEventArgs>(args.Title(), args.Body()));
189+
}
190+
185191
// Method Description:
186192
// - Called when our attached control is closed. Triggers listeners to our close
187193
// event, if we're a leaf pane.

src/cascadia/TerminalApp/TerminalPaneContent.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ namespace winrt::TerminalApp::implementation
9090
winrt::Microsoft::Terminal::Control::TermControl::SetTaskbarProgress_revoker _SetTaskbarProgress;
9191
winrt::Microsoft::Terminal::Control::TermControl::ReadOnlyChanged_revoker _ReadOnlyChanged;
9292
winrt::Microsoft::Terminal::Control::TermControl::FocusFollowMouseRequested_revoker _FocusFollowMouseRequested;
93+
winrt::Microsoft::Terminal::Control::TermControl::ShowNotification_revoker _ShowNotification;
9394

9495
} _controlEvents;
9596
void _setupControlEvents();
@@ -107,6 +108,7 @@ namespace winrt::TerminalApp::implementation
107108
void _controlSetTaskbarProgress(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Windows::Foundation::IInspectable& args);
108109
void _controlReadOnlyChanged(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Windows::Foundation::IInspectable& args);
109110
void _controlFocusFollowMouseRequested(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Windows::Foundation::IInspectable& args);
111+
void _controlShowNotification(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Microsoft::Terminal::Control::ShowNotificationEventArgs& args);
110112

111113
void _closeTerminalRequestedHandler(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Windows::Foundation::IInspectable& /*args*/);
112114
void _restartTerminalRequestedHandler(const winrt::Windows::Foundation::IInspectable& sender, const winrt::Windows::Foundation::IInspectable& /*args*/);

src/cascadia/TerminalControl/ControlCore.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
139139
auto pfnSearchMissingCommand = [this](auto&& PH1, auto&& PH2) { _terminalSearchMissingCommand(std::forward<decltype(PH1)>(PH1), std::forward<decltype(PH2)>(PH2)); };
140140
_terminal->SetSearchMissingCommandCallback(pfnSearchMissingCommand);
141141

142+
auto pfnShowNotification = [this](auto&& PH1, auto&& PH2) { _terminalShowNotification(std::forward<decltype(PH1)>(PH1), std::forward<decltype(PH2)>(PH2)); };
143+
_terminal->SetShowNotificationCallback(pfnShowNotification);
144+
142145
auto pfnClearQuickFix = [this] { ClearQuickFix(); };
143146
_terminal->SetClearQuickFixCallback(pfnClearQuickFix);
144147

@@ -1685,6 +1688,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
16851688
SearchMissingCommand.raise(*this, make<implementation::SearchMissingCommandEventArgs>(hstring{ missingCommand }, bufferRow));
16861689
}
16871690

1691+
void ControlCore::_terminalShowNotification(std::wstring_view title, std::wstring_view body)
1692+
{
1693+
ShowNotification.raise(*this, make<implementation::ShowNotificationEventArgs>(hstring{ title }, hstring{ body }));
1694+
}
1695+
16881696
void ControlCore::OpenCWD()
16891697
{
16901698
const auto workingDirectory = WorkingDirectory();

src/cascadia/TerminalControl/ControlCore.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
293293
til::typed_event<IInspectable, Control::OpenHyperlinkEventArgs> OpenHyperlink;
294294
til::typed_event<IInspectable, Control::CompletionsChangedEventArgs> CompletionsChanged;
295295
til::typed_event<IInspectable, Control::SearchMissingCommandEventArgs> SearchMissingCommand;
296+
til::typed_event<IInspectable, Control::ShowNotificationEventArgs> ShowNotification;
296297
til::typed_event<> RefreshQuickFixUI;
297298
til::typed_event<IInspectable, Control::WindowSizeChangedEventArgs> WindowSizeChanged;
298299

@@ -334,6 +335,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
334335
const int velocity,
335336
const std::chrono::microseconds duration);
336337
void _terminalSearchMissingCommand(std::wstring_view missingCommand, const til::CoordType& bufferRow);
338+
void _terminalShowNotification(std::wstring_view title, std::wstring_view body);
337339
void _terminalWindowSizeChanged(int32_t width, int32_t height);
338340

339341
void _terminalCompletionsChanged(std::wstring_view menuJson, unsigned int replaceLength);

src/cascadia/TerminalControl/ControlCore.idl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ namespace Microsoft.Terminal.Control
197197
event Windows.Foundation.TypedEventHandler<Object, Object> RendererEnteredErrorState;
198198
event Windows.Foundation.TypedEventHandler<Object, ShowWindowArgs> ShowWindowChanged;
199199
event Windows.Foundation.TypedEventHandler<Object, SearchMissingCommandEventArgs> SearchMissingCommand;
200+
event Windows.Foundation.TypedEventHandler<Object, ShowNotificationEventArgs> ShowNotification;
200201
event Windows.Foundation.TypedEventHandler<Object, Object> RefreshQuickFixUI;
201202
event Windows.Foundation.TypedEventHandler<Object, WindowSizeChangedEventArgs> WindowSizeChanged;
202203

src/cascadia/TerminalControl/EventArgs.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "CharSentEventArgs.g.h"
2121
#include "StringSentEventArgs.g.h"
2222
#include "SearchMissingCommandEventArgs.g.h"
23+
#include "ShowNotificationEventArgs.g.h"
2324
#include "WindowSizeChangedEventArgs.g.h"
2425

2526
namespace winrt::Microsoft::Terminal::Control::implementation
@@ -252,6 +253,17 @@ namespace winrt::Microsoft::Terminal::Control::implementation
252253
til::property<til::CoordType> BufferRow;
253254
};
254255

256+
struct ShowNotificationEventArgs : public ShowNotificationEventArgsT<ShowNotificationEventArgs>
257+
{
258+
public:
259+
ShowNotificationEventArgs(const winrt::hstring& title, const winrt::hstring& body) :
260+
Title(title),
261+
Body(body) {}
262+
263+
til::property<winrt::hstring> Title;
264+
til::property<winrt::hstring> Body;
265+
};
266+
255267
struct WindowSizeChangedEventArgs : public WindowSizeChangedEventArgsT<WindowSizeChangedEventArgs>
256268
{
257269
public:

src/cascadia/TerminalControl/EventArgs.idl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,12 @@ namespace Microsoft.Terminal.Control
160160
Int32 BufferRow { get; };
161161
}
162162

163+
runtimeclass ShowNotificationEventArgs
164+
{
165+
String Title { get; };
166+
String Body { get; };
167+
}
168+
163169
runtimeclass WindowSizeChangedEventArgs
164170
{
165171
Int32 Width;

src/cascadia/TerminalControl/TermControl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
328328
_revokers.CompletionsChanged = _core.CompletionsChanged(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleCompletionsChanged });
329329
_revokers.RestartTerminalRequested = _core.RestartTerminalRequested(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleRestartTerminalRequested });
330330
_revokers.SearchMissingCommand = _core.SearchMissingCommand(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleSearchMissingCommand });
331+
_revokers.ShowNotification = _core.ShowNotification(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleShowNotification });
331332
_revokers.WindowSizeChanged = _core.WindowSizeChanged(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleWindowSizeChanged });
332333
_revokers.WriteToClipboard = _core.WriteToClipboard(winrt::auto_revoke, { get_weak(), &TermControl::_bubbleWriteToClipboard });
333334

src/cascadia/TerminalControl/TermControl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
231231
BUBBLED_FORWARDED_TYPED_EVENT(RestartTerminalRequested, IInspectable, IInspectable);
232232
BUBBLED_FORWARDED_TYPED_EVENT(WriteToClipboard, IInspectable, Control::WriteToClipboardEventArgs);
233233
BUBBLED_FORWARDED_TYPED_EVENT(PasteFromClipboard, IInspectable, Control::PasteFromClipboardEventArgs);
234+
BUBBLED_FORWARDED_TYPED_EVENT(ShowNotification, IInspectable, Control::ShowNotificationEventArgs);
234235

235236
// clang-format on
236237

@@ -469,6 +470,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
469470
Control::ControlCore::CompletionsChanged_revoker CompletionsChanged;
470471
Control::ControlCore::RestartTerminalRequested_revoker RestartTerminalRequested;
471472
Control::ControlCore::SearchMissingCommand_revoker SearchMissingCommand;
473+
Control::ControlCore::ShowNotification_revoker ShowNotification;
472474
Control::ControlCore::RefreshQuickFixUI_revoker RefreshQuickFixUI;
473475
Control::ControlCore::WindowSizeChanged_revoker WindowSizeChanged;
474476

0 commit comments

Comments
 (0)