# 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
