Files
strans/README.md

132 lines
4.2 KiB
Markdown

# 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
- Python 3 (for generated-map checks)
- 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
Unit tests use the sibling `cutest` Git repository as a submodule and do not
require the Wayland, D-Bus, GTK, or X11 development packages. Repository
mirrors must provide the same sibling; initialize it after cloning with
`git submodule update --init`:
make check # generated map + unit tests
make test TESTARGS=hangul # filtered unit tests only
make verify-map # generated-map check only
The suite covers the fixed-size UTF-8 string, hash table, trie fixtures,
Japanese/Hangul/Telex state transitions, dictionary candidates, engine
selection state, and production map loading. Tests use explicit case tables,
boundary values, and small regressions for repaired core contracts. IPC and GUI
protocol stacks are outside this suite and require separate integration checks.
## 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)
P Toggle preedit echo
Type romanized input. Select candidates with 1-9 or arrow keys.
Tab or Enter to commit.
### Emoji and symbols
Ctrl+E starts a one-shot symbol search; it is not a mode. Any current preedit
is committed, then the previous language is kept for the next input. Type an
English alias or the phonetic keys of the current layout (Korean aliases work,
for example). The candidate list is shown even when Ctrl+P has hidden normal
preedit echo.
안녕 → Ctrl+E → smile → Enter → 😀
There is no auto-insert. Enter commits the first candidate (or the current
one); arrows and Tab move, Alt+1 through Alt+9 select, Esc cancels. Plain
digits are part of the query.
`map/emoji.src` is the source of truth: each UTF-8 TSV row is a result followed
by one or more tab-separated aliases. Aliases may be multilingual. Run
`map/mkemoji > map/emoji.dict` after editing it; `make verify-map` checks the
generated dictionary and the Telex map.
😀 웃음 웃다 스마일 smile grin
## Architecture
Threads communicate via CSP channels:
- [imthread](strans.c): keystroke processing, transliteration
- [dictthread](dict.c): dictionary lookup
- [drawthread](win.c): preedit window rendering
- [srvthread](srv.c): 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