# Verification VR (IME, dialogs, quick terminal, flatpak host command, hscroll) ## Replay hook additions (`crates/ghostty-apprt-gtk/src/debug_input.rs`, `class/surface.rs`) - IME: `ime-preedit `, `ime-preedit-end`, `ime-commit `, `ime-state`, `ime-key [text]`. The steps call the surface's real template callbacks (`im_preedit_start/changed/end`, `im_commit`, now `pub(super)` and taking `>k::IMContext`) with a `mock_im::MockIm` (a real `GtkIMContext` subclass whose `preedit_string()` returns text + underline attrs + cursor) as emitter. `ime-key` runs the real `in_keyevent`/`im_composing` bookkeeping: the IM half of `Surface::key_event` was extracted into `Surface::im_filter(filter)` (behaviour unchanged, `key_event` passes `filter_keypress`). Orders covered: ibus (commit then preedit-end), simple (preedit-end then commit), dead key (handled while composing -> not encoded), plain translation commit (handled, encoded with the key), pass. Zig has no `retrieve-surrounding`/`delete-surrounding` handlers (checked surface.zig), so there is nothing to port. - Dialogs: `dialog-info`, `dialog-remember`, `dialog-click