公开 SDK 前把 SDK/App 硬编码文案外置:新增 meow_str/meow_strf/meow_str_set_locale/ meow_str_locale,按当前 locale 取串(永不 NULL),第三方开发者可做多语言。 - 新增 include/meow_ui_str.h + meow_ui_str.c:取串优先级 = TF 覆盖表 > 内嵌当前语言 (en_us→en 其余→zh) > 内嵌内置默认(zh_cn) > 原样返回 id。内嵌双语表(common.* 21 条 + ime.* 9 条);热路径零 malloc(编译期静态表 + ≤256 静态覆盖数组);纯 libc 宿主可单测。 - locale 存系统设置 settings.conf 的 ui.locale(默认 zh_cn,首次调用惰性读取); meow_str_set_locale 即时切换 + 重载覆盖表 + best-effort 持久化(流式改写保留其它行)。 - TF 覆盖表 MeowData/<pkg>/strings/<locale>.txt(id=text 行,UTF-8,'=' 两侧去空白); 无卡/无文件/无该 id → 回落内嵌。meow_strf 用调用方缓冲(snprintf 语义,重入安全)。 - SDK 控件接入:dialog 默认按钮 OK/CANCEL + INPUT 占位、IME 键面/徽标(空格/确定/拼英/ ?123/清/拼音/(无候选)/中)改走 meow_str;空态/加载态给 App 提供 common.no_data/loading。 - 测试:新增 test_meow_ui_str.c(内嵌回退/TF 覆盖优先级/未知 id 回退/切 locale 即时生效/ 查找正确性/meow_strf,tmp+env 两模式);全量宿主回归(widgets/dispatch/box/anim/scroll/ listvirt/theme/ime_fix/pinyin/overlay/notif/sdk_input_keys/p1p2p3/config/vol/sb_collapse/ notify_*) 0 回归;交叉 zig-mipsel -Wall -Wextra 0 warning。 - 文档:MEOW_APP_SDK.md 新增 §13(字符串资源/i18n,遗留顺延为 §14);docs/APP_DEV_GUIDE.md 新增 §7.11。各宿主 test_*.c 头注释补 meow_ui_str.c 编译依赖。 边界(§13.7):仅 zh_cn/en_us 整串取用;不做复数规则 / BiDi / RTL / 动态字体回退(雏形)。
102 lines
5.8 KiB
C
102 lines
5.8 KiB
C
/*
|
||
* test_umbrella.c — 伞头完整性回归:只 #include "meow_ui.h",抽查各模块代表性声明
|
||
* (类型 / 函数 / 宏)都存在。头拆分后用来证明伞头聚合无遗漏、签名未变。
|
||
* 用法:gcc -std=c11 -Wall -Wextra -I<sdk> -c test_umbrella.c -o test_umbrella.o
|
||
* (纯声明级检查,不链接、不调用;产生可执行代码仍 0 warning)。
|
||
*/
|
||
#include "meow_ui.h"
|
||
|
||
#include <stddef.h>
|
||
|
||
/* ---- 类型形状 _Static_assert(编译期)---- */
|
||
_Static_assert(sizeof(meow_ui_opts) == 2 * sizeof(int), "meow_ui_opts shape");
|
||
_Static_assert(sizeof(meow_theme) > sizeof(uint32_t), "meow_theme shape");
|
||
_Static_assert(offsetof(meow_theme, bg) == 0, "meow_theme.bg at 0");
|
||
_Static_assert(offsetof(meow_ime_ctx, buf) == sizeof(meow_ime_mode), "meow_ime_ctx.buf offset");
|
||
_Static_assert(offsetof(meow_list_item, title) > 0, "meow_list_item layout");
|
||
_Static_assert(sizeof(meow_notify) > sizeof(void *), "meow_notify shape");
|
||
_Static_assert(sizeof(meow_audio_state) > 0, "meow_audio_state shape");
|
||
_Static_assert(sizeof(meow_widget_opts) > 0, "meow_widget_opts shape");
|
||
|
||
/* ---- 枚举/宏值 _Static_assert(编译期;值定格即防漂移)---- */
|
||
_Static_assert(MEOW_KEY_POWER == 116, "key power");
|
||
_Static_assert(MEOW_KEY_PREVIOUS == 165, "key previous");
|
||
_Static_assert(MEOW_SWIPE_DOWN == 3, "swipe down");
|
||
_Static_assert(MEOW_IME_PINYIN == 2, "ime pinyin");
|
||
_Static_assert(MEOW_THEME_DARK == 1, "theme dark");
|
||
_Static_assert(MEOW_STYLE_MIUIX == 1, "style miuix");
|
||
_Static_assert(MEOW_Z_TOP == 1000, "z top");
|
||
_Static_assert(MEOW_TOPBAR_BACK == (-2), "topbar back");
|
||
_Static_assert(MEOW_SBAR_HOTZONE_FS == 4, "sbar hotzone fs");
|
||
_Static_assert(MEOW_WS_PRESSED == (1u << 3), "ws pressed");
|
||
_Static_assert(MEOW_BTN_ELEVATED == 4, "btn elevated");
|
||
_Static_assert(MEOW_LAYOUT_BOX == 2, "layout box");
|
||
/* §12.1 线性布局引擎 / §12.2 动画基座 / §12.3 滚动物理(新增模块,不改变既有值) */
|
||
_Static_assert(MEOW_BOX_V == 1, "box dir v");
|
||
_Static_assert(MEOW_BOX_WEIGHT == 1, "box size weight");
|
||
_Static_assert(MEOW_BOX_WRAP == 2, "box size wrap");
|
||
_Static_assert(MEOW_BOX_ALIGN_SPACE_BETWEEN == 3, "box align between");
|
||
_Static_assert(MEOW_BOX_CROSS_STRETCH == 3, "box cross stretch");
|
||
_Static_assert(MEOW_EASE_OVERSHOOT == 3, "ease overshoot");
|
||
_Static_assert(MEOW_ANIM_MAX == 16, "anim pool");
|
||
_Static_assert(MEOW_LIST_SEL_MULTI == 2, "list sel multi");
|
||
_Static_assert(MEOW_NOTIFY_CAT_MEDIA == 5, "notify cat media");
|
||
_Static_assert(MEOW_NOTIFY_URG_CRITICAL == 3, "notify urg critical");
|
||
_Static_assert(MEOW_NOTIFY_TIMEOUT_ONGOING == (-1), "notify ongoing");
|
||
_Static_assert(MEOW_LOG_ERROR == 3, "log error");
|
||
_Static_assert(MEOW_DLG_INPUT == 2, "dlg input");
|
||
_Static_assert(MEOW_FONT_TIER_FULL == 2, "font tier full");
|
||
_Static_assert(MEOW_CFG_ERR_NOENT == (-2), "cfg noent");
|
||
|
||
/* ---- 函数存在性检查(取址即要求已声明;未声明 → 编译错误)---- */
|
||
static void umbrella_smoke(void)
|
||
{
|
||
/* 绘制层(§3)+ 时间/刷新率(§7/§7.1) */
|
||
(void)&meow_ui_init; (void)&meow_ui_flush; (void)&meow_ui_fill_rect_alpha;
|
||
(void)&meow_ui_text_center; (void)&meow_ui_time_ms; (void)&meow_ui_effective_rate;
|
||
/* 图片层(§4) */
|
||
(void)&meow_img_load_file; (void)&meow_ui_img_cover; (void)&meow_img_w;
|
||
/* 主题(§8) */
|
||
(void)&meow_theme_get; (void)&meow_theme_defaults; (void)&meow_ui_set_style;
|
||
/* 输入法(§5.1) */
|
||
(void)&meow_ui_text_input; (void)&meow_ime_text; (void)&meow_ime_composition;
|
||
/* 控件层(§5/§5.8/§5.8.6/§5.5) */
|
||
(void)&meow_btn_create; (void)&meow_widget_custom_create; (void)&meow_row_create;
|
||
(void)&meow_topappbar_hit; (void)&meow_listview_create; (void)&meow_list_tap_at;
|
||
(void)&meow_widget_set_opts; (void)&meow_widget_state; (void)&meow_progress_set;
|
||
/* 输入层/生命周期(§6)+ 长按(§6.3) */
|
||
(void)&meow_ui_run; (void)&meow_ui_swipe_hint; (void)&meow_ui_set_long_press_cb;
|
||
/* Activity 栈(§6.1) */
|
||
(void)&meow_ui_activity_push; (void)&meow_ui_global_add; (void)&meow_ui_activity_depth;
|
||
/* 绘制物注册表 / z 序(§6.2) */
|
||
(void)&meow_widget_set_z; (void)&meow_draw_custom_register; (void)&meow_ui_invalidate;
|
||
(void)&meow_ui_paint_full; (void)&meow_ui_set_page_bg;
|
||
/* 状态栏 / 全屏(§3.1) */
|
||
(void)&meow_ui_set_statusbar; (void)&meow_ui_statusbar_height; (void)&meow_ui_statusbar_hotzone;
|
||
(void)&meow_ui_statusbar_set_collapsed;
|
||
/* 模态(§5.8.6 弹窗/面板) */
|
||
(void)&meow_dialog_create; (void)&meow_dialog_show; (void)&meow_sheet_open;
|
||
/* 日志(§9) */
|
||
(void)&meow_log; (void)&meow_log_get_level;
|
||
/* 通知(§9.1) */
|
||
(void)&meow_notify_send; (void)&meow_notify_category_str; (void)&meow_notify_update_progress;
|
||
/* 配置(§9.2) */
|
||
(void)&meow_config_dir; (void)&meow_config_int; (void)&meow_config_remove;
|
||
/* 字符串资源/i18n(§13,追加式) */
|
||
(void)&meow_str; (void)&meow_strf; (void)&meow_str_set_locale; (void)&meow_str_locale;
|
||
/* 字体(§5.7/§10) */
|
||
(void)&meow_font_enumerate; (void)&meow_font_tier; (void)&meow_font_select_by_id;
|
||
/* 音频(§11) */
|
||
(void)&meow_audio_open; (void)&meow_audio_query; (void)&meow_audio_on_preempt;
|
||
/* §12.1 布局 / §12.2 动画 / §12.3 滚动 */
|
||
(void)&meow_box_new; (void)&meow_box_arrange; (void)&meow_box_add;
|
||
(void)&meow_box_add_sub; (void)&meow_widget_set_rect;
|
||
(void)&meow_anim_start; (void)&meow_anim_cancel; (void)&meow_anim_tick;
|
||
(void)&meow_ease_apply; (void)&meow_anim_set_region;
|
||
(void)&meow_scroll_create; (void)&meow_scroll_wrap; (void)&meow_scroll_track;
|
||
(void)&meow_scroll_fling; (void)&meow_scroll_velocity; (void)&meow_scroll_set_snap;
|
||
}
|
||
|
||
/* 供宿主回归驱动直接调用;不链接本库也没关系(纯地址丢弃)。 */
|
||
void test_umbrella_run(void) { umbrella_smoke(); }
|