From 9aa83e6e30c6df3511d95853f33488328b9f66f6 Mon Sep 17 00:00:00 2001 From: LEO Yoon-Tsaw Date: Sun, 19 Feb 2023 23:56:17 -0500 Subject: [PATCH 1/8] Add new APIs, peek selection and change page Context:Peek --- src/rime/context.cc | 32 ++++++++++++++++++++++++-------- src/rime/context.h | 1 + src/rime_api.cc | 35 +++++++++++++++++++++++++++++++++++ src/rime_api.h | 6 ++++++ 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/rime/context.cc b/src/rime/context.cc index c3f62f2942..dd8076c0e7 100644 --- a/src/rime/context.cc +++ b/src/rime/context.cc @@ -110,17 +110,33 @@ void Context::Clear() { } bool Context::Select(size_t index) { - if (composition_.empty()) + bool result = Peek(index); + if (result) + select_notifier_(this); + return result; +} + +bool Context::Peek(size_t index) { + if (composition_.empty() || !composition_.back().menu) return false; Segment& seg(composition_.back()); - if (auto cand = seg.GetCandidateAt(index)) { - seg.selected_index = index; - seg.status = Segment::kSelected; - DLOG(INFO) << "Selected: '" << cand->text() << "', index = " << index; - select_notifier_(this); - return true; + size_t new_index = index; + if (index < 0) { + DLOG(INFO) << "selection index < 0, fallback to 0"; + new_index = 0; + } else { + size_t candidate_count = seg.menu->Prepare(index + 1); + if (index >= candidate_count) { + DLOG(INFO) << "selection index exceed candidate pool, fallback to last"; + new_index = candidate_count - 1; + } } - return false; + size_t previous_index = seg.selected_index; + seg.selected_index = new_index; + update_notifier_(this); + + DLOG(INFO) << "Selection changed from: " << previous_index << " to: " << new_index; + return true; } bool Context::DeleteCandidate( diff --git a/src/rime/context.h b/src/rime/context.h index d624f02037..8295637df9 100644 --- a/src/rime/context.h +++ b/src/rime/context.h @@ -45,6 +45,7 @@ class Context { // return false if there is no candidate at index bool Select(size_t index); + bool Peek(size_t index); bool DeleteCandidate(size_t index); // return false if there's no candidate for current segment bool ConfirmCurrentSelection(); diff --git a/src/rime_api.cc b/src/rime_api.cc index 10c99f58f2..3f64d499cb 100644 --- a/src/rime_api.cc +++ b/src/rime_api.cc @@ -970,11 +970,43 @@ static bool do_with_candidate_on_current_page( return (ctx->*verb)(page_start + index); } +Bool RimeChangePage(RimeSessionId session_id, Bool previous) { + an session(Service::instance().GetSession(session_id)); + if (!session) + return False; + Context *ctx = session->context(); + if (!ctx || !ctx->HasMenu()) + return False; + Schema *schema = session->schema(); + if (!schema) + return False; + size_t page_size = (size_t)schema->page_size(); + const auto& seg(ctx->composition().back()); + size_t selected_index = seg.selected_index; + ctx->composition().back().tags.insert("paging"); + if (previous) { + size_t index = selected_index <= page_size ? 0 : selected_index - page_size; + DLOG(INFO) << "Current selection: " << selected_index << ", Previous page, Peek at " << index; + return ctx->Peek(index); + } else { + size_t index = selected_index + page_size; + DLOG(INFO) << "Current selection: " << selected_index << ", Next page, Peek at " << index; + return ctx->Peek(index); + } +} + +Bool RimePeekCandidate(RimeSessionId session_id, size_t index) { + return do_with_candidate(session_id, index, &Context::Peek); +} Bool RimeSelectCandidate(RimeSessionId session_id, size_t index) { return do_with_candidate(session_id, index, &Context::Select); } +Bool RimePeekCandidateOnCurrentPage(RimeSessionId session_id, size_t index) { + return do_with_candidate_on_current_page(session_id, index, &Context::Peek); +} + Bool RimeSelectCandidateOnCurrentPage(RimeSessionId session_id, size_t index) { return do_with_candidate_on_current_page(session_id, index, &Context::Select); } @@ -1116,6 +1148,9 @@ RIME_API RimeApi* rime_get_api() { s_api.get_state_label = &RimeGetStateLabel; s_api.delete_candidate = &RimeDeleteCandidate; s_api.delete_candidate_on_current_page = &RimeDeleteCandidateOnCurrentPage; + s_api.peek_candidate = &RimePeekCandidate; + s_api.peek_candidate_on_current_page = &RimePeekCandidateOnCurrentPage; + s_api.change_page = &RimeChangePage; s_api.get_state_label_abbreviated = &RimeGetStateLabelAbbreviated; } return &s_api; diff --git a/src/rime_api.h b/src/rime_api.h index 671a1c1602..ecdf44cba7 100644 --- a/src/rime_api.h +++ b/src/rime_api.h @@ -524,6 +524,8 @@ typedef struct rime_api_t { //! select a candidate at the given index in candidate list. Bool (*select_candidate)(RimeSessionId session_id, size_t index); + //! peek a selection without commiting to it + Bool (*peek_candidate)(RimeSessionId session_id, size_t index); //! get the version of librime const char* (*get_version)(void); @@ -533,6 +535,10 @@ typedef struct rime_api_t { //! select a candidate from current page. Bool (*select_candidate_on_current_page)(RimeSessionId session_id, size_t index); + //! peek a selection without commiting to it + Bool (*peek_candidate_on_current_page)(RimeSessionId session_id, size_t index); + + Bool (*change_page)(RimeSessionId session_id, Bool previous); //! access candidate list. Bool (*candidate_list_begin)(RimeSessionId session_id, RimeCandidateListIterator* iterator); From ecd3649163ffbd87088e4945f1488411aa8581c7 Mon Sep 17 00:00:00 2001 From: LEO Yoon-Tsaw Date: Mon, 20 Feb 2023 16:42:45 -0500 Subject: [PATCH 2/8] Update context.cc --- src/rime/context.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rime/context.cc b/src/rime/context.cc index dd8076c0e7..fbfd5e4315 100644 --- a/src/rime/context.cc +++ b/src/rime/context.cc @@ -112,6 +112,7 @@ void Context::Clear() { bool Context::Select(size_t index) { bool result = Peek(index); if (result) + composition_.back().status = Segment::kSelected; select_notifier_(this); return result; } From 5c1502eeccdb7a40d75dbe46caa17a416f4fae70 Mon Sep 17 00:00:00 2001 From: LEO Yoon-Tsaw Date: Tue, 21 Feb 2023 09:49:34 -0500 Subject: [PATCH 3/8] Fix RECOMMENDED_MACOSX_DEPLOYMENT_TARGET error --- xcode.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xcode.mk b/xcode.mk index 27d473ced3..c174b683a6 100644 --- a/xcode.mk +++ b/xcode.mk @@ -11,7 +11,7 @@ endif export SDKROOT ?= $(shell xcrun --sdk macosx --show-sdk-path) # https://cmake.org/cmake/help/latest/envvar/MACOSX_DEPLOYMENT_TARGET.html -export MACOSX_DEPLOYMENT_TARGET ?= $$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET) +export MACOSX_DEPLOYMENT_TARGET ?= $(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET) ifdef BUILD_UNIVERSAL # https://cmake.org/cmake/help/latest/envvar/CMAKE_OSX_ARCHITECTURES.html From 124087ab0ca90bddce5d951fd52a358c1e98e278 Mon Sep 17 00:00:00 2001 From: groverlynn Date: Thu, 27 Apr 2023 21:20:27 +0200 Subject: [PATCH 4/8] ignore certain modifiers --- src/rime/gear/ascii_composer.cc | 7 ++++--- src/rime/key_event.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/rime/gear/ascii_composer.cc b/src/rime/gear/ascii_composer.cc index 20919396cf..84a171583d 100644 --- a/src/rime/gear/ascii_composer.cc +++ b/src/rime/gear/ascii_composer.cc @@ -85,9 +85,10 @@ ProcessResult AsciiComposer::ProcessKeyEvent(const KeyEvent& key_event) { if (is_shift || is_ctrl) { if (key_event.release()) { if (shift_key_pressed_ || ctrl_key_pressed_) { - auto now = std::chrono::steady_clock::now(); - if (now < toggle_expired_) { - ToggleAsciiModeWithKey(ch); + if (!key_event.ignored()) { + auto now = std::chrono::steady_clock::now(); + if (now < toggle_expired_) + ToggleAsciiModeWithKey(ch); } shift_key_pressed_ = ctrl_key_pressed_ = false; return kNoop; diff --git a/src/rime/key_event.h b/src/rime/key_event.h index 8910fae258..9afd5199b2 100644 --- a/src/rime/key_event.h +++ b/src/rime/key_event.h @@ -31,6 +31,7 @@ class KeyEvent { bool alt() const { return (modifier_ & kAltMask) != 0; } bool caps() const { return (modifier_ & kLockMask) != 0; } bool super() const { return (modifier_ & kSuperMask) != 0; } + bool ignored() const { return (modifier_ & kIgnoredMask) != 0; } bool release() const { return (modifier_ & kReleaseMask) != 0; } // 按鍵表示為形如「狀態+鍵名」的文字 // 若無鍵名,則以四位或六位十六进制数形式的文字來標識 From 0b31eb9f7e9314a14f0482dfbe59dd3e305cf5ec Mon Sep 17 00:00:00 2001 From: groverlynn Date: Thu, 4 May 2023 18:51:32 +0200 Subject: [PATCH 5/8] Update xcode.mk --- xcode.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xcode.mk b/xcode.mk index 27d473ced3..c174b683a6 100644 --- a/xcode.mk +++ b/xcode.mk @@ -11,7 +11,7 @@ endif export SDKROOT ?= $(shell xcrun --sdk macosx --show-sdk-path) # https://cmake.org/cmake/help/latest/envvar/MACOSX_DEPLOYMENT_TARGET.html -export MACOSX_DEPLOYMENT_TARGET ?= $$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET) +export MACOSX_DEPLOYMENT_TARGET ?= $(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET) ifdef BUILD_UNIVERSAL # https://cmake.org/cmake/help/latest/envvar/CMAKE_OSX_ARCHITECTURES.html From 8291002f8bdd8ea4581776020d62a7f4171e78ba Mon Sep 17 00:00:00 2001 From: groverlynn Date: Sun, 16 Jul 2023 22:15:51 +0200 Subject: [PATCH 6/8] Update context.cc --- src/rime/context.cc | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/rime/context.cc b/src/rime/context.cc index b9e5690aba..2cd95a84a1 100644 --- a/src/rime/context.cc +++ b/src/rime/context.cc @@ -114,26 +114,6 @@ bool Context::Select(size_t index) { select_notifier_(this); return result; } - -bool Context::Peek(size_t index) { - if (composition_.empty() || !composition_.back().menu) - return false; - Segment& seg(composition_.back()); - size_t new_index = index; - if (index < 0) { - DLOG(INFO) << "selection index < 0, fallback to 0"; - new_index = 0; - } else { - size_t candidate_count = seg.menu->Prepare(index + 1); - if (index >= candidate_count) { - DLOG(INFO) << "selection index exceed candidate pool, fallback to last"; - new_index = candidate_count - 1; - } - } - size_t previous_index = seg.selected_index; - seg.selected_index = new_index; - update_notifier_(this); - DLOG(INFO) << "Selection changed from: " << previous_index << " to: " << new_index; return true; } From a0578f9b7b37060034b05e2c5faa30e552292438 Mon Sep 17 00:00:00 2001 From: groverlynn Date: Sun, 16 Jul 2023 22:16:20 +0200 Subject: [PATCH 7/8] Update context.h --- src/rime/context.cc | 7 ++++--- src/rime/context.h | 1 - src/rime/dict/table.h | 22 +++++++++++++++------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/rime/context.cc b/src/rime/context.cc index 2cd95a84a1..8a255c4e68 100644 --- a/src/rime/context.cc +++ b/src/rime/context.cc @@ -111,11 +111,12 @@ bool Context::Select(size_t index) { bool result = Peek(index); if (result) composition_.back().status = Segment::kSelected; - select_notifier_(this); + select_notifier_(this); return result; } - DLOG(INFO) << "Selection changed from: " << previous_index << " to: " << new_index; - return true; +DLOG(INFO) << "Selection changed from: " << previous_index + << " to: " << new_index; +return true; } bool Context::DeleteCandidate( diff --git a/src/rime/context.h b/src/rime/context.h index bb2e213833..58ea39aa5c 100644 --- a/src/rime/context.h +++ b/src/rime/context.h @@ -44,7 +44,6 @@ class Context { // return false if there is no candidate at index bool Select(size_t index); - bool Peek(size_t index); bool DeleteCandidate(size_t index); // return false if there's no candidate for current segment bool ConfirmCurrentSelection(); diff --git a/src/rime/dict/table.h b/src/rime/dict/table.h index ea87d92eb1..ca85540ee5 100644 --- a/src/rime/dict/table.h +++ b/src/rime/dict/table.h @@ -15,13 +15,21 @@ #include #include -#define RIME_TABLE_UNION(U, V, A, a, B, b) \ - struct U { \ - V value; \ - const A& a() const { return *reinterpret_cast(this); } \ - const B& b() const { return *reinterpret_cast(this); } \ - A& a() { return *reinterpret_cast(this); } \ - B& b() { return *reinterpret_cast(this); } \ +#define RIME_TABLE_UNION(U, V, A, a, B, b) \ + struct U { \ + V value; \ + const A& a() const { \ + return *reinterpret_cast(this); \ + } \ + const B& b() const { \ + return *reinterpret_cast(this); \ + } \ + A& a() { \ + return *reinterpret_cast(this); \ + } \ + B& b() { \ + return *reinterpret_cast(this); \ + } \ } namespace rime { From 74d5dfd60560707f9e33a78f3dc0758eff8505ea Mon Sep 17 00:00:00 2001 From: groverlynn Date: Sun, 16 Jul 2023 22:35:32 +0200 Subject: [PATCH 8/8] Update context.cc --- src/rime/context.cc | 22 ++++++++++++---------- src/rime/context.h | 2 +- src/rime/dict/table.h | 24 ++++++++---------------- test/table_test.cc | 8 +++----- 4 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src/rime/context.cc b/src/rime/context.cc index 8a255c4e68..0ecd71b2aa 100644 --- a/src/rime/context.cc +++ b/src/rime/context.cc @@ -108,15 +108,17 @@ void Context::Clear() { } bool Context::Select(size_t index) { - bool result = Peek(index); - if (result) - composition_.back().status = Segment::kSelected; - select_notifier_(this); - return result; -} -DLOG(INFO) << "Selection changed from: " << previous_index - << " to: " << new_index; -return true; + if (composition_.empty()) + return false; + Segment& seg(composition_.back()); + if (auto cand = seg.GetCandidateAt(index)) { + seg.selected_index = index; + seg.status = Segment::kSelected; + DLOG(INFO) << "Selected: '" << cand->text() << "', index = " << index; + select_notifier_(this); + return true; + } + return false; } bool Context::DeleteCandidate( @@ -290,4 +292,4 @@ void Context::ClearTransientOptions() { } } -} // namespace rime +} // namespace rime \ No newline at end of file diff --git a/src/rime/context.h b/src/rime/context.h index 58ea39aa5c..f66d2e9267 100644 --- a/src/rime/context.h +++ b/src/rime/context.h @@ -110,4 +110,4 @@ class Context { } // namespace rime -#endif // RIME_CONTEXT_H_ +#endif // RIME_CONTEXT_H_ \ No newline at end of file diff --git a/src/rime/dict/table.h b/src/rime/dict/table.h index ca85540ee5..7db616efff 100644 --- a/src/rime/dict/table.h +++ b/src/rime/dict/table.h @@ -15,21 +15,13 @@ #include #include -#define RIME_TABLE_UNION(U, V, A, a, B, b) \ - struct U { \ - V value; \ - const A& a() const { \ - return *reinterpret_cast(this); \ - } \ - const B& b() const { \ - return *reinterpret_cast(this); \ - } \ - A& a() { \ - return *reinterpret_cast(this); \ - } \ - B& b() { \ - return *reinterpret_cast(this); \ - } \ +#define RIME_TABLE_UNION(U, V, A, a, B, b) \ + struct U { \ + V value; \ + const A& a() const { return *reinterpret_cast(this); } \ + const B& b() const { return *reinterpret_cast(this); } \ + A& a() { return *reinterpret_cast(this); } \ + B& b() { return *reinterpret_cast(this); } \ } namespace rime { @@ -194,4 +186,4 @@ class Table : public MappedFile { } // namespace rime -#endif // RIME_TABLE_H_ +#endif // RIME_TABLE_H_ \ No newline at end of file diff --git a/test/table_test.cc b/test/table_test.cc index d78e02d654..61cc4222f5 100644 --- a/test/table_test.cc +++ b/test/table_test.cc @@ -8,7 +8,6 @@ #include #include - class RimeTableTest : public ::testing::Test { public: virtual void SetUp() { @@ -23,9 +22,8 @@ class RimeTableTest : public ::testing::Test { } table_->Load(); } - virtual void TearDown() { - table_->Close(); - } + virtual void TearDown() { table_->Close(); } + protected: static const int total_num_entries = 8; static const char file_name[]; @@ -92,7 +90,7 @@ void RimeTableTest::PrepareSampleVocabulary(rime::Syllabary& syll, d->code.resize(3); d->code.push_back(2); d->code.push_back(1); - d->text = "yi-er-san-er-yi"; + d->text = "yi-er-san-er-yi"; (*lv4)[-1].entries.push_back(d); }