Skip to content

[WIP] Fix InputBox IME positioning issue for Chinese input#68

Draft
FeJS8888 with Copilot wants to merge 1 commit into
mainfrom
copilot/fix-ime-input-issue
Draft

[WIP] Fix InputBox IME positioning issue for Chinese input#68
FeJS8888 with Copilot wants to merge 1 commit into
mainfrom
copilot/fix-ime-input-issue

Conversation

Copilot AI commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Thanks for asking me to work on this. I will get started on it and keep this PR's description up to date as I form a plan and make progress.

修复 FeJS8888/FeEGELib 中 InputBox 的中文输入法(IME)定位异常问题,尤其是在输入框中已有英文/混合文本后再输入中文时,出现上屏位置偏移、光标定位异常等。

已观察到高风险逻辑位于 src/sys_edit.cppWM_IME_STARTCOMPOSITION / WM_IME_COMPOSITION / killIME())及与之配套的 InputBox 逻辑(如 markIMEStartcommitIMEStringdeleteSelectedTextupdateIMEPosition)。

请完成以下任务:

  1. 根因分析并修复

    • 全面阅读 InputBox 与系统编辑框桥接逻辑,定位中英文混输时 IME 组合串与插入位置错位的根因。
    • 重点检查并修复:
      • IME 组合起点记录与更新策略(markIMEStart
      • 失焦/取消组合时提交逻辑(killIME
      • WM_IME_COMPOSITIONGCS_RESULTSTR / GCS_COMPSTR 的处理
      • 文本变更后 caret/selection/IME 起点的一致性
    • 确保索引语义一致(避免字符数与 UTF-16 单元索引混淆导致偏移)。
  2. 行为要求

    • 在以下场景下光标与上屏位置正确:
      • 纯中文输入
      • 纯英文输入
      • 英文后接中文
      • 中文后接英文
      • 中英文交替输入
      • 有选区时开始中文输入(应先替换选区)
      • 失焦时存在未完成组合串
    • 避免重复提交、拼音串误提交、组合串丢失。
  3. 兼容性与回归

    • 不破坏现有 InputBox 常规输入、选择、删除、最大长度限制等行为。
    • 保持现有 API 不变,除非确有必要并在 PR 描述中说明。
  4. 文档与说明

    • 在 PR 描述中简要说明:问题根因、关键修复点、验证场景。
    • 如有必要,在代码中补充简洁注释解释 IME 事件处理决策。

请直接提交修复代码并创建 PR。

The following is the prior conversation context from the user's chat exploration (may be truncated):

User: 现在输入框出现了许多奇怪问题,例如输入框中含有英文等会导致中文输入后定位异常等,仔细阅读代码,理解逻辑,尝试分析问题所在,并修复

Assistant: 我先给你结论:问题大概率出在 IME 组合串处理时,使用了“组合起点索引”但没有在英文/ASCII 与中文混合输入后正确同步索引语义(字符数 vs UTF-16 单元)或没有在文本变更后及时重算,导致中文上屏后插入位置偏移。你仓库里 sys_edit.cppkillIME()/WM_IME_STARTCOMPOSITION 这段正是高风险点。

我已经定位到关键文件(但注意:代码搜索工具单次最多返回 10 条,结果可能不完整):

  • src/sys_edit.cpp(最关键)
  • include/sys_edit.h
  • 以及 docs 里 InputBox 说明

你可以查看更多搜索结果(GitHub UI):
https://github.com/search?q=repo%3AFeJS8888%2FFeEGELib+IME+InputBox+WM_IME_COMPOSITION+killIME&type=code


你这个 bug 的典型成因(结合你代码)

WM_IME_STARTCOMPOSITION 中你做了:

  1. 删除选区 deleteSelectedText()
  2. 记录起点 markIMEStart()
  3. 返回 TRUE(即你自己接管处理)

killIME() 中又会:

  • GCS_COMPSTR
  • CPS_CANCEL
  • 手工 commitIMEString(compStr) 按起点塞回文本

这套逻辑如果 起点位置不是“当前实际插入点”(尤其在前面有英文、emoji、代理对、或 edit 内部插入点变化)就会错位。
另外一个常见坑:取 GCS_COMPSTR(拼音串)而不是 GCS_RESULTSTR(最终上屏串)做提交,会在某些输入法/时机下拿到不该提交的内容,进一步扰乱光标。


建议修复(最小可行)

  1. 组合开始时记录真实 caret(EM_GETSEL)作为 imeStartPos,且统一按 UTF-16 索引处理。
  2. 组合结束/失焦时优先提交 GCS_RESULTSTR,不要用 GCS_COMPSTR 作为最终提交内容。
  3. 每次文本被程序改写(删除选区、替换、插入)后,同步更新 imeStartPos 或直接失效重取。
  4. 不要在 WM_IME_STARTCOMPOSITION 里过早吞掉所有默认行为;若吞掉,就必须完整接管组合窗口、结果串、caret 同步(否则极易漂移)。
  5. WM_IME_COMPOSITION 里按 lParam 分支:
    • GCS_RESULTSTR:提交最终串并更新 caret
    • GCS_COMPSTR:仅用于预编辑显示(若你支持)
    • 结束后清空 composing 状态

我可以直接帮你落地改代码

如果你同意,我下一步会:

  • 继续把 InputBox 相关实现文件(markIMEStart/commitIMEString/deleteSelectedText/updateIMEPosition)完整拉出来逐行核对,
  • 然后给你一个可直接合入的补丁(精确到函数级改动)。

你回复一句:“继续修复并提交补丁”,我就直接开始。

User: 继续修复并创建pr

Assistant: 好的,我这边已经发起了修复与创建 PR 的流程,现在正在等待你在弹窗里确认/授权,你确认后我就会继续执行并给你返回 PR 链接与修改摘要。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants