launcher(M7.0b): 电源菜单/Now Playing 控件化 + SDK 主题薄壳 + i18n 抽取(试点迁移)
M7 整体 MD3 重写试点(M7.0 定两隔离页,只动 patch_v2/meow_launcherd/): - 电源菜单 power_menu.c:圆角卡→meow_card;6 圆钮→meow_iconbtn(回HiBy=ARROW_BACK、 取消=CLOSE;sb_icons 表在位图)+ meow_widget_custom_create(关机/重启/升级/锁定=pm_icons 专有,圆形命中自定义);命中/选中/按压态全走 SDK(meow_widget_hit/set_state/draw), 触摸按下置 PRESSED、抬起清(pm_blend 按主题混合状态层);py 手动驱动控件(哨兵 activity 0x50 push/pop,owner 闸门使命中生效)。 - Now Playing now_playing.c:进度条→meow_progress;播放控制三钮→meow_iconbtn(SKIP_PREV / PLAY_ARROW|PAUSE同位双钮按状态只画其一/ SKIP_NEXT);命中走 meow_widget_hit;封面 (meow_img contain) 与歌名/艺术家 (meow_font) 保留;哨兵 activity 0x51 push/pop。 - 主题薄壳 font_theme.c:s_ui_theme() 改读 SDK meow_theme_export()(单一权威,9 字段映射 §8.1.5),退役 launcher 自持 4 套静态色板(#if 0 回退位)。 - i18n 抽取:两页硬编码中文案改 meow_str(新增 meow_str_zh 辅助:SDK 内嵌表无 launcher 域串 时回退中文默认,TF 覆盖表/后续并入 SDK 内嵌后自动换语)。 - 会话骨架不动:物理键语义(单击息屏/3s 菜单/8s 强关/左缘返回/横划 NP)与两页进入退出/事件流 未改,只替换「怎么画/怎么命中」;旧绘制函数 #if 0 留回退位。 - 验证:新增 test_power_menu_widgets / test_now_playing_widgets 宿主测试(圆形命中/owner+enabled 闸门/选中按压态像素/主题四态 MD3+MIUIx×明暗 渲染 + meow_theme_export 九字段)全 PASS; launcher 全量宿主回归(lock_screen/overlay_gate/utf8_name/media/depends/ams_start/bgplay/ settings_brightness/netmgr_ipc/vol_ramp_jack/notif_panel/notif_tf/lock_render + SDK theme_export/ iconbtn)全 PASS;交叉 -Wall -Wextra 0 warning。新 meow_launcherd md5 94a33b7b。
This commit is contained in:
1 parent
a8c51be1fc
commit
d8241cd2d6
7 files changed
+774
-79
No files matched your search
@@ -41,6 +41,10 @@ static void blit_pm_icon(int idx, int cx, int cy, uint16_t col)
|
||||
}
|
||||
|
||||
|
||||
#if 0 /* ================================================================
|
||||
* M7.0b 退役:电源菜单圆钮改走 SDK 控件(meow_card/meow_iconbtn/自定义画布),
|
||||
* 命中/选中/按压态全由 SDK 接管;本块保留作回退位(删除 #if 0 行恢复旧手绘)。
|
||||
* ================================================================ */
|
||||
/* 绘制电源菜单圆钮 i(MD3 圆形:外描边+内填充+圆内 Material 图标;选中高亮)。
|
||||
* 圆内放 Material Symbols 位图,文字标签放圆下(Android 12 式:icon 上、label 下)。 */
|
||||
static void draw_pm_button(int i, int selected)
|
||||
@@ -71,6 +75,180 @@ static void draw_pm_button(int i, int selected)
|
||||
draw_text(cx - lw / 2, ly + 1, lab, 1, col);
|
||||
}
|
||||
}
|
||||
#endif /* M7.0b 退役:电源菜单旧手绘圆钮 */
|
||||
|
||||
/* ==================================================================
|
||||
* M7.0b 电源菜单控件化(launcher 无 meow_ui_run,手动驱动 SDK 控件):
|
||||
* - 圆角卡 → meow_card(SDK 主题 surfaceContainerLow);
|
||||
* - 六个圆钮 → meow_iconbtn(图标在 SDK sb_icons 表:回HiBy→ARROW_BACK、取消→CLOSE)
|
||||
* 或 meow_widget_custom_create(pm_icons 专有位图:关机/重启/升级/锁定);
|
||||
* - 命中/选中/按压态全走 SDK(meow_widget_hit/set_state/draw);
|
||||
* - 主题 = 读 SDK meow_theme(单一权威),后台遮罩仍 dim_screen(会话骨架不动)。
|
||||
* 控件 lazy 创建一次(owner=PM_SENTINEL_ACT 哨兵 activity),跨多次进入复用;
|
||||
* show_power_menu() 进入时 push 哨兵、退出时 pop(owner 闸门使控件命中生效)。
|
||||
* ================================================================== */
|
||||
#define PM_SENTINEL_ACT 0x50 /* 电源菜单哨兵 activity(不与 launcher 其它页冲突) */
|
||||
#define PM_BTN_SIZE (PM_R * 2) /* 圆钮 = 外接正方形边长(直径) */
|
||||
|
||||
/* 哪些 pm 图标在 SDK sb_icons 表(可用 meow_iconbtn 直接出图);-1=不在 → 自定义画布 blit pm_icons */
|
||||
static const int pm_sdk_icon[PM_NUM] = {
|
||||
-1, /* 0 关机:pm_icons 专有(SDK 无 power 位图) */
|
||||
-1, /* 1 重启:pm_icons 专有 */
|
||||
MEOW_ICON_ARROW_BACK, /* 2 回HiBy:SB_ARROW_BACK 在表 */
|
||||
-1, /* 3 升级:pm_icons 专有 */
|
||||
-1, /* 4 锁定:pm_icons 专有(SDK 无 lock 位图) */
|
||||
MEOW_ICON_CLOSE, /* 5 取消:SB_CLOSE 在表 */
|
||||
};
|
||||
|
||||
/* 圆钮文案 i18n id(meow_str)。common.cancel 内嵌已有;power.* 需 TF 覆盖表/后续并入 SDK 内嵌。 */
|
||||
static const char *pm_str_id[PM_NUM] = {
|
||||
"power.off", "power.restart", "power.back_hiby",
|
||||
"power.upgrade", "power.lock", "common.cancel",
|
||||
};
|
||||
|
||||
static meow_widget *g_pm_card = NULL;
|
||||
static meow_widget *g_pm_btns[PM_NUM] = {NULL};
|
||||
static int g_pm_init = 0;
|
||||
|
||||
/* 按主题混合(pct 0..100:base 向 top 混 pct%,24-bit 每通道;近似 SDK state_tint/blend)。 */
|
||||
static uint32_t pm_blend(uint32_t base, uint32_t top, int pct)
|
||||
{
|
||||
int br = (base >> 16) & 0xFF, bg = (base >> 8) & 0xFF, bb = base & 0xFF;
|
||||
int tr = (top >> 16) & 0xFF, tg = (top >> 8) & 0xFF, tb = top & 0xFF;
|
||||
int r = (br * (100 - pct) + tr * pct) / 100;
|
||||
int g = (bg * (100 - pct) + tg * pct) / 100;
|
||||
int b = (bb * (100 - pct) + tb * pct) / 100;
|
||||
return ((uint32_t)r << 16) | ((uint32_t)g << 8) | (uint32_t)b;
|
||||
}
|
||||
|
||||
/* 自定义画布:绘制 pm_icons 专有圆钮(图标不在 SDK sb_icons 表时用)。
|
||||
* SDK 已把绘制 clip 设为控件矩形;圆形底色按 selected 取主题容器色,图标墨色随之;
|
||||
* 禁用/按压态由本回调自叠(SDK 不替 W_CUSTOM 自动叠,meow_widget_draw_state_layer 铺方矩形,
|
||||
* 圆形钮此处手工按圆域混合,更贴合)。 */
|
||||
static void pm_render_cb(meow_widget *w, const meow_theme *th, void *ctx)
|
||||
{
|
||||
int i = (int)(intptr_t)ctx;
|
||||
int rc[4]; meow_widget_rect(w, rc); /* 绝对坐标 x,y,w,h(launcher 侧 meow_widget 不透明) */
|
||||
int cx = rc[0] + rc[2] / 2, cy = rc[1] + rc[3] / 2;
|
||||
int r = (rc[2] < rc[3] ? rc[2] : rc[3]) / 2;
|
||||
unsigned st = meow_widget_state(w);
|
||||
int sel = (st & MEOW_WS_SELECTED) != 0;
|
||||
int disabled = (st & MEOW_WS_ENABLED) == 0;
|
||||
int pressed = (st & MEOW_WS_PRESSED) != 0;
|
||||
uint32_t base = sel ? th->primaryContainer : th->surfaceContainer;
|
||||
uint32_t fg = sel ? th->onPrimaryContainer : th->onSurface;
|
||||
if (disabled) base = pm_blend(base, th->onSurface, 38); /* 禁用变暗(向灰) */
|
||||
else if (pressed) base = pm_blend(base, th->onSurface, sel ? 24 : 12); /* 按压状态层 */
|
||||
meow_gfx_fill_circle(cx, cy, r, base);
|
||||
blit_pm_icon(i, cx, cy, rgb565(fg));
|
||||
}
|
||||
|
||||
/* 自定义画布命中:圆形(圆心=控件中心,半径=size/2)。 */
|
||||
static int pm_hit_cb(meow_widget *w, int x, int y, void *ctx)
|
||||
{
|
||||
(void)ctx;
|
||||
int rc[4]; meow_widget_rect(w, rc);
|
||||
int cx = rc[0] + rc[2] / 2, cy = rc[1] + rc[3] / 2;
|
||||
int r = (rc[2] < rc[3] ? rc[2] : rc[3]) / 2;
|
||||
int dx = x - cx, dy = y - cy;
|
||||
return dx * dx + dy * dy <= r * r;
|
||||
}
|
||||
|
||||
/* 创建卡片 + 六钮(owner 钉 = PM_SENTINEL_ACT,仅首进创建一次,复用)。 */
|
||||
static void pm_widgets_create(void)
|
||||
{
|
||||
meow_ui_activity_push(PM_SENTINEL_ACT);
|
||||
g_pm_card = meow_card_create(PM_CARD_X0, PM_CARD_Y0, PM_CARD_W, PM_CARD_H);
|
||||
for (int i = 0; i < PM_NUM; i++) {
|
||||
int sz = PM_BTN_SIZE;
|
||||
int x = pm_cx[i] - sz / 2, y = pm_cy[i] - sz / 2;
|
||||
if (pm_sdk_icon[i] >= 0)
|
||||
g_pm_btns[i] = meow_iconbtn_create(x, y, sz, pm_sdk_icon[i]);
|
||||
else
|
||||
g_pm_btns[i] = meow_widget_custom_create(x, y, sz, sz,
|
||||
pm_render_cb, pm_hit_cb,
|
||||
(void *)(intptr_t)i);
|
||||
}
|
||||
meow_ui_activity_pop(); /* 回主 activity(控件 owner 已钉为哨兵) */
|
||||
g_pm_init = 1;
|
||||
}
|
||||
|
||||
/* 主题刷新:iconbtn 底色=surfaceContainer(与卡片 surfaceContainerLow 拉开对比)。
|
||||
* custom 钮由 render_cb 读 th 自带;此处只补 iconbtn 的 opts.bg(跨开放切主题也跟手)。 */
|
||||
static void pm_refresh_theme(void)
|
||||
{
|
||||
const meow_theme *th = meow_theme_get();
|
||||
meow_widget_opts op; memset(&op, 0, sizeof op);
|
||||
op.bg = th->surfaceContainer;
|
||||
for (int i = 0; i < PM_NUM; i++)
|
||||
if (g_pm_btns[i] && pm_sdk_icon[i] >= 0)
|
||||
meow_widget_set_opts(g_pm_btns[i], &op);
|
||||
}
|
||||
|
||||
/* i18n 文案(meow_str_zh:未知 id → 中文兜底)。TF 覆盖表/后续 SDK 内嵌并入后自动换语。 */
|
||||
static const char *pm_label(int i)
|
||||
{
|
||||
return meow_str_zh(pm_str_id[i], pm_labels_cn[i]);
|
||||
}
|
||||
|
||||
/* 绘制单个圆钮(SDK 控件)+ 圆下标签(主题色,选中亮/未选次色)。 */
|
||||
static void pm_draw_button(int i, int selected)
|
||||
{
|
||||
meow_widget *w = g_pm_btns[i];
|
||||
if (!w) return;
|
||||
meow_widget_set_selected(w, selected);
|
||||
meow_widget_draw(w);
|
||||
const meow_ui_theme_t *th = s_ui_theme();
|
||||
int cx = pm_cx[i], cy = pm_cy[i];
|
||||
int ly = cy + PM_R + 8;
|
||||
uint32_t col = selected ? th->on_surface : th->on_surface_variant;
|
||||
if (mfont_ready) {
|
||||
const char *lab = pm_label(i);
|
||||
int lw = meow_font_width_text(lab, 18);
|
||||
meow_font_drawtext((uint16_t *)fb, cx - lw / 2, ly, lab, rgb565(col), 18);
|
||||
} else {
|
||||
const char *lab = pm_labels_en[i];
|
||||
draw_text(cx - (int)strlen(lab) * 5 / 2, ly + 1, lab, 1, col);
|
||||
}
|
||||
}
|
||||
|
||||
/* 标脏一个圆钮的整块区域(圆外接框 + 圆下标签),供局部 flush。 */
|
||||
static void pm_button_dirty(int i)
|
||||
{
|
||||
int sz = PM_BTN_SIZE, cy = pm_cy[i];
|
||||
meow_dirty_add(pm_cx[i] - sz / 2 - 4, cy - sz / 2 - 4, sz + 8, sz + PM_R + 44);
|
||||
}
|
||||
|
||||
/* 命中检测:返回命中的钮下标(0..PM_NUM-1),否则 -1。 */
|
||||
static int pm_hit_button(int x, int y)
|
||||
{
|
||||
for (int i = 0; i < PM_NUM; i++)
|
||||
if (g_pm_btns[i] && meow_widget_hit(g_pm_btns[i], x, y)) return i;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 绘制卡片 + 标题 + 底部提示 + 全部圆钮(进入/全刷时调用一次)。 */
|
||||
static void pm_draw_card(void)
|
||||
{
|
||||
pm_refresh_theme();
|
||||
if (g_pm_card) meow_widget_draw(g_pm_card);
|
||||
const meow_ui_theme_t *th = s_ui_theme();
|
||||
const char *title = "POWER MENU";
|
||||
int title_y = PM_CARD_Y0 + 26;
|
||||
if (mfont_ready)
|
||||
meow_font_drawtext((uint16_t *)fb, (fb_xres - meow_font_width_text(title, 20)) / 2,
|
||||
title_y, title, rgb565(th->on_surface), 20);
|
||||
else
|
||||
draw_text((fb_xres - (int)strlen(title) * 6) / 2, title_y, title, 2, th->on_surface);
|
||||
const char *hint = meow_str_zh("power.hint_nav", "音量导航 电源确认");
|
||||
int hint_y = PM_CARD_Y0 + PM_CARD_H + 10;
|
||||
if (mfont_ready)
|
||||
meow_font_drawtext((uint16_t *)fb, (fb_xres - meow_font_width_text(hint, 18)) / 2,
|
||||
hint_y, hint, rgb565(th->on_surface_variant), 18);
|
||||
else
|
||||
draw_text((fb_xres - (int)strlen("VOLUME NAV POWER OK") * 5) / 2,
|
||||
hint_y + 1, "VOLUME NAV POWER OK", 1, th->on_surface_variant);
|
||||
}
|
||||
|
||||
/* ---- 电源管理服务 IPC 客户端(SYSTEM_FRAMEWORK_SERVICES §3.2:launcher 经服务触发电源动作)----
|
||||
* launcher 不再直连 reboot(2)syscall/写 mtd5/写 boot 默认 —— 统一经 meow_svc_power 的
|
||||
@@ -191,19 +369,12 @@ int show_power_menu(void)
|
||||
/* M2.11 B:默认光标 = 「取消」(安全项,index 4)。用户打开菜单后未导航就按电源/播放,
|
||||
* 只会取消关菜单,绝不因「按电源键」本身关机/重启。要真关机必须先导航到「关机」再确认。 */
|
||||
int sel = PM_NUM - 1; /* 默认取消(安全) */
|
||||
/* M2.30 MD3:居中圆角卡片背景 + 标题居中 + 圆钮网格。卡片白色柔和描边/深色底。 */
|
||||
fill_round_rect(PM_CARD_X0, PM_CARD_Y0, PM_CARD_W, PM_CARD_H, PM_CARD_R, 0x141824);
|
||||
fill_round_rect(PM_CARD_X0 + 2, PM_CARD_Y0 + 2, PM_CARD_W - 4, PM_CARD_H - 4, PM_CARD_R - 2, 0x1C2438);
|
||||
/* 卡片顶部标题,水平居中 */
|
||||
char title[32];
|
||||
snprintf(title, sizeof title, "POWER MENU");
|
||||
int title_y = PM_CARD_Y0 + 26; /* 标题在卡片内顶部(卡片顶 115,标题基线 ~141) */
|
||||
if (mfont_ready) meow_font_drawtext((uint16_t *)fb, (fb_xres - meow_font_width_text(title, 20)) / 2, title_y, title, rgb565(0xFFFFFF), 20);
|
||||
else draw_text((fb_xres - (int)strlen(title) * 6) / 2, title_y, title, 2, 0xFFFFFF);
|
||||
/* 底部提示行(卡片下方,非圆钮所需) */
|
||||
int hint_y = PM_CARD_Y0 + PM_CARD_H + 10;
|
||||
if (mfont_ready) meow_font_drawtext((uint16_t *)fb, (fb_xres - meow_font_width_text("音量导航 电源确认", 18)) / 2, hint_y, "音量导航 电源确认", rgb565(0x777799), 18);
|
||||
else draw_text((fb_xres - (int)strlen("VOLUME NAV POWER OK") * 5) / 2, hint_y + 1, "VOLUME NAV POWER OK", 1, 0x777799);
|
||||
/* M7.0b 控件化:进入 push 哨兵(控件 owner 闸门使 meow_widget_hit 生效)+ lazy 建卡/钮。
|
||||
* 卡片=meow_card(SDK 主题 surfaceContainerLow),圆钮=meow_iconbtn/自定义画布,命中/选中/
|
||||
* 按压态全走 SDK;背景遮罩仍 dim_screen(会话骨架不动)。 */
|
||||
meow_ui_activity_push(PM_SENTINEL_ACT);
|
||||
if (!g_pm_init) pm_widgets_create();
|
||||
pm_draw_card(); /* 卡片 + 标题 POWER MENU + 底部提示(SDK 主题色,i18n 文案) */
|
||||
meow_dirty_full(); /* M2.16:把压暗列表+卡片+标题+(下方圆钮)作为一整帧呈现 */
|
||||
|
||||
/* 触摸状态(按下→抬起):统一 meow_touch 接口(goodix 时序免疫,原点由首个有效 ABS 锁) */
|
||||
@@ -230,19 +401,18 @@ int show_power_menu(void)
|
||||
* 取消 8s 强关,让所选动作(如「回到HibyOS」→ reboot RESTART)生效。仅当全程未互动才保留「按住
|
||||
* 8s=强关」。*/
|
||||
int pm_interacted = 0;
|
||||
int pm_press_idx = -1; /* M7.0b:当前按下钮(按压态走 SDK 状态机位) */
|
||||
for (;;) {
|
||||
/* dirty 绘制:首次全画;此后仅选中变化才重画受影响两钮(消频闪)→ 标脏 + present。 */
|
||||
if (!pm_init) {
|
||||
for (int i = 0; i < PM_NUM; i++) draw_pm_button(i, i == sel);
|
||||
for (int i = 0; i < PM_NUM; i++) pm_draw_button(i, i == sel);
|
||||
pm_init = 1; last_sel = sel;
|
||||
meow_ui_flush(); /* A-1/A-2:SDK present(vsync+帧率门控+blit 脏=全帧,含压暗列表+标题+按钮) */
|
||||
} else if (sel != last_sel) {
|
||||
draw_pm_button(last_sel, 0);
|
||||
draw_pm_button(sel, 1);
|
||||
/* M2.30 圆形:dirty 区 = 圆(圆心±半径)+ 圆下文字(半径+偏移+行高),四周留 10px */
|
||||
int dr = (PM_R + 6) + 10, dtxt = PM_R + 26 + 10;
|
||||
meow_dirty_add(pm_cx[last_sel] - dr, pm_cy[last_sel] - dr, dr * 2, dr + dtxt);
|
||||
meow_dirty_add(pm_cx[sel] - dr, pm_cy[sel] - dr, dr * 2, dr + dtxt);
|
||||
pm_draw_button(last_sel, 0);
|
||||
pm_draw_button(sel, 1);
|
||||
pm_button_dirty(last_sel);
|
||||
pm_button_dirty(sel);
|
||||
last_sel = sel;
|
||||
meow_ui_flush(); /* A-1/A-2:SDK present,blit 两钮区 */
|
||||
}
|
||||
@@ -280,19 +450,31 @@ int show_power_menu(void)
|
||||
mt_down(&mt);
|
||||
pm_interacted = 1;
|
||||
pm_last_interact = now_ms();
|
||||
/* M7.0b 按压态:按下命中钮 → 置 PRESSED 并重绘(SDK 状态层,实时) */
|
||||
pm_press_idx = pm_hit_button(mt.down_x, mt.down_y);
|
||||
if (pm_press_idx >= 0) {
|
||||
meow_widget_set_state(g_pm_btns[pm_press_idx], MEOW_WS_PRESSED, 1);
|
||||
meow_widget_draw(g_pm_btns[pm_press_idx]);
|
||||
pm_button_dirty(pm_press_idx);
|
||||
meow_ui_flush();
|
||||
}
|
||||
} else if (!val && mt.down) {
|
||||
pm_interacted = 1;
|
||||
pm_last_interact = now_ms();
|
||||
if (pm_press_idx >= 0) { /* 清按压态(SDK 状态层随 PRESSED 位清除) */
|
||||
meow_widget_set_state(g_pm_btns[pm_press_idx], MEOW_WS_PRESSED, 0);
|
||||
meow_widget_draw(g_pm_btns[pm_press_idx]);
|
||||
pm_button_dirty(pm_press_idx);
|
||||
pm_press_idx = -1;
|
||||
meow_ui_flush();
|
||||
}
|
||||
int dx, dy;
|
||||
/* M2.25:抬手位移 >= MEOW_TOUCH_SWIPE_THRESH 判滑动(返回0),
|
||||
* 不做确认;否则有效 tap,按下原点命中的按钮即确认。 */
|
||||
if (mt_up(&mt, &dx, &dy)) {
|
||||
/* M2.30 圆形命中:按下原点距圆心 <= PM_R+6 即命中 */
|
||||
for (int i = 0; i < PM_NUM; i++) {
|
||||
int ddx = mt.down_x - pm_cx[i], ddy = mt.down_y - pm_cy[i];
|
||||
int rr = (PM_R + 6) * (PM_R + 6);
|
||||
if (ddx * ddx + ddy * ddy <= rr) { sel = i; act = i; break; }
|
||||
}
|
||||
/* M7.0b 命中走 SDK(owner==哨兵 + enabled + 圆形命中) */
|
||||
int hit = pm_hit_button(mt.down_x, mt.down_y);
|
||||
if (hit >= 0) { sel = hit; act = hit; }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -303,12 +485,13 @@ int show_power_menu(void)
|
||||
/* 8s 强关(绕过):仅当电源持续按住、且用户全程未与菜单互动才触发 —— 放在触摸/按键处理
|
||||
* 之后,避免「用户已点选按钮」的同一轮被强关抢先(M2.10 Bug)。 */
|
||||
if (pwr && !pm_interacted && now_ms() - pm_t0 >= 5000) {
|
||||
if (sim_no_exec) { logmsg("pm: [sim-no-exec] POWER HOLD 8s -> would force poweroff"); return 1; }
|
||||
if (sim_no_exec) { logmsg("pm: [sim-no-exec] POWER HOLD 8s -> would force poweroff"); meow_ui_activity_pop(); return 1; }
|
||||
logmsg("pm: POWER HOLD 8s -> force poweroff");
|
||||
if (meow_power_action(POWER_SHUTDOWN) != MEOW_OK) {
|
||||
logmsg("pm: power service unavailable, abort force-off (menu closed, no action)");
|
||||
return 0;
|
||||
meow_ui_activity_pop(); return 0;
|
||||
}
|
||||
meow_ui_activity_pop();
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -328,6 +511,7 @@ int show_power_menu(void)
|
||||
usleep(POLL_MS * 1000);
|
||||
}
|
||||
if (tfd >= 0) close(tfd);
|
||||
meow_ui_activity_pop(); /* M7.0b:退出电源菜单,回主 activity(控件 owner 仍钉哨兵,复用) */
|
||||
|
||||
/* M2.11 B:电源键在菜单 = 按当前项确认。act 与电源动作逐项核对:
|
||||
* act==PM_NUM-1(取消) -> 只关菜单,绝不关机(return 0,永不到电源动作);
|
||||
@@ -391,7 +575,9 @@ static void draw_cr_button(int sel, int i)
|
||||
{
|
||||
int x0 = (i == 0) ? 80 : 280, y0 = 420, w = 120, h = 60;
|
||||
fill_round_rect(x0, y0, w, h, 12, (i == sel) ? 0x2A3A6A : 0x1A1A2A);
|
||||
const char *lbl = (i == 0) ? "是" : "否";
|
||||
/* M7.0b i18n:是/否 经 meow_str 抽取(未知 id 回退中文) */
|
||||
const char *lbl = (i == 0) ? meow_str_zh("power.confirm_yes", "是")
|
||||
: meow_str_zh("power.confirm_no", "否");
|
||||
if (mfont_ready) {
|
||||
int lw = meow_font_width_text(lbl, 20);
|
||||
meow_font_drawtext((uint16_t *)fb, x0 + w / 2 - lw / 2, y0 + 30 - meow_font_line_height(20) / 2,
|
||||
@@ -408,7 +594,8 @@ int confirm_reboot_player(void)
|
||||
/* M2.8 Bug 3-residual:确认框同电源菜单 —— 若打开前刚经历息屏/blank,LCDC 扫描地址可能
|
||||
* 非 buffer0;强制 re-pan 让「压暗列表 + 是/否」落在被显示的缓冲。 */
|
||||
fb_pan_buf0_force();
|
||||
if (mfont_ready) meow_font_drawtext((uint16_t *)fb, 20, 320, "返回播放器需重启,现在重启?", rgb565(0xFFFFFF), 20);
|
||||
if (mfont_ready) meow_font_drawtext((uint16_t *)fb, 20, 320,
|
||||
meow_str_zh("power.reboot_confirm", "返回播放器需重启,现在重启?"), rgb565(0xFFFFFF), 20);
|
||||
else draw_text(20, 322, "REBOOT TO RETURN TO PLAYER?", 2, 0xFFFFFF);
|
||||
|
||||
meow_touch mt;
|
||||
@@ -428,7 +615,8 @@ int confirm_reboot_player(void)
|
||||
int cr_init = 0, cr_last_sel = -1; /* M2.9 Bug 4:dirty——仅 sel 变化才重画两钮 */
|
||||
/* 标题/按键提示:打开时画一次(原实现把它们放主循环每 10ms 全刷,与 LCD 刷新竞争 →
|
||||
* 「是/否」钮频闪;改为只在打开/状态变化时绘制)。标题在前面已画一次,这里画提示行。 */
|
||||
if (mfont_ready) meow_font_drawtext((uint16_t *)fb, 20, 560, "音量切换 电源取消", rgb565(0x666688), 20);
|
||||
if (mfont_ready) meow_font_drawtext((uint16_t *)fb, 20, 560,
|
||||
meow_str_zh("power.confirm_hint", "音量切换 电源取消"), rgb565(0x666688), 20);
|
||||
else draw_text(20, 562, "VOL NAV POWER EXIT", 1, 0x666688);
|
||||
meow_dirty_full(); /* M2.16:压暗列表+标题+提示作为一整帧呈现 */
|
||||
for (;;) {
|
||||
|
||||
Reference in new issue
Block a user