Scale window icon manually when getting from icon theme

This commit is contained in:
Ilya Fedin 2021-03-27 01:37:25 +04:00 committed by John Preston
parent f528a240d9
commit 0cd8cc67c5
1 changed files with 37 additions and 1 deletions

View File

@ -119,7 +119,43 @@ QIcon CreateOfficialIcon(Main::Session *session) {
QIcon CreateIcon(Main::Session *session) {
auto result = CreateOfficialIcon(session);
#if defined Q_OS_UNIX && !defined Q_OS_MAC
return QIcon::fromTheme(Platform::GetIconName(), 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
return result;
}