From 370140143df202981fd1a85478e7070efe18f0ca Mon Sep 17 00:00:00 2001 From: AlexeyZavar Date: Mon, 27 Apr 2026 02:56:45 +0300 Subject: [PATCH] fix: taskbar app icon change after unpinning --- Telegram/SourceFiles/ayu/ui/ayu_logo.cpp | 6 +++- .../SourceFiles/ayu/utils/windows_utils.cpp | 21 ++++++----- .../platform/win/main_window_win.cpp | 35 +++++++++++++++++++ .../SourceFiles/platform/win/tray_win.cpp | 1 + 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/Telegram/SourceFiles/ayu/ui/ayu_logo.cpp b/Telegram/SourceFiles/ayu/ui/ayu_logo.cpp index acf10805d2..ce1366210e 100644 --- a/Telegram/SourceFiles/ayu/ui/ayu_logo.cpp +++ b/Telegram/SourceFiles/ayu/ui/ayu_logo.cpp @@ -19,7 +19,11 @@ static QImage LAST_LOADED_PAD; namespace AyuAssets { QString appIcoPath() { - return cWorkingDir() + u"tdata/AyuGram.ico"_q; + const auto &settings = AyuSettings::getInstance(); + return cWorkingDir() + + u"tdata/AyuGram-"_q + + settings.appIcon() + + u".ico"_q; } void loadAppIco() { diff --git a/Telegram/SourceFiles/ayu/utils/windows_utils.cpp b/Telegram/SourceFiles/ayu/utils/windows_utils.cpp index dd95ad31ab..a3db974819 100644 --- a/Telegram/SourceFiles/ayu/utils/windows_utils.cpp +++ b/Telegram/SourceFiles/ayu/utils/windows_utils.cpp @@ -139,16 +139,21 @@ void processNewShortcuts(const QString &iconPath) { return; } - const auto shortcut = path + u"AyuGram Desktop/AyuGram.lnk"_q; - const auto native = QDir::toNativeSeparators(path).toStdWString(); + const auto shortcuts = { + path + u"AyuGram Desktop/AyuGram.lnk"_q, + path + u"AyuGram/AyuGram.lnk"_q, + path + u"AyuGram.lnk"_q, + }; + for (const auto &shortcut : shortcuts) { + const auto native = QDir::toNativeSeparators(shortcut).toStdWString(); - DWORD attributes = GetFileAttributes(native.c_str()); - if (attributes >= 0xFFFFFFF) { - return; // file does not exist + DWORD attributes = GetFileAttributes(native.c_str()); + if (attributes >= 0xFFFFFFF) { + continue; + } + + processIcon(QString::fromStdWString(native), iconPath); } - - const auto normalizedPath = QString::fromStdWString(native); - processIcon(normalizedPath, iconPath); } void reloadAppIconFromTaskBar() { diff --git a/Telegram/SourceFiles/platform/win/main_window_win.cpp b/Telegram/SourceFiles/platform/win/main_window_win.cpp index 72a062e923..8a56f002a3 100644 --- a/Telegram/SourceFiles/platform/win/main_window_win.cpp +++ b/Telegram/SourceFiles/platform/win/main_window_win.cpp @@ -49,6 +49,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL // AyuGram includes #include "ayu/ayu_settings.h" +#include "ayu/ui/ayu_logo.h" +#include "platform/win/windows_app_user_model_id.h" +#include +#include +#include // Taken from qtbase/src/gui/image/qpixmap_win.cpp @@ -108,6 +113,35 @@ private: return nullptr; } +void UpdateTaskbarRelaunchIcon(HWND hWnd) { + auto propertyStore = ComPtr(); + auto hr = SHGetPropertyStoreForWindow( + hWnd, + IID_PPV_ARGS(&propertyStore)); + if (!SUCCEEDED(hr)) { + return; + } + + const auto setString = [&]( + const PROPERTYKEY &key, + const std::wstring &value) { + auto prop = PROPVARIANT(); + hr = InitPropVariantFromString(value.c_str(), &prop); + if (!SUCCEEDED(hr)) { + return; + } + hr = propertyStore->SetValue(key, prop); + PropVariantClear(&prop); + }; + + setString(AppUserModelId::Key(), AppUserModelId::Id()); + setString( + PKEY_AppUserModel_RelaunchIconResource, + QDir::toNativeSeparators(AyuAssets::appIcoPath()).toStdWString() + + L",0"); + propertyStore->Commit(); +} + struct RealSize { QSize value; bool maximized = false; @@ -616,6 +650,7 @@ void MainWindow::updateTaskbarAndIconCounters() { GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON)); const auto supportMode = session && session->supportMode(); + UpdateTaskbarRelaunchIcon(_hWnd); auto iconSmallPixmap16 = Tray::IconWithCounter( Tray::CounterLayerArgs(16, counter, muted), diff --git a/Telegram/SourceFiles/platform/win/tray_win.cpp b/Telegram/SourceFiles/platform/win/tray_win.cpp index dd1a7286ab..2c1139e8fb 100644 --- a/Telegram/SourceFiles/platform/win/tray_win.cpp +++ b/Telegram/SourceFiles/platform/win/tray_win.cpp @@ -135,6 +135,7 @@ bool DarkTasbarValueValid/* = false*/; static auto lastUsedIcon = AyuAssets::currentAppLogoName(); if (lastUsedIcon != AyuAssets::currentAppLogoName()) { + lastUsedIcon = AyuAssets::currentAppLogoName(); ScaledLogo = base::flat_map(); ScaledLogoNoMargin = base::flat_map(); ScaledLogoDark = base::flat_map();