Files
deckcraft/docs/control-protocol.md
T
Brandon ThomasandClaude Opus 5.5 ea3b1159d5 Korean, Japanese and Chinese: input-method composition and interface text (#101) (#331)
* Text: input method composition as commands, one undo step per composition (#101)

text.compose shows an input method's preedit in place at the insertion point and replaces it on
each update; an empty preedit cancels and restores the text and selection. text.commit replaces
the composition with the result as one undo step. Any other edit, key or click settles an open
composition first. The composition is underlined under the baseline (thicker under the part being
converted), and the caret line is measured for empty placeholders too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* UI: Korean, Japanese and Chinese input and interface text (#101)

The slide turns the input method on while it takes typing, with the candidate window at the
caret, and forwards egui Ime events to text.compose / text.commit, so a Korean keyboard composes
syllables instead of separate jamo. Interface text in scripts the interface fonts lack (Hangul,
Simplified Chinese, Thai...) borrows faces from the font database (installed fonts such as Malgun
Gothic; nothing bundled): file names, titles, notes, outline, sections, comments and typed text.
Ported and widened from WordCraft's #565/#840 fallback. The notes pane keeps text typed before
focus leaves in the same frame (Escape, another slide). Control channel: ui.ime.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-12 22:03:42 -04:00

2.7 KiB
Raw Blame History

Control protocol

Start the app with --control <port>. The server listens on 127.0.0.1 only and speaks JSON lines: one request object per line, one reply per line.

{"id": 1, "method": "engine.execute", "params": {"command": "shape.insert", "params": {"preset": "roundRect", "rect": [100, 100, 240, 120], "text": "Hello"}}}
{"id": 1, "ok": true, "result": {"id": 258}}

Coordinates are slide points (1/72 inch; a 16:9 slide is 960 × 540) unless noted.

Method Params What it does
engine.execute / ui.menu.invoke / command {command, params} Run any command (see engine.commands; deckcraft-cli describe ID documents one)
engine.commands — Every command: id, label, menu path, shortcut, params doc, enabled / disabled reason
document.inspect — Slides, sections, layouts, shapes, selection
ui.inspect — UI state, active tool, window/canvas/slide rects, dialog, Home (start screen over the open presentations), slide show state, documents, perf (fps, render ms)
ui.tool.select {tool, preset?} select, text, shape + preset, any preset name, curve, freeform, scribble, pen, highlighter, eraser
ui.pointer {events: [{kind: down|drag|up|move|doubleclick|tripleclick, x, y, mods?}], mods?} Drive the active tool in slide points through the same code path as the mouse
ui.key / ui.text {key, shift?, alt?, cmd?} / {text} Keyboard input (also drives a running slide show)
ui.ime {preedit, active?: [start, end]} / {commit} An input method's composition through egui, as a real one arrives: shown in place on the slide or in a focused field; {"preedit": ""} cancels
ui.move / ui.click / ui.drag screen points Real egui pointer input — reaches every widget, menu and pane
ui.set {tab?, view?, pane?, notes?, zoom?, brightness?, ruler?, gridlines?, guides?, …} UI state (returns the full state)
ui.dialog.open / ui.dialog.close {id, fields?} Open or close a dialog by id; fields pre-fills its fields (About: {"tab": "contributors"} or "models")
ui.screenshot {path?} PNG of the whole window (base64 when no path)
ui.render {path?, slide?, scale?} Render a slide headlessly
ui.resize / ui.focus Window control
show.start / show.end {from?: slide index, presenter?, reading?} Slide show
app.open / app.save / app.export / app.quit {path, …} Files (export takes the file.export params, e.g. {"path": "deck.pdf", "layout": "handouts", "perPage": 3})

The MCP server (deckcraft-cli mcp, see mcp.md) wraps the same methods for Claude and other agents; deckcraft-cli app METHOD [JSON] sends one request from a shell.