fix: 任务栏最近使用任务区域残留锯齿图标应用

部分修复了两种场景:
- 无法点击图标打开的锯齿应用在系统启动时残留在最近任务栏(如Deepin-Lock)
- 锯齿图标应用被关闭后,残留在最近任务栏.(如dde-dconfig-editor)

当前存在问题:
第二种情况在锯齿应用被移除时,任务栏会闪一下.

Issue: https://github.com/linuxdeepin/developer-center/issues/3788
Log: 任务栏最近使用任务区域残留锯齿图标应用
This commit is contained in:
Yutao Meng 2023-03-13 15:40:28 +08:00 committed by dengbo
parent 2031f59203
commit b0383d43da

View File

@ -23,6 +23,16 @@
#define SETTING DockSettings::instance() #define SETTING DockSettings::instance()
#define XCB XCBUtils::instance() #define XCB XCBUtils::instance()
bool shouldShowEntry(Entry *entry)
{
if (entry->getApp()->isValidApp()) {
QString path = entry->getApp()->getFileName();
DesktopInfo desktopInfo(path.toStdString());
return desktopInfo.shouldShow();
}
return false;
}
Dock::Dock(ApplicationManager *applicationManager, QObject *parent) Dock::Dock(ApplicationManager *applicationManager, QObject *parent)
: SynModule(parent) : SynModule(parent)
, m_entriesSum(0) , m_entriesSum(0)
@ -1221,8 +1231,9 @@ void Dock::updateRecentApps()
QStringList unDockedApps; QStringList unDockedApps;
QList<Entry *> recentEntrys = m_entries->unDockedEntries(); QList<Entry *> recentEntrys = m_entries->unDockedEntries();
for (Entry *entry : recentEntrys) { for (Entry *entry : recentEntrys) {
QString path = entry->getApp()->getFileName(); if (shouldShowEntry(entry)) {
unDockedApps << path; unDockedApps << entry->getApp()->getFileName();
}
} }
// 保存未驻留的应用作为最近打开的应用 // 保存未驻留的应用作为最近打开的应用
@ -1242,9 +1253,17 @@ void Dock::removeEntryFromDock(Entry *entry)
// 移除应用后,同时更新最近打开的应用 // 移除应用后,同时更新最近打开的应用
updateRecentApps(); updateRecentApps();
// 如果是高效模式,则发送消息或者关闭了显示最近应用的功能,则从任务栏移除 // 如果是高效模式,则发送消息或者关闭了显示最近应用的功能,则从任务栏移除
// 或者时尚模式显示最近应用时,当前应用不应该驻留最近应用时,需要移除
if ((SETTING->getDisplayMode() == DisplayMode::Efficient if ((SETTING->getDisplayMode() == DisplayMode::Efficient
|| !m_showRecent) && !entry->getIsDocked()) { || !m_showRecent) && !entry->getIsDocked()) {
Q_EMIT entryRemoved(entry->getId()); Q_EMIT entryRemoved(entry->getId());
} else if (SETTING->getDisplayMode() == DisplayMode::Fashion && m_showRecent && !entry->getIsDocked()) {
if (shouldShowEntry(entry)) {
return;
}
removeAppEntry(entry);
// 移除应用后,同时更新最近打开的应用
updateRecentApps();
} }
} else { } else {
removeAppEntry(entry); removeAppEntry(entry);