fix(sdk/ime): IME 修复(shift小写基/OK只提交不关/阻塞喂on_tick agent-169) + dialog INPUT回归(dlg_ime_change_cb实时回写+适配新语义 agent-173) + test_sdk_fixes shift断言更新 + 宿主测试test_ime_fix
This commit is contained in:
1 parent
c515a33ac4
commit
2d7fe81229
7 files changed
+359
-15
No files matched your search
@@ -1,11 +1,15 @@
|
||||
/*
|
||||
* meow_ui_ime.c — 内置触屏软键盘(B1.6)。仅英文 QWERTY / 数字,ASCII。
|
||||
*
|
||||
* 阻塞:meow_ui_text_input(ctx) 弹出键盘,自绘自分发直到确认(enter)/取消(esc|背景)。
|
||||
* 阻塞:meow_ui_text_input(ctx) 弹出键盘,自绘自分发直到关闭(ESC / 点背景取消)。
|
||||
* 回车(K_ENTER)只提交(mark g_ime_result=1)不关闭,用户可继续输入。
|
||||
* 阻塞期间周期性喂 App on_tick(meow_ui_feed_tick),动态内容(进度条/时钟)不卡死。
|
||||
* 非阻塞:meow_ui_text_input_async(ctx) 打开后返回;meow_ui_run 在 on_tick 间隙
|
||||
* 随帧绘制并拦截触摸,app 用 meow_ime_active()/meow_ime_text() 轮询。
|
||||
*
|
||||
* 键盘覆盖屏幕底部约 300px;点按输入;键位 44×36(touch target 达标)。
|
||||
* M2.71-IME-fix:字母键面存小写("qwertyuiop"…),shift 开→大写、关→小写;
|
||||
* 数字/符号键不随 shift 转换。旧版键面存大写 → 无论 shift 开关恒输出大写(bug)。
|
||||
*/
|
||||
#include "meow_ui.h"
|
||||
#include "meow_ui_internal.h"
|
||||
@@ -15,6 +19,11 @@
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* 阻塞 IME 循环周期性喂 App on_tick(实现在 meow_ui_input.c,读该 TU 的 g_events)。
|
||||
* 让 IME 打开期间 App 的动态内容(进度条/时钟)继续刷新;调用在 meow_ime_draw 之前,
|
||||
* 保证 App 重绘先进 back_buf、IME 面板随后盖上去(IME 始终最上,不被 App 重绘覆盖)。 */
|
||||
extern void meow_ui_feed_tick(void);
|
||||
|
||||
#define IME_MAXKEYS 96
|
||||
#define KB_TOP 420 /* 面板顶(预览行起点) */
|
||||
#define GW 44 /* 键宽 */
|
||||
@@ -94,10 +103,10 @@ static void build_kb(meow_ime_mode mode)
|
||||
int y = KB_TOP + 50;
|
||||
if (mode == MEOW_IME_ASCII) {
|
||||
add_ch_row(y, "1234567890");
|
||||
add_ch_row(y + GCOL, "QWERTYUIOP");
|
||||
add_ch_row(y + GCOL, "qwertyuiop");
|
||||
/* 第 3 行:9 字母 + SHIFT */
|
||||
{
|
||||
const char *r = "ASDFGHJKL";
|
||||
const char *r = "asdfghjkl";
|
||||
int n = (int)strlen(r);
|
||||
int total = 10 * GW + 9 * GAP;
|
||||
int x = (480 - total) / 2;
|
||||
@@ -106,7 +115,7 @@ static void build_kb(meow_ime_mode mode)
|
||||
}
|
||||
/* 第 4 行:7 字母 + BACKSPACE */
|
||||
{
|
||||
const char *r = "ZXCVBNM";
|
||||
const char *r = "zxcvbnm";
|
||||
int n = (int)strlen(r);
|
||||
int total = 10 * GW + 9 * GAP;
|
||||
int x = (480 - total) / 2;
|
||||
@@ -121,8 +130,9 @@ static void build_kb(meow_ime_mode mode)
|
||||
add_key(x + GCOL, y + GCOL * 4, (GW + GAP) * 6, GH, K_SPACE, ' ');
|
||||
add_key(x + GCOL * 8, y + GCOL * 4, 2 * GW + GAP, GH, K_ENTER, '>');
|
||||
}
|
||||
} else { /* MEOW_IME_NUM:ESC(取消/关闭) + 空格 + 退格;单独一行回车(OK=提交并关闭)。
|
||||
* M2.71-bug7:修掉旧版「同格重叠的 BACK+ENTER」与重复回车。 */
|
||||
} else { /* MEOW_IME_NUM:ESC(取消/关闭) + 空格 + 退格;单独一行回车(OK=只提交不关闭)。
|
||||
* M2.71-bug7:修掉旧版「同格重叠的 BACK+ENTER」与重复回车。
|
||||
* M2.71-IME-fix:回车不再关闭(与 ASCII 一致),关闭走 ESC/背景。 */
|
||||
add_ch_row(y, "1234567890");
|
||||
add_ch_row(y + GCOL, "-/.:*#+=");
|
||||
{
|
||||
@@ -132,7 +142,7 @@ static void build_kb(meow_ime_mode mode)
|
||||
add_key(x + GCOL, y + GCOL * 2, (GW + GAP) * 7, GH, K_SPACE, ' '); /* 空格 */
|
||||
add_key(x + GCOL * 8, y + GCOL * 2, (GW + GAP) * 2 - GAP, GH, K_BACK, '<'); /* 退格 */
|
||||
}
|
||||
/* 回车(OK=提交并关闭) */
|
||||
/* 回车(OK=只提交不关闭) */
|
||||
{
|
||||
int total = 10 * GW + 9 * GAP;
|
||||
int x = (480 - total) / 2;
|
||||
@@ -148,7 +158,10 @@ static void apply_key(const struct kbkey *k)
|
||||
{
|
||||
switch (k->kind) {
|
||||
case K_CH: {
|
||||
char c = g_shift && is_letter(k->ch) ? (char)toupper((unsigned char)k->ch) : k->ch;
|
||||
/* M2.71-IME-fix:键面存小写(build_kb "qwertyuiop"…),shift 开→大写、关→小写;
|
||||
* 数字/符号(非字母)不转换。旧版存大写 + else 分支恒返回大写 → 大小写不区分。 */
|
||||
char c = k->ch;
|
||||
if (g_shift && is_letter(c)) c = (char)toupper((unsigned char)c);
|
||||
int len = (int)strlen(g_ime_buf);
|
||||
if (len < g_maxlen - 1) {
|
||||
g_ime_buf[len] = c; g_ime_buf[len + 1] = 0;
|
||||
@@ -169,7 +182,7 @@ static void apply_key(const struct kbkey *k)
|
||||
if (g_ime_ctx.on_change) g_ime_ctx.on_change(g_ime_buf, g_ime_ctx.ctx); }
|
||||
break;
|
||||
}
|
||||
case K_ENTER: g_ime_result = 1; g_ime_done = 1; break;
|
||||
case K_ENTER: g_ime_result = 1; break; /* M2.71-IME-fix:回车只提交(mark),不关键盘;关闭走 ESC/背景 */
|
||||
case K_ESC: g_ime_result = 0; g_ime_done = 1; break;
|
||||
}
|
||||
}
|
||||
@@ -260,6 +273,10 @@ int meow_ui_text_input(meow_ime_ctx *ctx)
|
||||
meow_ui_activity_ping(); /* M2.71-bug5:IME 打字交互也重置息屏计时 */
|
||||
if (e.type == MEOW_EV_TAP) meow_ime_handle_tap(e.a, e.b);
|
||||
}
|
||||
/* M2.71-IME-fix:阻塞 IME 期间喂 App on_tick(动态内容继续刷,progress/时钟不卡死)。
|
||||
* 顺序要求:先喂 on_tick(App 重绘进 back_buf)→ 再 meow_ime_draw(IME 面板随后盖上去),
|
||||
* 保证 IME 面板覆盖在最上,不被 App 的 d_paint_region 覆盖。 */
|
||||
meow_ui_feed_tick();
|
||||
meow_ime_draw();
|
||||
meow_ui_flush();
|
||||
usleep(16000);
|
||||
|
||||
Reference in new issue
Block a user