vietc/CHANGELOG.md
Khoa Vo ac7d5c24ec docs: update README and CHANGELOG for v0.1.0 overhaul
- README: update architecture diagrams, feature table, VNI key table
- CHANGELOG: document engine rewrite, injection overhaul, bug fixes
2026-06-26 15:22:07 +07:00

3.3 KiB

Changelog

v0.1.0 (2026-06-26)

Initial release and major overhaul.

Engine (major rewrite)

  • Bamboo engine port — Replaced custom Telex/VNI state machines with a Rust port of bamboo-core's transformation model. Marks and tones are applied to characters in a composition buffer, with proper tone placement for all Vietnamese diphthongs.
  • Flexible backtracking — Mark/tone keys scan up to 5 characters backward to find the target vowel. Type the full syllable, then add marks at the end: nguye6n4nguyễn.
  • Smart uo→ươ cluster — Single w/7 key after a uo pair converts both to ươ, even through consonants: chuong7chương.
  • Correct tone placement — Fixed tone positioning for io (gió), (xuất), (nguyễn), oa/oe, uy, , , ươ clusters.
  • Consume stale marks — VNI/Telex control keys (digits, f/s/r/x/j/w) are consumed silently when they produce no change (e.g., pressing 5 on an already-toned ).
  • 63 focused unit tests covering Telex, VNI, tone placement, marks, macros, and uppercase.

Injection (major overhaul)

  • Uinput injection — ASCII and backspace via Linux evdev keycodes (/dev/uinput). Correct keycodes per keyboard hardware, no X11 keycode mismatches.
  • Vietnamese Unicode — Clipboard paste via persistent X11 connection + XTest Ctrl+V. Text is split only at trailing whitespace/punctuation boundary (no mid-word splitting). Persistent X11 display opened once and reused.
  • Uinput daemon (vietc-uinputd) — Privileged Unix socket server for /dev/uinput injection. VMK-style architecture with capability separation. The main daemon communicates via socket, falling back to in-process uinput.
  • X11Injector uses XKeysymToKeycode for Ctrl+V keycodes, adapting to the actual keyboard layout.

Capture

  • Evdev preferred — Keyboard capture via /dev/input/event* with device grab is now the primary path. More reliable than X11 XRecord.
  • X11 XRecord fallback — X11 passive monitoring via C helper (vietc-xrecord) as fallback when evdev is unavailable.

Bug Fixes

  • Fix Xutf8LookupString signature — Missing XIC parameter caused all keycodes to map to \0. Fixed by adding *mut c_void as first argument and passing NULL.
  • Fix execute_commands backspace count — The X11 path incorrectly passed grabbed=true, subtracting 1 from every backspace. Changed to false so full backspace count is used.
  • Fix flush backspace overcountprev_len + 1 erased one character beyond the word. Fixed to prev_len.
  • Fix apply_mark char removal — Removed pattern.len() chars from composition, but the current key hadn't been appended yet. Fixed to pattern.len() - 1.
  • Fix mark backtrack position — Marks were applied at the end of composition instead of at the found position. Added position-aware apply_mark_at.

Packaging

  • AppImage bundles vietc-uinputd, vietc-xrecord, xclip.
  • AppRun preserves LD_LIBRARY_PATH with system library paths for dlopen.
  • AppRun auto-starts vietc-uinputd via pkexec/sudo when available.
  • Cleaned up vietc-xrecord compilation flags (only -lX11 -lXtst needed).

Testing

  • 63 focused engine tests covering Telex, VNI, marks, tones, macros, casing.
  • Removed old auto-generated bulk tests (850+ tests for deprecated engine).