fix: 修复任务栏部分应用图标显示异常

原因:系统通过Bamf服务获取到的应用的路径为空,导致显示图标异常
解决方案:从本地读取索引文件,如果读取到的应用路径错误,则通过本地来加载,找到正确的路径

Log: 修复部分应用图标显示异常的问题
Influence: 打开安全中心、企业微信、微信等应用,观察其在任务栏上的图标
Bug: https://pms.uniontech.com/bug-view-147569.html
Change-Id: I3ba3dea9884808e5edc5559e48b5a272cde754ea
This commit is contained in:
donghualin
2022-11-15 01:34:52 +00:00
parent 282227dc2b
commit b0f10f1219
4 changed files with 186 additions and 25 deletions

View File

@ -28,6 +28,7 @@
#include "basedir.h"
#include "dfile.h"
#include "xcbutils.h"
#include "../apps/desktopfilereader.h"
#include <QDebug>
#include <QThread>
@ -474,34 +475,42 @@ AppInfo *WindowIdentify::identifyWindowByGtkAppId(Dock *_dock, WindowInfoX *winI
AppInfo *WindowIdentify::identifyWindowByWmClass(Dock *_dock, WindowInfoX *winInfo, QString &innerId)
{
AppInfo *ret = nullptr;
WMClass wmClass = winInfo->getWMClass();
do {
if (wmClass.instanceName.size() > 0) {
// example:
// WM_CLASS(STRING) = "Brackets", "Brackets"
// wm class instance is Brackets
// try app id org.deepin.flatdeb.brackets
ret = new AppInfo("org.deepin.flatdeb." + QString(wmClass.instanceName.c_str()).toLower());
if (ret)
break;
ret = new AppInfo(wmClass.instanceName.c_str());
if (ret)
break;
if (wmClass.instanceName.size() > 0) {
// example:
// WM_CLASS(STRING) = "Brackets", "Brackets"
// wm class instance is Brackets
// try app id org.deepin.flatdeb.brackets
//ret = new AppInfo("org.deepin.flatdeb." + QString(wmClass.instanceName.c_str()).toLower());
if (DesktopInfo("org.deepin.flatdeb." + QString(wmClass.instanceName.c_str()).toLower().toStdString()).isValidDesktop()) {
AppInfo *appInfo = new AppInfo("org.deepin.flatdeb." + QString(wmClass.instanceName.c_str()).toLower());
innerId = appInfo->getInnerId();
return appInfo;
}
if (wmClass.className.size() > 0) {
ret = new AppInfo(wmClass.className.c_str());
if (ret)
break;
if (DesktopInfo(wmClass.instanceName).isValidDesktop()) {
AppInfo *appInfo = new AppInfo(wmClass.instanceName.c_str());
innerId = appInfo->getInnerId();
return appInfo;
}
} while (0);
}
if (ret)
innerId = ret->getInnerId();
if (wmClass.className.size() > 0) {
std::string filename = wmClass.className;
bool isValid = DesktopInfo(filename).isValidDesktop();
if (!isValid) {
filename = DesktopFileReader::instance()->fileName(wmClass.instanceName.c_str()).toStdString();
isValid = DesktopInfo(filename).isValidDesktop();
}
return ret;
if (isValid) {
AppInfo *appInfo = new AppInfo(filename.c_str());
innerId = appInfo->getInnerId();
return appInfo;
}
}
return nullptr;
}
AppInfo *WindowIdentify::fixAutostartAppInfo(QString fileName)