diff options
author | Peng Wu <alexepico@gmail.com> | 2011-10-26 10:10:58 +0800 |
---|---|---|
committer | Peng Wu <alexepico@gmail.com> | 2011-12-22 12:23:14 +0800 |
commit | 59b266d410cedb70f2b8b2aa8c1619184b2fb0ee (patch) | |
tree | 481faf6447b0665fa38843ac5f1d8c0a14ccaba3 | |
parent | 4d6a548b773ab5d59641208b5668a000287075d3 (diff) | |
download | ibus-libpinyin-59b266d410cedb70f2b8b2aa8c1619184b2fb0ee.tar.gz |
add save support
-rw-r--r-- | src/PYLibPinyin.cc | 51 | ||||
-rw-r--r-- | src/PYLibPinyin.h | 8 | ||||
-rw-r--r-- | src/PYPBopomofoEditor.cc | 1 | ||||
-rw-r--r-- | src/PYPPinyinEditor.cc | 2 |
4 files changed, 62 insertions, 0 deletions
diff --git a/src/PYLibPinyin.cc b/src/PYLibPinyin.cc index 077e7e0..062b3c9 100644 --- a/src/PYLibPinyin.cc +++ b/src/PYLibPinyin.cc @@ -23,6 +23,8 @@ #include "PYTypes.h" #include "PYConfig.h" +#define LIBPINYIN_SAVE_TIMEOUT (5 * 60) + using namespace PY; std::unique_ptr<LibPinyinBackEnd> LibPinyinBackEnd::m_instance; @@ -30,11 +32,19 @@ std::unique_ptr<LibPinyinBackEnd> LibPinyinBackEnd::m_instance; static LibPinyinBackEnd libpinyin_backend; LibPinyinBackEnd::LibPinyinBackEnd () { + m_timeout_id = 0; + m_timer = g_timer_new(); m_pinyin_context = NULL; m_chewing_context = NULL; } LibPinyinBackEnd::~LibPinyinBackEnd () { + g_timer_destroy (m_timer); + if (m_timeout_id != 0) { + saveUserDB (); + g_source_remove (m_timeout_id); + } + if (m_pinyin_context) pinyin_fini(m_pinyin_context); m_pinyin_context = NULL; @@ -215,3 +225,44 @@ LibPinyinBackEnd::setChewingOptions (Config *config) setFuzzyOptions (config, m_chewing_context); return TRUE; } + +void +LibPinyinBackEnd::modified (void) +{ + /* Restart the timer */ + g_timer_start (m_timer); + + if (m_timeout_id != 0) + return; + + m_timeout_id = g_timeout_add_seconds (LIBPINYIN_SAVE_TIMEOUT, + LibPinyinBackEnd::timeoutCallback, + static_cast<gpointer> (this)); +} + +gboolean +LibPinyinBackEnd::timeoutCallback (gpointer data) +{ + LibPinyinBackEnd *self = static_cast<LibPinyinBackEnd *> (data); + + /* Get the elapsed time since last modification of database. */ + guint elapsed = (guint)g_timer_elapsed (self->m_timer, NULL); + + if (elapsed >= LIBPINYIN_SAVE_TIMEOUT && + self->saveUserDB ()) { + self->m_timeout_id = 0; + return FALSE; + } + + return TRUE; +} + +gboolean +LibPinyinBackEnd::saveUserDB (void) +{ + if (m_pinyin_context) + pinyin_save (m_pinyin_context); + if (m_chewing_context) + pinyin_save (m_chewing_context); + return TRUE; +} diff --git a/src/PYLibPinyin.h b/src/PYLibPinyin.h index 44ed727..32919b9 100644 --- a/src/PYLibPinyin.h +++ b/src/PYLibPinyin.h @@ -42,6 +42,7 @@ public: void freePinyinInstance (pinyin_instance_t *instance); pinyin_instance_t *allocChewingInstance (); void freeChewingInstance (pinyin_instance_t *instance); + void modified (void); /* use static initializer in C++. */ static LibPinyinBackEnd & instance (void) { return *m_instance; } @@ -53,10 +54,17 @@ protected: gboolean setFuzzyOptions (Config *config, pinyin_context_t *context); private: + gboolean saveUserDB (void); + static gboolean timeoutCallback (gpointer data); + +private: /* libpinyin context */ pinyin_context_t *m_pinyin_context; pinyin_context_t *m_chewing_context; + guint m_timeout_id; + GTimer *m_timer; + private: static std::unique_ptr<LibPinyinBackEnd> m_instance; }; diff --git a/src/PYPBopomofoEditor.cc b/src/PYPBopomofoEditor.cc index 34f3df7..7592e2a 100644 --- a/src/PYPBopomofoEditor.cc +++ b/src/PYPBopomofoEditor.cc @@ -297,6 +297,7 @@ LibPinyinBopomofoEditor::commit () } pinyin_train(m_instance); + LibPinyinBackEnd::instance ().modified(); LibPinyinPhoneticEditor::commit ((const gchar *)m_buffer); reset(); } diff --git a/src/PYPPinyinEditor.cc b/src/PYPPinyinEditor.cc index 195d0e3..e676f6d 100644 --- a/src/PYPPinyinEditor.cc +++ b/src/PYPPinyinEditor.cc @@ -24,6 +24,7 @@ #include "PYPinyinProperties.h" #include "PYSimpTradConverter.h" #include "PYHalfFullConverter.h" +#include "PYLibPinyin.h" using namespace PY; @@ -229,6 +230,7 @@ LibPinyinPinyinEditor::commit () } pinyin_train(m_instance); + LibPinyinBackEnd::instance ().modified (); LibPinyinPhoneticEditor::commit ((const gchar *)m_buffer); reset(); } |