Files
MeowOS-For-R3P2/patch_v2/sdk/test_umbrella.c
T
MeowOS 5a5e995ebd SDK 冲刺批①+②+⑤: meow_box 线性布局 + meow_anim 动画基座 + meow_scroll 滚动物理
- meow_box(include/meow_ui_box.h + meow_ui_box.c):竖直/水平容器;子项=固定|weight|wrap;
  margin/padding/gap;主轴对齐 start/center/end/space-between/around/evenly;交叉轴 start/center/end/stretch;
  嵌套(深度≤16 静态栈,单遍求解,无递归爆炸)。可作 meow_view 布局提供者
  (meow_view_set_layout/relayout,opt-in;未设布局的 view 保持现有绝对坐标行为)。
  新增 meow_widget_set_rect(只写字段不标脏)作为 box 写坐标的通道。
- meow_anim(include/meow_ui_anim.h + meow_ui_anim.c):时间驱动 tween(from/to/duration/easing:
  linear/ease-out/ease-in-out/overshoot)+ update/done 回调;静态池≤16、取消、并行多动画;
  meow_anim_set_region 让每帧只 flush 动画影响区(不整屏)。meow_anim_tick 挂主循环 on_tick,
  无动画零开销(只查计数即返回)。
- meow_scroll(include/meow_ui_scroll.h + meow_ui_scroll.c):速度跟踪(最近 N 采样加权)+ 松手 fling
  (减速度曲线,用 anim 基座驱动)+ 边界过冲 clamp + 简单回弹(不做 spring)+ 可选 snap;
  跟手拖动行为不变(track 内部调既有 set_scroll);每帧只 redraw 列表视口区;不引 libm。
- 追加式:既有 meow_row/column/box 与全部 meow_*_create/hit/scroll 签名一行未改;旧绝对坐标永远有效;
  既有 App 免改源码。
- 验证:宿主新测试 box(42)/anim(32)/scroll(17) 全 PASS;既存 9 回归(widgets/sdk_input_keys/ime_fix/
  pinyin/overlay_suppress/notif_gesture/sdk_fixes/sb_collapse/p1p2p3_repro)全 PASS;
  离屏 demo(demo_box_scroll.c)渲染 box 布局 + 列表 fling 正常;zig-mipsel -Wall -Wextra 全 TU 0 warning;
  meow_ui.a md5 83dd6a2d0d24cc748a8659c29f1de2b5(未重链/部署 hello/files/ncm/reader,由主会话统一处理)。
2026-09-01 23:49:24 +08:00

100 lines
5.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 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;
/* 字体(§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(); }