Skip to content

Commit

Permalink
Don't do runtime detection of the package type.
Browse files Browse the repository at this point in the history
  • Loading branch information
DHowett committed Oct 21, 2020
1 parent ff72200 commit 01ffc19
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 80 deletions.
23 changes: 13 additions & 10 deletions src/cascadia/WindowsTerminal/WindowsTerminal.rc
Original file line number Diff line number Diff line change
Expand Up @@ -52,17 +52,20 @@ END

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_APPICON ICON "..\\..\\..\\res\\terminal.ico"
IDI_APPICON_HC_B ICON "..\\..\\..\\res\\terminal\\terminal_contrast-black.ico"
IDI_APPICON_HC_W ICON "..\\..\\..\\res\\terminal\\terminal_contrast-white.ico"

IDI_APPICON_DEV ICON "..\\..\\..\\res\\terminal\\terminal-Dev.ico"
IDI_APPICON_DEV_HC_B ICON "..\\..\\..\\res\\terminal\\terminal-Dev_contrast-black.ico"
IDI_APPICON_DEV_HC_W ICON "..\\..\\..\\res\\terminal\\terminal-Dev_contrast-white.ico"

IDI_APPICON_PRE ICON "..\\..\\..\\res\\terminal\\terminal-Pre.ico"
IDI_APPICON_PRE_HC_B ICON "..\\..\\..\\res\\terminal\\terminal-Pre_contrast-black.ico"
IDI_APPICON_PRE_HC_W ICON "..\\..\\..\\res\\terminal\\terminal-Pre_contrast-white.ico"
#if defined(WT_BRANDING_RELEASE)
IDI_APPICON ICON "..\\..\\..\\res\\terminal.ico"
IDI_APPICON_HC_BLACK ICON "..\\..\\..\\res\\terminal\\images\\terminal_contrast-black.ico"
IDI_APPICON_HC_WHITE ICON "..\\..\\..\\res\\terminal\\images\\terminal_contrast-white.ico"
#elif defined(WT_BRANDING_PREVIEW)
IDI_APPICON ICON "..\\..\\..\\res\\terminal\\images-Pre\\terminal.ico"
IDI_APPICON_HC_BLACK ICON "..\\..\\..\\res\\terminal\\images-Pre\\terminal_contrast-black.ico"
IDI_APPICON_HC_WHITE ICON "..\\..\\..\\res\\terminal\\images-Pre\\terminal_contrast-white.ico"
#else
IDI_APPICON ICON "..\\..\\..\\res\\terminal\\images-Dev\\terminal.ico"
IDI_APPICON_HC_BLACK ICON "..\\..\\..\\res\\terminal\\images-Dev\\terminal_contrast-black.ico"
IDI_APPICON_HC_WHITE ICON "..\\..\\..\\res\\terminal\\images-Dev\\terminal_contrast-white.ico"
#endif


/////////////////////////////////////////////////////////////////////////////
Expand Down
58 changes: 7 additions & 51 deletions src/cascadia/WindowsTerminal/icon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,50 +4,9 @@
#include "pch.h"
#include "resource.h"

#include "winrt/Windows.ApplicationModel.h"

// clang-format off
enum class IconClass : uint8_t {
None = 0,
Version_Pre = 0b00000001,
Version_Dev = 0b00000010,
Variant_HC = 0b00000100,
Variant_HC_White = 0b00001000,
};

DEFINE_ENUM_FLAG_OPERATORS(IconClass);

static constexpr std::array<std::pair<IconClass, int>, 9> s_iconClassMapping{
std::pair{ IconClass::None, IDI_APPICON },
std::pair{ IconClass::Version_Pre, IDI_APPICON_PRE },
std::pair{ IconClass::Version_Dev, IDI_APPICON_DEV },

// High Contrast
std::pair{ IconClass::Variant_HC, IDI_APPICON_HC_B },
std::pair{ IconClass::Variant_HC | IconClass::Variant_HC_White, IDI_APPICON_HC_W },
std::pair{ IconClass::Version_Pre | IconClass::Variant_HC, IDI_APPICON_PRE_HC_B },
std::pair{ IconClass::Version_Pre | IconClass::Variant_HC | IconClass::Variant_HC_White, IDI_APPICON_PRE_HC_W },
std::pair{ IconClass::Version_Dev | IconClass::Variant_HC, IDI_APPICON_DEV_HC_B },
std::pair{ IconClass::Version_Dev | IconClass::Variant_HC | IconClass::Variant_HC_White, IDI_APPICON_DEV_HC_W },
};
// clang-format on

