# strans An input method daemon for CJK text entry on X11 and Wayland. Inspired by 9front's ktrans. Threads communicate via CSP channels. ## Dependencies - plan9port - dbus-1 - wayland-client, libxkbcommon (for Wayland support) - gtk+-3.0 (optional, for GTK IM module) ## Build make cd xim && make # XIM adapter cd gtk && make docker && make install # GTK IM module ## Run ./strans map font & For XIM apps: ./xim/strans-xim & XMODIFIERS=@im=strans xterm For GTK apps: GTK_IM_MODULE=strans gedit For IBus apps (kitty, foot, etc.): GLFW_IM_MODULE=ibus kitty For Wayland apps (text-input-v3 clients on wlroots compositors): # nothing to set; the compositor relays text-input-v3 to strans Strans itself is the IBus endpoint and the Wayland input-method-v2 client; no ibus-daemon or fcitx5 needed. Start strans after the compositor. ## Usage Switch input modes with Ctrl + key: N Hiragana K Katakana S Hangul T English V Vietnamese (Telex) E Emoji P Toggle preedit/candidate popup window Type romanized input. Select candidates with 1-9 or arrow keys. Tab or Enter to commit. ## Architecture Threads communicate via CSP channels: - [imthread](strans.c#L271): keystroke processing, transliteration - [dictthread](dict.c#L38): dictionary lookup - [drawthread](win.c#L133): preedit window rendering - [srvthread](srv.c#L42): IPC via unix socket - [ibusthread](ibus.c): IBus D-Bus endpoint for GLFW/kitty - [waylandthread](wayland.c): Wayland input-method-v2 + virtual-keyboard-v1 Adapters (strans-xim, im-strans.so) bridge X11/GTK events. ## Files strans.c input method engine dict.c dictionary queries win.c xcb window management font.c truetype rendering (stb_truetype) wayland.c wayland input-method-v2 adapter map/ transliteration tables font/ bundled CJK fonts input-method-unstable-v2-*.{c,h} wayland-scanner output, vendored virtual-keyboard-unstable-v1-*.{c,h} The two Wayland protocols (input-method-v2, virtual-keyboard-v1) are wlroots-only and not in the upstream wayland-protocols package, so the generated client code is vendored. Regenerate with wayland-scanner if the XML upstream ever changes (it hasn't in years). ## References - https://git.9front.org/plan9front/plan9front/HEAD/info.html - https://np.mkv.li/kor/9front-ktrans-%ED%95%9C%EA%B8%80-%EB%98%91%EB%B0%94%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0/ - https://en.wikipedia.org/wiki/Telex_(input_method) - https://gist.github.com/hieuthi/0f5adb7d3f79e7fb67e0e499004bf558