1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

fix(Widget::updateIcons): workaround QIcon fallback bug

Some builds of Qt appear to have a bug in icon loading: QIcon::hasThemeIcon
is sometimes unaware that the icon returned from QIcon::fromTheme was a
fallback icon, causing hasThemeIcon to incorrectly return true.

In qTox this leads to the tray and window icons using the static qTox logo
icon instead of an icon based on the current presence status.

This workaround checks for an icon that definitely does not exist to
determine if hasThemeIcon can be trusted.

On systems with the Qt bug, this workaround will always use our included
icons but user themes will be unable to override them.
This commit is contained in:
Jason Papakostas 2016-04-16 22:21:22 -05:00
parent 95794b4464
commit 0b53c4fd5c

View File

@ -445,8 +445,35 @@ void Widget::updateIcons()
status = QStringLiteral("offline"); status = QStringLiteral("offline");
} }
// Some builds of Qt appear to have a bug in icon loading:
// QIcon::hasThemeIcon is sometimes unaware that the icon returned
// from QIcon::fromTheme was a fallback icon, causing hasThemeIcon to
// incorrectly return true.
//
// In qTox this leads to the tray and window icons using the static qTox logo
// icon instead of an icon based on the current presence status.
//
// This workaround checks for an icon that definitely does not exist to
// determine if hasThemeIcon can be trusted.
//
// On systems with the Qt bug, this workaround will always use our included
// icons but user themes will be unable to override them.
static bool checkedHasThemeIcon = false;
static bool hasThemeIconBug = false;
if (!checkedHasThemeIcon)
{
hasThemeIconBug = QIcon::hasThemeIcon("qtox-asjkdfhawjkeghdfjgh");
checkedHasThemeIcon = true;
if (hasThemeIconBug)
{
qDebug() << "Detected buggy QIcon::hasThemeIcon. Icon overrides from theme will be ignored.";
}
}
QIcon ico; QIcon ico;
if (QIcon::hasThemeIcon("qtox-" + status)) if (!hasThemeIconBug && QIcon::hasThemeIcon("qtox-" + status))
{ {
ico = QIcon::fromTheme("qtox-" + status); ico = QIcon::fromTheme("qtox-" + status);
} }