static wchar_t* _GetActiveAppIcon()
static int _GetActiveAppIconResource()
{
auto iconClass{ IconClass::None };
try
{
const auto package{ winrt::Windows::ApplicationModel::Package::Current() };
const auto id{ package.Id() };
const auto name{ id.FullName() };
const std::wstring_view nameView{ name };
WI_UpdateFlag(iconClass, IconClass::Version_Pre, nameView.find(L"Preview") != std::wstring_view::npos);
WI_UpdateFlag(iconClass, IconClass::Version_Dev, nameView.find(L"Dev") != std::wstring_view::npos);
}
catch (...)
{
// Just fall through and assume that we're un-badged.
}
auto iconResource{ IDI_APPICON };

HIGHCONTRASTW hcInfo{};
hcInfo.cbSize = sizeof(hcInfo);
Expand All @@ -56,24 +15,21 @@ static wchar_t* _GetActiveAppIcon()
{
if (WI_IsFlagSet(hcInfo.dwFlags, HCF_HIGHCONTRASTON))
{
WI_SetFlag(iconClass, IconClass::Variant_HC);
iconResource = IDI_APPICON_HC_BLACK;

if (hcInfo.lpszDefaultScheme)
if (0x00FFFFFF == GetSysColor(COLOR_WINDOW)) // white window color == white high contrast
{
const std::wstring_view theme{ hcInfo.lpszDefaultScheme };
WI_UpdateFlag(iconClass, IconClass::Variant_HC_White, theme.find(L"White") != std::wstring_view::npos);
iconResource = IDI_APPICON_HC_WHITE;
}
}
}

const auto found{ std::find_if(s_iconClassMapping.cbegin(), s_iconClassMapping.cend(), [&](auto&& entry) { return entry.first == iconClass; }) };
const auto resource{ found != s_iconClassMapping.cend() ? found->second : IDI_APPICON };
return MAKEINTRESOURCEW(resource);
return iconResource;
}

void UpdateWindowIconForActiveMetrics(HWND window)
{
auto iconResource{ _GetActiveAppIcon() };
auto iconResource{ MAKEINTRESOURCEW(_GetActiveAppIconResource()) };

// These handles are loaded with LR_SHARED, so they are safe to "leak".
HANDLE smallIcon{ LoadImageW(wil::GetModuleInstanceHandle(), iconResource, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED) };
Expand Down
30 changes: 11 additions & 19 deletions src/cascadia/WindowsTerminal/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,23 @@
// Used by WindowsTerminal.rc
//
#define IDI_APPICON 101
#define IDI_APPICON_HC_B 102
#define IDI_APPICON_HC_W 103
#define IDI_APPICON_HC_BLACK 102
#define IDI_APPICON_HC_WHITE 103

#define IDI_APPICON_DEV 104
#define IDI_APPICON_DEV_HC_B 105
#define IDI_APPICON_DEV_HC_W 106

#define IDI_APPICON_PRE 107
#define IDI_APPICON_PRE_HC_B 108
#define IDI_APPICON_PRE_HC_W 109

#define IDS_ERROR_DIALOG_TITLE 110
#define IDS_HELP_DIALOG_TITLE 111
#define IDS_ERROR_ARCHITECTURE_FORMAT 112
#define IDS_X86_ARCHITECTURE 113
#define IDS_AMD64_ARCHITECTURE 114
#define IDS_ARM64_ARCHITECTURE 115
#define IDS_ARM_ARCHITECTURE 116
#define IDS_UNKNOWN_ARCHITECTURE 117
#define IDS_ERROR_DIALOG_TITLE 105
#define IDS_HELP_DIALOG_TITLE 106
#define IDS_ERROR_ARCHITECTURE_FORMAT 110
#define IDS_X86_ARCHITECTURE 111
#define IDS_AMD64_ARCHITECTURE 112
#define IDS_ARM64_ARCHITECTURE 113
#define IDS_ARM_ARCHITECTURE 114
#define IDS_UNKNOWN_ARCHITECTURE 115

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 118
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
Expand Down

0 comments on commit 01ffc19

Please sign in to comment.