diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 04c037f27ed..e4a5aa9004c 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -790,4 +790,11 @@ namespace winrt::TerminalApp::implementation // if it wasn't bound at all. args.Handled(false); } + + void TerminalPage::_HandleMinimizeToTray(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + _MinimizeToTrayRequestedHandlers(*this, nullptr); + args.Handled(true); + } } diff --git a/src/cascadia/TerminalApp/AppLogic.h b/src/cascadia/TerminalApp/AppLogic.h index c86b543005b..797526d877d 100644 --- a/src/cascadia/TerminalApp/AppLogic.h +++ b/src/cascadia/TerminalApp/AppLogic.h @@ -163,6 +163,7 @@ namespace winrt::TerminalApp::implementation FORWARDED_TYPED_EVENT(IdentifyWindowsRequested, Windows::Foundation::IInspectable, Windows::Foundation::IInspectable, _root, IdentifyWindowsRequested); FORWARDED_TYPED_EVENT(RenameWindowRequested, Windows::Foundation::IInspectable, winrt::TerminalApp::RenameWindowRequestedArgs, _root, RenameWindowRequested); FORWARDED_TYPED_EVENT(IsQuakeWindowChanged, Windows::Foundation::IInspectable, Windows::Foundation::IInspectable, _root, IsQuakeWindowChanged); + FORWARDED_TYPED_EVENT(MinimizeToTrayRequested, Windows::Foundation::IInspectable, Windows::Foundation::IInspectable, _root, MinimizeToTrayRequested); #ifdef UNIT_TESTING friend class TerminalAppLocalTests::CommandlineTest; diff --git a/src/cascadia/TerminalApp/AppLogic.idl b/src/cascadia/TerminalApp/AppLogic.idl index fec67c970c3..aa53a5d03ab 100644 --- a/src/cascadia/TerminalApp/AppLogic.idl +++ b/src/cascadia/TerminalApp/AppLogic.idl @@ -90,5 +90,6 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler RenameWindowRequested; event Windows.Foundation.TypedEventHandler SettingsChanged; event Windows.Foundation.TypedEventHandler IsQuakeWindowChanged; + event Windows.Foundation.TypedEventHandler MinimizeToTrayRequested; } } diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index 7a32e4217fd..f9e73e786e4 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -124,6 +124,7 @@ namespace winrt::TerminalApp::implementation TYPED_EVENT(IdentifyWindowsRequested, IInspectable, IInspectable); TYPED_EVENT(RenameWindowRequested, Windows::Foundation::IInspectable, winrt::TerminalApp::RenameWindowRequestedArgs); TYPED_EVENT(IsQuakeWindowChanged, IInspectable, IInspectable); + TYPED_EVENT(MinimizeToTrayRequested, IInspectable, IInspectable); private: friend struct TerminalPageT; // for Xaml to bind events diff --git a/src/cascadia/TerminalApp/TerminalPage.idl b/src/cascadia/TerminalApp/TerminalPage.idl index f1c1e55fc15..a491ae054e8 100644 --- a/src/cascadia/TerminalApp/TerminalPage.idl +++ b/src/cascadia/TerminalApp/TerminalPage.idl @@ -56,5 +56,6 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler IdentifyWindowsRequested; event Windows.Foundation.TypedEventHandler RenameWindowRequested; event Windows.Foundation.TypedEventHandler IsQuakeWindowChanged; + event Windows.Foundation.TypedEventHandler MinimizeToTrayRequested; } } diff --git a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp index a7508374df3..bf9ab5582bb 100644 --- a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp @@ -59,6 +59,7 @@ static constexpr std::string_view RenameWindowKey{ "renameWindow" }; static constexpr std::string_view OpenWindowRenamerKey{ "openWindowRenamer" }; static constexpr std::string_view GlobalSummonKey{ "globalSummon" }; static constexpr std::string_view QuakeModeKey{ "quakeMode" }; +static constexpr std::string_view MinimizeToTrayKey{ "minimizeToTray" }; static constexpr std::string_view ActionKey{ "action" }; @@ -131,6 +132,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { OpenWindowRenamerKey, ShortcutAction::OpenWindowRenamer }, { GlobalSummonKey, ShortcutAction::GlobalSummon }, { QuakeModeKey, ShortcutAction::QuakeMode }, + { MinimizeToTrayKey, ShortcutAction::MinimizeToTray }, }; using ParseResult = std::tuple>; @@ -337,6 +339,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::OpenWindowRenamer, RS_(L"OpenWindowRenamerCommandKey") }, { ShortcutAction::GlobalSummon, L"" }, // Intentionally omitted, must be generated by GenerateName { ShortcutAction::QuakeMode, RS_(L"QuakeModeCommandKey") }, + { ShortcutAction::MinimizeToTray, L"" } }; }(); diff --git a/src/cascadia/TerminalSettingsModel/AllShortcutActions.h b/src/cascadia/TerminalSettingsModel/AllShortcutActions.h index bc710a756b9..d42a1288b01 100644 --- a/src/cascadia/TerminalSettingsModel/AllShortcutActions.h +++ b/src/cascadia/TerminalSettingsModel/AllShortcutActions.h @@ -74,4 +74,5 @@ ON_ALL_ACTIONS(RenameWindow) \ ON_ALL_ACTIONS(OpenWindowRenamer) \ ON_ALL_ACTIONS(GlobalSummon) \ - ON_ALL_ACTIONS(QuakeMode) + ON_ALL_ACTIONS(QuakeMode) \ + ON_ALL_ACTIONS(MinimizeToTray) diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index 8695cbc1ee3..89b4fe6970a 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -77,7 +77,7 @@ AppHost::AppHost() noexcept : _window->MouseScrolled({ this, &AppHost::_WindowMouseWheeled }); _window->WindowActivated({ this, &AppHost::_WindowActivated }); _window->HotkeyPressed({ this, &AppHost::_GlobalHotkeyPressed }); - _window->NotifyIconPressed({ this, &AppHost::_TrayIconPressed }); + _window->NotifyTrayIconPressed({ this, &AppHost::_HandleTrayIconPressed }); _window->SetAlwaysOnTop(_logic.GetInitialAlwaysOnTop()); _window->MakeWindow(); @@ -267,6 +267,7 @@ void AppHost::Initialize() _logic.RenameWindowRequested({ this, &AppHost::_RenameWindowRequested }); _logic.SettingsChanged({ this, &AppHost::_HandleSettingsChanged }); _logic.IsQuakeWindowChanged({ this, &AppHost::_IsQuakeWindowChanged }); + _logic.MinimizeToTrayRequested({ this, &AppHost::_MinimizeToTrayRequested }); _window->UpdateTitle(_logic.Title()); @@ -957,7 +958,7 @@ void AppHost::_UpdateTrayIcon() } } -void AppHost::_TrayIconPressed() +void AppHost::_HandleTrayIconPressed() { // No name provided means show the MRU window. Remoting::SummonWindowSelectionArgs args{}; @@ -971,3 +972,9 @@ void AppHost::_TrayIconPressed() _windowManager.SummonWindow(args); } + +void AppHost::_MinimizeToTrayRequested(const winrt::Windows::Foundation::IInspectable sender, + const winrt::Windows::Foundation::IInspectable args) +{ + +} diff --git a/src/cascadia/WindowsTerminal/AppHost.h b/src/cascadia/WindowsTerminal/AppHost.h index c2743f10efa..01ad76a3967 100644 --- a/src/cascadia/WindowsTerminal/AppHost.h +++ b/src/cascadia/WindowsTerminal/AppHost.h @@ -83,6 +83,8 @@ class AppHost const winrt::Windows::Foundation::IInspectable& args); void _UpdateTrayIcon(); - void _TrayIconPressed(); + void _HandleTrayIconPressed(); + void _MinimizeToTrayRequested(const winrt::Windows::Foundation::IInspectable sender, + const winrt::Windows::Foundation::IInspectable args); std::optional _TrayIconData; }; diff --git a/src/cascadia/WindowsTerminal/IslandWindow.cpp b/src/cascadia/WindowsTerminal/IslandWindow.cpp index f2c609d73d5..274a0fe6922 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.cpp +++ b/src/cascadia/WindowsTerminal/IslandWindow.cpp @@ -507,20 +507,20 @@ long IslandWindow::_calculateTotalSize(const bool isWidth, const long clientSize UpdateWindowIconForActiveMetrics(_window.get()); return 0; // TODO: Give this a better name, something like WT_NOTIFYICON - // WM_APP to 0xBFFF is available for use for apps. + // WM_APP to 0xBFFF is available for use for apps apparently. case WM_APP + 1: { switch (LOWORD(lparam)) { case NIN_SELECT: + case NIN_KEYSELECT: { - _NotifyIconPressedHandlers(); + _NotifyTrayIconPressedHandlers(); break; } case WM_CONTEXTMENU: { - // TODO: show the context menu - // Build it with ways to open specific windows + // TODO: show the context menu - buncho options to open specific windows? break; } } diff --git a/src/cascadia/WindowsTerminal/IslandWindow.h b/src/cascadia/WindowsTerminal/IslandWindow.h index 43abcfebe02..5df4f1369a6 100644 --- a/src/cascadia/WindowsTerminal/IslandWindow.h +++ b/src/cascadia/WindowsTerminal/IslandWindow.h @@ -51,7 +51,7 @@ class IslandWindow : WINRT_CALLBACK(MouseScrolled, winrt::delegate); WINRT_CALLBACK(WindowActivated, winrt::delegate); WINRT_CALLBACK(HotkeyPressed, winrt::delegate); - WINRT_CALLBACK(NotifyIconPressed, winrt::delegate); + WINRT_CALLBACK(NotifyTrayIconPressed, winrt::delegate); protected: void ForceResize()