From 091dac9d73a160eb5333225d0df320a2628b16ce Mon Sep 17 00:00:00 2001 From: iaom <18504285112@163.com> Date: Wed, 8 Sep 2021 15:31:47 +0800 Subject: [PATCH] Fix: UI stuck occasionally. --- libsearch/appsearch/app-match.cpp | 34 +++++++++++---------- libsearch/file-utils.cpp | 6 ++++ libsearch/file-utils.h | 1 + libsearch/index/inotify-watch.cpp | 2 +- libsearch/libsearch.pro | 2 +- libsearch/notesearch/note-search-plugin.cpp | 3 +- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/libsearch/appsearch/app-match.cpp b/libsearch/appsearch/app-match.cpp index 3ad1ee2..4778dd3 100644 --- a/libsearch/appsearch/app-match.cpp +++ b/libsearch/appsearch/app-match.cpp @@ -19,6 +19,7 @@ */ #include "app-match.h" #include +#include #include "file-utils.h" #include "app-search-plugin.h" #define ANDROID_APP_DESKTOP_PATH QDir::homePath() + "/.local/share/applications/" @@ -252,8 +253,6 @@ void AppMatch::appNameMatch(QString keyWord, size_t uniqueSymbol, DataQueue iter(m_installAppMap); while(iter.hasNext()) { iter.next(); -// list = iter.value(); -// name.app_name = iter.key().app_name; if(iter.key().app_name.contains(keyWord, Qt::CaseInsensitive)) { SearchPluginIface::ResultInfo ri; creatResultInfo(ri, iter, true); @@ -261,17 +260,17 @@ void AppMatch::appNameMatch(QString keyWord, size_t uniqueSymbol, DataQueueenqueue(ri); AppSearchPlugin::m_mutex.unlock(); + continue; } else { AppSearchPlugin::m_mutex.unlock(); - break; + return; } -// installed.insert(name, list); - continue; } QStringList pinyinlist; pinyinlist = FileUtils::findMultiToneWords(iter.key().app_name); + bool matched = false; for(int i = 0; i < pinyinlist.size() / 2; i++) { QString shouzimu = pinyinlist.at(2 * i + 1); // 中文转首字母 if(shouzimu.contains(keyWord, Qt::CaseInsensitive)) { @@ -281,12 +280,12 @@ void AppMatch::appNameMatch(QString keyWord, size_t uniqueSymbol, DataQueueenqueue(ri); AppSearchPlugin::m_mutex.unlock(); + matched = true; + break; } else { AppSearchPlugin::m_mutex.unlock(); - break; + return; } -// installed.insert(name, list); - break; } if(keyWord.size() < 2) break; @@ -298,14 +297,17 @@ void AppMatch::appNameMatch(QString keyWord, size_t uniqueSymbol, DataQueueenqueue(ri); AppSearchPlugin::m_mutex.unlock(); - } else { - AppSearchPlugin::m_mutex.lock(); + matched = true; break; + } else { + AppSearchPlugin::m_mutex.unlock(); + return; } -// installed.insert(name, list); - break; } } + if(matched) { + continue; + } QStringList tmpList; tmpList << iter.value().at(2) << iter.value().at(3); for(QString s : tmpList) { @@ -316,12 +318,11 @@ void AppMatch::appNameMatch(QString keyWord, size_t uniqueSymbol, DataQueueenqueue(ri); AppSearchPlugin::m_mutex.unlock(); + break; } else { AppSearchPlugin::m_mutex.unlock(); - break; + return; } - // installed.insert(name, list); - continue; } } } @@ -397,7 +398,8 @@ void AppMatch::getInstalledAppsVersion(QString appname) { void AppMatch::creatResultInfo(SearchPluginIface::ResultInfo &ri, QMapIterator &iter, bool isInstalled) { - ri.icon = QIcon::fromTheme(iter.value().at(1), QIcon(":/res/icons/desktop.png")); +// ri.icon = QIcon::fromTheme(iter.value().at(1), QIcon(":/res/icons/desktop.png")); + ri.icon = XdgIcon::fromTheme(iter.value().at(1), QIcon(":/res/icons/desktop.png")); ri.name = iter.key().app_name; ri.actionKey = iter.value().at(0); ri.type = 0; //0 means installed apps. diff --git a/libsearch/file-utils.cpp b/libsearch/file-utils.cpp index e4e95a7..da2b5e8 100644 --- a/libsearch/file-utils.cpp +++ b/libsearch/file-utils.cpp @@ -838,6 +838,12 @@ QString FileUtils::chineseSubString(const std::string &myStr, int start, int len return sub; } +QIcon FileUtils::iconFromTheme(const QString &name, const QIcon &iconDefault) +{ + QMutexLocker locker(&iconMutex); + return QIcon::fromTheme(name, iconDefault); +} + QString FileUtils::getHtmlText(const QString &text, const QString &keyword) { QString htmlString; diff --git a/libsearch/file-utils.h b/libsearch/file-utils.h index 0b3bd69..8db658c 100644 --- a/libsearch/file-utils.h +++ b/libsearch/file-utils.h @@ -94,6 +94,7 @@ public: static bool copyPath(QString &path); static QString escapeHtml(const QString & str); static QString chineseSubString(const std::string &myStr,int start,int length); + static QIcon iconFromTheme(const QString& name, const QIcon &iconDefault); static size_t _max_index_count; static size_t _current_index_count; //this one has been Abandoned,do not use it. static unsigned short _index_status; diff --git a/libsearch/index/inotify-watch.cpp b/libsearch/index/inotify-watch.cpp index eb845a8..43b36a7 100644 --- a/libsearch/index/inotify-watch.cpp +++ b/libsearch/index/inotify-watch.cpp @@ -232,8 +232,8 @@ void InotifyWatch::run() void InotifyWatch::slotEvent(char *buf, ssize_t len) { // eventProcess(socket); - ++FileUtils::_index_status; if(FileUtils::SearchMethod::INDEXSEARCH == FileUtils::searchMethod) { + ++FileUtils::_index_status; pid_t pid; pid = fork(); if(pid == 0) { diff --git a/libsearch/libsearch.pro b/libsearch/libsearch.pro index f655cc4..c123147 100644 --- a/libsearch/libsearch.pro +++ b/libsearch/libsearch.pro @@ -33,7 +33,7 @@ include(notesearch/notesearch.pri) include(settingsearch/settingsearch.pri) LIBS += -L$$OUT_PWD/../libchinese-segmentation/ -lchinese-segmentation -LIBS += -lxapian -lquazip5 -luchardet #-L/usr/local/lib/libjemalloc -ljemalloc +LIBS += -lxapian -lquazip5 -luchardet -lQt5Xdg#-L/usr/local/lib/libjemalloc -ljemalloc SOURCES += \ file-utils.cpp \ diff --git a/libsearch/notesearch/note-search-plugin.cpp b/libsearch/notesearch/note-search-plugin.cpp index c3deb62..dc74dc8 100644 --- a/libsearch/notesearch/note-search-plugin.cpp +++ b/libsearch/notesearch/note-search-plugin.cpp @@ -1,6 +1,7 @@ #include "note-search-plugin.h" #include #include +#include #include "file-utils.h" #include "chinese-segmentation.h" using namespace Zeeker; @@ -183,7 +184,7 @@ void NoteSearch::run() { dbusArgs.endArray(); qDebug() << str; SearchPluginIface::ResultInfo ri = { - icon : QIcon::fromTheme("kylin-notebook"), + icon : XdgIcon::fromTheme("kylin-notebook", QIcon(":/res/icons/desktop.png")), name : str.at(1), description : QVector() << SearchPluginIface::DescriptionInfo { key : QString(tr("Note Description:")),