diff --git a/src/cascadia/TerminalSettingsEditor/MainPage.cpp b/src/cascadia/TerminalSettingsEditor/MainPage.cpp index c90e19bb2ff..99f692fcff7 100644 --- a/src/cascadia/TerminalSettingsEditor/MainPage.cpp +++ b/src/cascadia/TerminalSettingsEditor/MainPage.cpp @@ -182,6 +182,11 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation return false; } + uint64_t MainPage::GetHostingWindow() const noexcept + { + return reinterpret_cast(_hostingHwnd.value_or(nullptr)); + } + // Function Description: // - Called when the NavigationView is loaded. Navigates to the first item in the NavigationView, if no item is selected // Arguments: diff --git a/src/cascadia/TerminalSettingsEditor/MainPage.h b/src/cascadia/TerminalSettingsEditor/MainPage.h index fdc48752a7e..544f57b4d3e 100644 --- a/src/cascadia/TerminalSettingsEditor/MainPage.h +++ b/src/cascadia/TerminalSettingsEditor/MainPage.h @@ -24,6 +24,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void SetHostingWindow(uint64_t hostingWindow) noexcept; bool TryPropagateHostingWindow(IInspectable object) noexcept; + uint64_t GetHostingWindow() const noexcept; TYPED_EVENT(OpenJson, Windows::Foundation::IInspectable, Model::SettingsTarget); diff --git a/src/cascadia/TerminalSettingsEditor/MainPage.idl b/src/cascadia/TerminalSettingsEditor/MainPage.idl index cd35a8aa230..2513c8b7b40 100644 --- a/src/cascadia/TerminalSettingsEditor/MainPage.idl +++ b/src/cascadia/TerminalSettingsEditor/MainPage.idl @@ -10,6 +10,7 @@ namespace Microsoft.Terminal.Settings.Editor interface IHostedInWindow { Boolean TryPropagateHostingWindow(IInspectable i); + UInt64 GetHostingWindow(); } [default_interface] runtimeclass MainPage : Windows.UI.Xaml.Controls.Page, IHostedInWindow diff --git a/src/cascadia/TerminalSettingsEditor/Profiles.cpp b/src/cascadia/TerminalSettingsEditor/Profiles.cpp index 562e6050b70..08475235578 100644 --- a/src/cascadia/TerminalSettingsEditor/Profiles.cpp +++ b/src/cascadia/TerminalSettingsEditor/Profiles.cpp @@ -29,7 +29,7 @@ static const std::array InBoxProfileGuids{ // Return value: // (async) path to the selected item. template -static winrt::Windows::Foundation::IAsyncOperation OpenFilePicker(TLambda&& customize) +static winrt::Windows::Foundation::IAsyncOperation OpenFilePicker(HWND parentHwnd, TLambda&& customize) { auto fileDialog{ winrt::create_instance(CLSID_FileOpenDialog) }; DWORD flags{}; @@ -37,7 +37,7 @@ static winrt::Windows::Foundation::IAsyncOperation OpenFilePicke THROW_IF_FAILED(fileDialog->SetOptions(flags | FOS_FORCEFILESYSTEM | FOS_NOCHANGEDIR | FOS_DONTADDTORECENT)); // filesystem objects only; no recent places customize(fileDialog.get()); - auto hr{ fileDialog->Show(NULL) }; + auto hr{ fileDialog->Show(parentHwnd) }; if (!SUCCEEDED(hr)) { if (hr == HRESULT_FROM_WIN32(ERROR_CANCELLED)) @@ -58,7 +58,7 @@ static winrt::Windows::Foundation::IAsyncOperation OpenFilePicke // Function Description: // - Helper that opens a file picker pre-seeded with image file types. -static winrt::Windows::Foundation::IAsyncOperation OpenImagePicker() +static winrt::Windows::Foundation::IAsyncOperation OpenImagePicker(HWND parentHwnd) { static constexpr COMDLG_FILTERSPEC supportedImageFileTypes[] = { { L"All Supported Bitmap Types (*.jpg, *.jpeg, *.png, *.bmp, *.gif, *.tiff, *.ico)", L"*.jpg;*.jpeg;*.png;*.bmp;*.gif;*.tiff;*.ico" }, @@ -66,7 +66,7 @@ static winrt::Windows::Foundation::IAsyncOperation OpenImagePick }; static constexpr winrt::guid clientGuidImagePicker{ 0x55675F54, 0x74A1, 0x4552, { 0xA3, 0x9D, 0x94, 0xAE, 0x85, 0xD8, 0xF2, 0x7A } }; - return OpenFilePicker([](auto&& dialog) { + return OpenFilePicker(parentHwnd, [](auto&& dialog) { THROW_IF_FAILED(dialog->SetClientGuid(clientGuidImagePicker)); try { @@ -637,7 +637,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { auto lifetime = get_strong(); - auto file = co_await OpenImagePicker(); + const auto parentHwnd{ reinterpret_cast(_State.WindowRoot().GetHostingWindow()) }; + auto file = co_await OpenImagePicker(parentHwnd); if (!file.empty()) { _State.Profile().BackgroundImagePath(file); @@ -648,7 +649,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { auto lifetime = get_strong(); - auto file = co_await OpenImagePicker(); + const auto parentHwnd{ reinterpret_cast(_State.WindowRoot().GetHostingWindow()) }; + auto file = co_await OpenImagePicker(parentHwnd); if (!file.empty()) { _State.Profile().Icon(file); @@ -665,7 +667,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation }; static constexpr winrt::guid clientGuidExecutables{ 0x2E7E4331, 0x0800, 0x48E6, { 0xB0, 0x17, 0xA1, 0x4C, 0xD8, 0x73, 0xDD, 0x58 } }; - auto path = co_await OpenFilePicker([](auto&& dialog) { + const auto parentHwnd{ reinterpret_cast(_State.WindowRoot().GetHostingWindow()) }; + auto path = co_await OpenFilePicker(parentHwnd, [](auto&& dialog) { THROW_IF_FAILED(dialog->SetClientGuid(clientGuidExecutables)); try { @@ -687,7 +690,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation fire_and_forget Profiles::StartingDirectory_Click(IInspectable const&, RoutedEventArgs const&) { auto lifetime = get_strong(); - auto folder = co_await OpenFilePicker([](auto&& dialog) { + const auto parentHwnd{ reinterpret_cast(_State.WindowRoot().GetHostingWindow()) }; + auto folder = co_await OpenFilePicker(parentHwnd, [](auto&& dialog) { static constexpr winrt::guid clientGuidFolderPicker{ 0xAADAA433, 0xB04D, 0x4BAE, { 0xB1, 0xEA, 0x1E, 0x6C, 0xD1, 0xCD, 0xA6, 0x8B } }; THROW_IF_FAILED(dialog->SetClientGuid(clientGuidFolderPicker)); try