Wide characters shifted everything after them one column to the right:
- render.rs: vt100's empty wide-continuation cell was padded to a
space, making wide chars occupy 2+1 columns — skip it entirely
- ipc.rs buffer_to_ansi: same bug for daemon frames — skip cells
covered by a preceding wide symbol (unicode-width)
- app.rs: clamp virtual terminals to >= 2 columns (vt100 0.16 has a
subtraction underflow panic on wide chars in a 1-col grid) and give
content_area a sane 80x24 default so windows spawned before the
first layout pass aren't degenerate
- main.rs: use try_send for display frames so one slow/stalled client
can no longer freeze the whole WM
- integration test: new end-to-end check that emoji do not shift the
row, plus fix a false match against the window title
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- New key_event/mouse_event client messages (crossterm serde) that run
through the complete WM event handling on the server — remote clients
get window focus, drag/resize and mouse forwarding into virtual
terminals (SGR/UTF-8/X10) identical to standalone mode
- tui-wm -c now forwards mouse events; previously only keyboard worked
remotely
- IPC unit tests + end-to-end integration test (tests/integration.py):
daemon, frames, click/scroll SGR forwarding, popups, TUI-FM in a
window — 12/12 passing
- Document the new messages in SOCKET_API.md
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>