kaomoji_ime: async worker mirroring emoji_ime; KaomojiQuery::QueryPrefix
gains a db_path override. NormalizeMixedCandidateOrder places kaomoji right
after emoji, shifting with cloud/AI. event_listener wires
UpdateKaomojiInput/ApplyKaomojiCandidates/EnqueueKaomojiCandidates and the
PrepareCandidateList trigger; config general.kaomoji_mixed_input is plumbed
through settings_app/webview2; main.cpp starts/stops KaomojiIme; ordering test
added.
Shift+M enters a kaomoji quick-input mode backed by the kaomoji table in
others.db, supporting full pinyin, abbreviated pinyin, English words, and
shuangpin expansion. Candidates commit directly via the new
CandidateSource::Kaomoji; a [utility] kaomoji_mode toggle is wired through
settings. Hardens candidate payload rendering (HTML / backtick / comma
escaping) so kaomoji, which often contain < > & and commas, display correctly.
Shift+E enters an emoji quick-input mode backed by the emoji_pinyin index in
others.db, supporting full pinyin (xiaolian), abbreviated pinyin (xl), English
words (laugh), and shuangpin codes (Xiaohe xnlm expands to xiaolian).
- src/emoji/emoji_query.{h,cpp}: prefix lookup over emoji_pinyin with
shuangpin->quanpin expansion driven by the active scheme
- event_listener: Shift+E trigger, composition helpers, candidate branch, and
direct commit through the new CandidateSource::Emoji
- config: [utility] emoji_mode toggle wired through settings_app / webview2
- tests: emoji_query coverage for full/abbrev pinyin, English, Xiaohe shuangpin
- engine submodule: CandidateSource::Emoji (core/word_item.h)
Fix the issue where AI predictions cannot be directly committed and instead trigger word-creation mode, and fix the issue where words generated by AI predictions cannot be deleted via right-click.
Expand limited single-letter candidates before entering a partially filled
last page so pagination advances normally and the page is full on first display.
- add a disabled-by-default word-to-character setting
- commit the first or last Han character with [ and ]
- use the highlighted candidate for punctuation commits
- preserve punctuation behavior when no Han character is available
- add exact-text commit IPC support and related tests
- move down from the last candidate to the next page
- move up from the first candidate to the previous page
- preserve selection when expanding initial candidates
- keep navigation bounded at the first and last candidates
- add regression tests for cross-page selection
- reject apostrophes adjacent to an existing manual separator
- add regression coverage for quanpin and shuangpin deduplication
- update the IME engine submodule
Accept authenticated terminal deactivation notices over the Aux pipe when the
Main connection fails during teardown. Fence fallback notices by client and
focus token to prevent stale sessions from hiding the floating toolbar, and
add regression coverage for the validation policy.
Force wrap-aware measure, serialize FineTune after measure content
updates, and preserve flip-up host height via MarginTop.
feat: lazily load single-letter Pinyin candidates
- query the top 24 single-letter candidates from the database
- load the complete candidate list on the first page-down action
- apply the same behavior to Shuangpin and Quanpin
- resolve Shuangpin initials according to the active profile
- preserve candidate frequency adjustment and pinning
- disable deletion for single-letter candidates
- add regression tests for Shuangpin v-to-zh mapping and lazy expansion
Support tsf/sendinput/ctrl_v voice commit, route TSF inserts via worker
InsertText, handle WM_SYSKEYDOWN for Ctrl+Shift+Alt+digit candidate delete,
and skip watchdog when the IME profile is disabled.
Skip async AI/cloud refresh on paging and selection keys, early-exit when the
suggestion is already in the list, and dedupe series-cache inserts so repeated
cache hits no longer reset page_index or accumulate AI rows.
Refresh the menu toggle from general.floating_toolbar on show,
navigation, and config reload so it stays aligned with Settings.
Refs metasequoiaime/MetasequoiaImeTsf#17