fix(sdk/hello): M2.71控件真机bug批次 — 圆形进度脏区+整环修复/Slider拖动/Dialog·Sheet背景快照scrim不叠黑/Disabled圆角α/点击重置息屏/滑动跟手/IME残影·键位·主题配色/List选中点击 (agent-162)
This commit is contained in:
1 parent
b12404a986
commit
b8c36bd33c
14 files changed
+554
-79
No files matched your search
+50
-15
@@ -22,6 +22,36 @@
|
||||
#define GAP 4 /* 键间距 */
|
||||
#define GCOL 48 /* 列步进 = GW+GAP */
|
||||
|
||||
/* M2.71-bug7:键盘区背景快照/恢复。旧实现关闭后键盘像素留在屏底(残影)。此处打开前拍下
|
||||
* 键盘区 [KB_TOP,H),关闭后回填 + 上屏 → 无残影。 */
|
||||
static unsigned char *g_ime_cap = NULL;
|
||||
static int g_ime_cap_line = 0, g_ime_cap_h = 0;
|
||||
|
||||
static void ime_capture(void)
|
||||
{
|
||||
unsigned char *bb = meow_ui_back_buf();
|
||||
int line = meow_ui_back_buf_pitch();
|
||||
int h = meow_ui_height() - KB_TOP;
|
||||
if (!bb || line <= 0 || h <= 0) { g_ime_cap = NULL; return; }
|
||||
size_t n = (size_t)line * (size_t)h;
|
||||
if (!g_ime_cap || g_ime_cap_line != line || g_ime_cap_h != h) {
|
||||
free(g_ime_cap);
|
||||
g_ime_cap = (unsigned char *)malloc(n);
|
||||
g_ime_cap_line = line; g_ime_cap_h = h;
|
||||
}
|
||||
if (g_ime_cap) memcpy(g_ime_cap, bb + (size_t)line * KB_TOP, n);
|
||||
}
|
||||
|
||||
static void ime_restore(void)
|
||||
{
|
||||
unsigned char *bb = meow_ui_back_buf();
|
||||
if (!g_ime_cap || !bb) return;
|
||||
size_t n = (size_t)g_ime_cap_line * (size_t)g_ime_cap_h;
|
||||
memcpy(bb + (size_t)g_ime_cap_line * KB_TOP, g_ime_cap, n);
|
||||
meow_gfx_mark_dirty(0, KB_TOP, meow_ui_width(), g_ime_cap_h);
|
||||
meow_ui_flush();
|
||||
}
|
||||
|
||||
typedef enum { K_CH, K_SHIFT, K_SPACE, K_BACK, K_ENTER, K_ESC } kkind;
|
||||
|
||||
struct kbkey { int x, y, w, h; kkind kind; char ch; };
|
||||
@@ -91,18 +121,18 @@ 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 */
|
||||
} else { /* MEOW_IME_NUM:ESC(取消/关闭) + 空格 + 退格;单独一行回车(OK=提交并关闭)。
|
||||
* M2.71-bug7:修掉旧版「同格重叠的 BACK+ENTER」与重复回车。 */
|
||||
add_ch_row(y, "1234567890");
|
||||
add_ch_row(y + GCOL, "-/.:*#+=");
|
||||
{
|
||||
int total = 10 * GW + 9 * GAP;
|
||||
int x = (480 - total) / 2;
|
||||
add_key(x, y + GCOL * 2, GW, GH, K_ESC, 'X');
|
||||
add_key(x + GCOL, y + GCOL * 2, (GW + GAP) * 7, GH, K_SPACE, ' ');
|
||||
add_key(x + GCOL * 9, y + GCOL * 2, GW, GH, K_BACK, '<');
|
||||
add_key(x + GCOL * 9, y + GCOL * 2, GW, GH, K_ENTER, '>'); /* 覆盖:回车 */
|
||||
add_key(x, y + GCOL * 2, GW, GH, K_ESC, 'X'); /* 取消/关闭(丢弃) */
|
||||
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=提交并关闭) */
|
||||
{
|
||||
int total = 10 * GW + 9 * GAP;
|
||||
int x = (480 - total) / 2;
|
||||
@@ -149,25 +179,27 @@ void meow_ime_draw(void)
|
||||
{
|
||||
if (!g_ime_active) return;
|
||||
const meow_theme *th = meow_theme_get();
|
||||
/* 面板 */
|
||||
meow_ui_fill_rect(0, KB_TOP, 480, 720 - KB_TOP, 0x1C1C22);
|
||||
/* 预览行 */
|
||||
meow_ui_fill_rect(0, KB_TOP, 480, 42, 0x2A2A33);
|
||||
char preview[256];
|
||||
/* M2.71-bug7:配色全走 meow_theme(深/浅主题自动切),不再硬编码黑底白键。 */
|
||||
meow_ui_fill_rect(0, KB_TOP, 480, 720 - KB_TOP, th->surfaceContainerHighest); /* 面板 */
|
||||
meow_ui_fill_rect(0, KB_TOP, 480, 42, th->surfaceContainerHigh); /* 回显条 */
|
||||
char preview[260]; /* g_ime_buf(≤255) + '_' + NUL → 需 ≥257,防截断告警 */
|
||||
/* 回显=用户已输入的字符(live echo,非候选/联想),随键入实时刷新。 */
|
||||
snprintf(preview, sizeof preview, "%s_", g_ime_buf);
|
||||
meow_ui_text(14, KB_TOP + 9, preview, th->font_body, 0xFFFFFF);
|
||||
meow_ui_text(14, KB_TOP + 9, preview, th->font_body, th->onSurface);
|
||||
/* 键 */
|
||||
for (int i = 0; i < g_nkeys; i++) {
|
||||
const struct kbkey *k = &g_keys[i];
|
||||
int is_fn = (k->kind != K_CH);
|
||||
uint32_t bg = is_fn ? 0x33333C : 0xFFFFFF;
|
||||
uint32_t bg, fg;
|
||||
if (k->kind == K_ENTER) { bg = th->primary; fg = th->onPrimary; } /* OK=提交 */
|
||||
else if (k->kind == K_CH) { bg = th->surfaceContainerLow; fg = th->onSurface; } /* 字符键 */
|
||||
else { bg = th->primaryContainer; fg = th->onPrimaryContainer; } /* 功能键(ESC/SHIFT/空格/退格) */
|
||||
meow_gfx_fill_round(k->x, k->y, k->w, k->h, 8, bg);
|
||||
char label[2] = { k->ch, 0 };
|
||||
if (is_letter(k->ch)) label[0] = g_shift ? (char)toupper((unsigned char)k->ch)
|
||||
: (char)tolower((unsigned char)k->ch);
|
||||
uint32_t fg = is_fn ? 0xFFFFFF : 0x1A1A1E;
|
||||
if (k->kind == K_SPACE) { meow_ui_text_center(k->x + k->w / 2, k->y + (k->h - meow_ui_text_height(20)) / 2, "SPACE", th->font_body, fg); }
|
||||
else if (k->kind == K_ENTER) { meow_ui_text_center(k->x + k->w / 2, k->y + (k->h - meow_ui_text_height(20)) / 2, "OK", 20, fg); }
|
||||
else if (k->kind == K_ESC) { meow_ui_text_center(k->x + k->w / 2, k->y + (k->h - meow_ui_text_height(20)) / 2, "X", 20, fg); }
|
||||
else { meow_ui_text_center(k->x + k->w / 2, k->y + (k->h - meow_ui_text_height(20)) / 2, label, 20, fg); }
|
||||
}
|
||||
}
|
||||
@@ -199,6 +231,7 @@ void meow_ime_close(int result)
|
||||
g_ime_orig->buf[sizeof g_ime_orig->buf - 1] = 0;
|
||||
}
|
||||
g_ime_active = 0; g_ime_done = 0;
|
||||
ime_restore(); /* M2.71-bug7:关闭还原键盘区背景,无残影 */
|
||||
}
|
||||
|
||||
void meow_ui_text_input_async(meow_ime_ctx *ctx)
|
||||
@@ -211,6 +244,7 @@ void meow_ui_text_input_async(meow_ime_ctx *ctx)
|
||||
g_maxlen = ctx->maxlen > 0 ? ctx->maxlen : 255;
|
||||
g_shift = 0; g_ime_result = 0; g_ime_done = 0; g_ime_active = 1;
|
||||
build_kb(ctx->mode);
|
||||
ime_capture(); /* M2.71-bug7:打开前拍下键盘区背景(关闭即还原) */
|
||||
meow_input_start();
|
||||
meow_input_drain();
|
||||
}
|
||||
@@ -223,6 +257,7 @@ int meow_ui_text_input(meow_ime_ctx *ctx)
|
||||
while (meow_ime_active()) {
|
||||
meow_input_ev e;
|
||||
while (meow_input_pop(&e)) {
|
||||
meow_ui_activity_ping(); /* M2.71-bug5:IME 打字交互也重置息屏计时 */
|
||||
if (e.type == MEOW_EV_TAP) meow_ime_handle_tap(e.a, e.b);
|
||||
}
|
||||
meow_ime_draw();
|
||||
|
||||
Reference in new issue
Block a user