-
Notifications
You must be signed in to change notification settings - Fork 20
/
0001-psi-fix-hunspell-cpu-usage.diff
119 lines (116 loc) · 3.3 KB
/
0001-psi-fix-hunspell-cpu-usage.diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
--- git.orig/src/libpsi/tools/spellchecker/hunspellchecker.cpp
+++ git/src/libpsi/tools/spellchecker/hunspellchecker.cpp
@@ -33,6 +33,7 @@
#include <QTextCodec>
#include <QCoreApplication>
#include <QLocale>
+#include <QMutableListIterator>
//#include <QDebug>
#include <hunspell.hxx>
#ifdef Q_OS_WIN
@@ -55,9 +56,6 @@ HunspellChecker::HunspellChecker()
{
getDictPaths();
getSupportedLanguages();
- foreach (const QLocale &locale, supportedLangs_) {
- addLanguage(locale);
- }
}
HunspellChecker::~HunspellChecker()
@@ -116,7 +114,9 @@ void HunspellChecker::getSupportedLangua
}
foreach (const QFileInfo &fi, dir.entryInfoList(QStringList() << "*.dic", QDir::Files)) {
QLocale locale(fi.baseName());
- if (locale != QLocale::c()) {
+ if (locale != QLocale::c()
+ && !locale.nativeLanguageName().isEmpty()
+ && !locale.nativeCountryName().isEmpty()) {
retHash.insert(locale.nativeLanguageName()+locale.nativeCountryName(), locale);
}
}
@@ -180,7 +180,6 @@ bool HunspellChecker::isCorrect(const QS
return true;
}
}
-
return false;
}
bool HunspellChecker::add(const QString& word)
@@ -208,3 +207,51 @@ bool HunspellChecker::writable() const
{
return false;
}
+
+void HunspellChecker::unloadLanguage(const QLocale &locale)
+{
+ QMutableListIterator<LangItem> it(languages_);
+ while(it.hasNext()) {
+ LangItem item = it.next();
+ if(item.info.language == locale.language()
+ && item.info.country == locale.country()) {
+ it.remove();
+ }
+ }
+}
+
+QList<QString> HunspellChecker::getAllLanguages() const
+{
+ QList<QString> result;
+ foreach (const QLocale &locale, supportedLangs_) {
+ result << locale.name();
+ }
+ return result;
+}
+
+void HunspellChecker::setActiveLanguages(const QList<QString> &langs)
+{
+ QSet<LangId> loadedLangs;
+ QSet<LangId> newLangs;
+ foreach (const LangItem &item, languages_) {
+ LangId id(item.info.language, item.info.country);
+ loadedLangs << id;
+ }
+ foreach (const QString &lang, langs) {
+ QLocale locale(lang);
+ LangId id(locale.language(), locale.country());
+ newLangs << id;
+ }
+ QSet<LangId> langsToUnload = loadedLangs - newLangs;
+ QSet<LangId> langsToLoad = newLangs - loadedLangs;
+ QSetIterator<LangId> it(langsToUnload);
+ while(it.hasNext()) {
+ LangId id = it.next();
+ unloadLanguage(QLocale(id.first,id.second));
+ }
+ it = langsToLoad;
+ while(it.hasNext()) {
+ LangId id = it.next();
+ addLanguage(QLocale(id.first,id.second));
+ }
+}
--- git.orig/src/libpsi/tools/spellchecker/hunspellchecker.h
+++ git/src/libpsi/tools/spellchecker/hunspellchecker.h
@@ -38,6 +38,7 @@ class Hunspell;
class QTextCodec;
typedef QSharedPointer<Hunspell> HunspellPtr;
+typedef QPair<QLocale::Language, QLocale::Country> LangId;
class HunspellChecker : public SpellChecker
{
@@ -49,6 +50,8 @@ public:
virtual bool add(const QString &word);
virtual bool available() const;
virtual bool writable() const;
+ virtual void setActiveLanguages(const QList<QString> &langs);
+ virtual QList<QString> getAllLanguages() const;
private:
struct DictInfo
{
@@ -65,7 +68,7 @@ private:
void addLanguage(const QLocale &locale);
void getDictPaths();
bool scanDictPaths(const QString &language, QFileInfo &aff , QFileInfo &dic);
-
+ void unloadLanguage(const QLocale &locale);
private:
QList<LangItem> languages_;
QStringList dictPaths_;