• Nikitos's avatar
    Буфер обмена и предпросмотр IME: Ctrl+C/V/X/A и выделение в <ui.input>
    · a8394d66
    Nikitos создал
    Последний пункт P2, не требующий правок в main.c. Ни буфера обмена, ни
    предпросмотра композиции IME в движке не было вовсе: SDL_EVENT_TEXT_EDITING не
    обрабатывался, SDL_SetClipboardText/GetClipboardText не вызывались, в поле ввода
    не было ни Ctrl+C/V/X/A, ни выделения, а буфер кадра был 256 байт.
    
    ДВИЖОК:
    * r2d_app_clipboard/set_clipboard (SDL3, копию освобождаем сами), текст
      композиции IME и её начало, r2d_app_set_text_input_area для окна кандидатов;
    * обработка SDL_EVENT_TEXT_EDITING: незавершённая композиция показывается
      подчёркнутой и НЕ вставляется — текст придёт TEXT_INPUT;
    * буферы текста и композиции увеличены 256 → 1024/256;
    * engine.clipboard(), engine.setClipboard(text), engine.ime(), engine.textInputArea().
    
    ПОЛЕ ВВОДА:
    * Ctrl+C/X/V/A и классические Shift+Insert/Shift+Delete/Ctrl+Insert;
    * выделение: Shift+стрелки/Home/End с ЯКОРЕМ, Ctrl+A, вставка и удаление
      работают с выделением (вставка его заменяет), maxLength соблюдается и при
      вставке;
    * окно IME показывается у поля, а не в углу окна;
    * $.input.ctrlDown()/shiftDown()/altDown() — модификаторы доступны игре.
    
    НАЙДЕН И ИСПРАВЛЕН ДЕФЕКТ В САМОМ ВЫДЕЛЕНИИ: при Shift+стрелке якорь не
    ставился (sel_from оставался -1), то есть выделения не возникало, и Backspace
    удалял ОДИН символ вместо выделенного куска. Нашлось тестом на точное поведение
    Backspace с выделением.
    
    ЧЕСТНО ПРО ТЕСТ: системного буфера в headless-прогоне нет, поэтому тест
    подменяет engine.clipboard на стороне JS и проверяет ГОРЯЧИЕ КЛАВИШИ и логику
    правки, а не платформенный буфер. Это записано в тесте и в widgets.md.
    
    ЧЕСТНО ПРО ГРАНИЦЫ: выделение не подсвечивается и мышью не выделяется —
    только клавиатурой; перетаскивания выделения нет.
    
    Заодно убрано ложное утверждение в API.md: текст приходит из TEXT_INPUT «с
    учётом IME» — это только завершённый ввод; незавершённая композиция теперь
    описана отдельно.
    
    Проверка: tests/agent/highlevel_clipboard_test.py (17 проверок: ввод, Ctrl+A/C/V/X,
    возврат текста, Backspace с выделением и без, выделение Shift+стрелками, вставка
    вместо выделения, обрезка по maxLength, engine.ime, модификаторы). Полный набор
    qjs, агентские тесты, doc_coverage, doc_claims, duplicate_keys, быстрый набор —
    зелёные.
    a8394d66