From 7fdae8f79c7250063e032fa4ad09cca3756e04fe Mon Sep 17 00:00:00 2001 From: ilya-fedin Date: Tue, 30 Mar 2021 11:53:44 +0000 Subject: [PATCH] Scale window icon manually when getting from icon theme (#154) --- Telegram/SourceFiles/window/main_window.cpp | 47 ++++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/Telegram/SourceFiles/window/main_window.cpp b/Telegram/SourceFiles/window/main_window.cpp index 9821c7ea7..54df9d684 100644 --- a/Telegram/SourceFiles/window/main_window.cpp +++ b/Telegram/SourceFiles/window/main_window.cpp @@ -141,11 +141,48 @@ QIcon CreateIcon(Main::Session *session) { auto result = CreateOfficialIcon(session); #if defined Q_OS_UNIX && !defined Q_OS_MAC - if ( - (!session || !session->supportMode()) - && cCustomAppIcon() == 0 - && !QFileInfo::exists(cWorkingDir() + "tdata/icon.png")) { - return QIcon::fromTheme(Platform::GetIconName(), result); + if ((session && session->supportMode()) + || (cCustomAppIcon() != 0) + || QFileInfo::exists(cWorkingDir() + "tdata/icon.png")) { + return result; + } + + const auto iconFromTheme = QIcon::fromTheme( + Platform::GetIconName(), + result); + + result = QIcon(); + + static const auto iconSizes = { + 16, + 22, + 32, + 48, + 64, + 128, + 256, + }; + + // Qt's standard QIconLoaderEngine sets availableSizes + // to XDG directories sizes, since svg icons are scalable, + // they could be only in one XDG folder (like 48x48) + // and Qt will set only a 48px icon to the window + // even though the icon could be scaled to other sizes. + // Thus, scale it manually to the most widespread sizes. + for (const auto iconSize : iconSizes) { + // We can't use QIcon::actualSize here + // since it works incorrectly with svg icon themes + const auto iconPixmap = iconFromTheme.pixmap(iconSize); + + const auto iconPixmapSize = iconPixmap.size() + / iconPixmap.devicePixelRatio(); + + // Not a svg icon, don't scale it + if (iconPixmapSize.width() != iconSize) { + return iconFromTheme; + } + + result.addPixmap(iconPixmap); } #endif