Fix CApplication refresh crash

pull/18/head
reionwong 4 years ago
parent 14b26b997f
commit 55fb0650ea

@ -124,8 +124,9 @@ CAppItem *CApplications::matchItem(quint32 pid, const QString &windowClass)
void CApplications::refresh() void CApplications::refresh()
{ {
QStringList addedEntries; QStringList addedEntries;
for (CAppItem *item : m_items) for (CAppItem *item : qAsConst(m_items)) {
addedEntries.append(item->path); addedEntries.append(item->path);
}
QStringList allEntries; QStringList allEntries;
QDirIterator it(s_systemAppFolder, { "*.desktop" }, QDir::NoFilter, QDirIterator::Subdirectories); QDirIterator it(s_systemAppFolder, { "*.desktop" }, QDir::NoFilter, QDirIterator::Subdirectories);
@ -145,11 +146,14 @@ void CApplications::refresh()
} }
} }
for (CAppItem *item : m_items) { QList<CAppItem *> removeItems;
for (CAppItem *item : qAsConst(m_items)) {
if (!allEntries.contains(item->path)) { if (!allEntries.contains(item->path)) {
removeApplication(item); removeItems.append(item);
} }
} }
removeApplications(removeItems);
} }
void CApplications::addApplication(const QString &filePath) void CApplications::addApplication(const QString &filePath)
@ -201,10 +205,22 @@ void CApplications::addApplication(const QString &filePath)
void CApplications::removeApplication(CAppItem *item) void CApplications::removeApplication(CAppItem *item)
{ {
m_items.removeOne(item); int index = m_items.indexOf(item);
if (index < 0 || index > m_items.size())
return;
m_items.removeAt(index);
delete item; delete item;
} }
void CApplications::removeApplications(QList<CAppItem *> items)
{
for (CAppItem *item : items) {
m_items.removeOne(item);
delete item;
}
}
QStringList CApplications::commandFromPid(quint32 pid) QStringList CApplications::commandFromPid(quint32 pid)
{ {
QFile file(QString("/proc/%1/cmdline").arg(pid)); QFile file(QString("/proc/%1/cmdline").arg(pid));

@ -52,6 +52,7 @@ private:
void refresh(); void refresh();
void addApplication(const QString &filePath); void addApplication(const QString &filePath);
void removeApplication(CAppItem *item); void removeApplication(CAppItem *item);
void removeApplications(QList<CAppItem *> items);
QStringList commandFromPid(quint32 pid); QStringList commandFromPid(quint32 pid);

Loading…
Cancel
Save