b7fa32881d
Implement dropdown menu for choosing a default terminal application from inside the Windows Terminal Settings UI ## PR Checklist * [x] Closes #9463 * [x] I work here. * [x] Manual tests passed * [x] https://github.com/MicrosoftDocs/terminal/issues/314 (and cross reference #9462) ## Detailed Description of the Pull Request / Additional comments - Adds dropdown menu and a template card for displaying the available default applications (using the same lookup code as the console property sheet `console.dll`) - Adds model to TSM for adapting the data for display and binding on XAML - Lookup occurs on every page reload. Persistence only happens on Save Changes. - Manifest changed for Terminal to add capability to opt-out of registry redirection so we can edit this setting ## Validation Steps Performed - [x] Flipped the menu and pressed Save Changes and launched cmd from run box... it moved between the two. - [x] Flipped system theme from light to dark and ensured secondary color looked good - [x] Flipped the status with a different mechanism (conhost propsheet) and then reopened settings page and confirmed it loaded the updated status
92 lines
2.8 KiB
C++
92 lines
2.8 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
#include "pch.h"
|
|
#include "DefaultTerminal.h"
|
|
#include "DefaultTerminal.g.cpp"
|
|
|
|
#include <LibraryResources.h>
|
|
|
|
using namespace winrt::Microsoft::Terminal::Settings;
|
|
using namespace winrt::Microsoft::Terminal::Settings::Model::implementation;
|
|
|
|
winrt::Windows::Foundation::Collections::IVector<Model::DefaultTerminal> DefaultTerminal::_available = winrt::single_threaded_vector<Model::DefaultTerminal>();
|
|
std::optional<Model::DefaultTerminal> DefaultTerminal::_current;
|
|
|
|
DefaultTerminal::DefaultTerminal(DelegationConfig::DelegationPackage pkg) :
|
|
_pkg(pkg)
|
|
{
|
|
}
|
|
|
|
winrt::hstring DefaultTerminal::Name() const
|
|
{
|
|
static const std::wstring def{ RS_(L"InboxWindowsConsoleName") };
|
|
return _pkg.terminal.name.empty() ? winrt::hstring{ def } : winrt::hstring{ _pkg.terminal.name };
|
|
}
|
|
|
|
winrt::hstring DefaultTerminal::Version() const
|
|
{
|
|
// If there's no version information... return empty string instead.
|
|
if (DelegationConfig::PkgVersion{} == _pkg.terminal.version)
|
|
{
|
|
return winrt::hstring{};
|
|
}
|
|
|
|
const auto name = fmt::format(L"{}.{}.{}.{}", _pkg.terminal.version.major, _pkg.terminal.version.minor, _pkg.terminal.version.build, _pkg.terminal.version.revision);
|
|
return winrt::hstring{ name };
|
|
}
|
|
|
|
winrt::hstring DefaultTerminal::Author() const
|
|
{
|
|
static const std::wstring def{ RS_(L"InboxWindowsConsoleAuthor") };
|
|
return _pkg.terminal.author.empty() ? winrt::hstring{ def } : winrt::hstring{ _pkg.terminal.author };
|
|
}
|
|
|
|
winrt::hstring DefaultTerminal::Icon() const
|
|
{
|
|
static const std::wstring_view def{ L"\uE756" };
|
|
return _pkg.terminal.logo.empty() ? winrt::hstring{ def } : winrt::hstring{ _pkg.terminal.logo };
|
|
}
|
|
|
|
void DefaultTerminal::Refresh()
|
|
{
|
|
std::vector<DelegationConfig::DelegationPackage> allPackages;
|
|
DelegationConfig::DelegationPackage currentPackage;
|
|
|
|
LOG_IF_FAILED(DelegationConfig::s_GetAvailablePackages(allPackages, currentPackage));
|
|
|
|
_available.Clear();
|
|
for (const auto& pkg : allPackages)
|
|
{
|
|
auto p = winrt::make<DefaultTerminal>(pkg);
|
|
|
|
_available.Append(p);
|
|
|
|
if (pkg == currentPackage)
|
|
{
|
|
_current = p;
|
|
}
|
|
}
|
|
}
|
|
|
|
winrt::Windows::Foundation::Collections::IVectorView<Model::DefaultTerminal> DefaultTerminal::Available()
|
|
{
|
|
Refresh();
|
|
return _available.GetView();
|
|
}
|
|
|
|
Model::DefaultTerminal DefaultTerminal::Current()
|
|
{
|
|
if (!_current)
|
|
{
|
|
Refresh();
|
|
}
|
|
return _current.value();
|
|
}
|
|
|
|
void DefaultTerminal::Current(const Model::DefaultTerminal& term)
|
|
{
|
|
THROW_IF_FAILED(DelegationConfig::s_SetDefaultByPackage(winrt::get_self<DefaultTerminal>(term)->_pkg, true));
|
|
_current = term;
|
|
}
|