/* app.c — hello 应用装配层:main + 组装 + 事件分发。 * * 职责(SDK_VIEW_FRAMEWORK_DESIGN.md §B.2):main 只做初始化/建页/跑事件循环/清理;把 * meow_ui_run 的平铺输入回调(key/tap/swipe/tick/touch)路由到当前活动页(home/full/demo)。 * 页面切换统一走 meow_view_page_push/pop(活动栈 + on_enter/on_leave 的唯一驱动,App 不再 * 分别调 activity_push/pop)。业务变化经 logic 监听器送回 UI(见 ui/home/home.c)。 * * 契约(MEOW_APP_SDK.md §1/§3/§6):应用只调 meow_ui API。 */ #include "hello_internal.h" #include /* Dialog / BottomSheet(阻塞模态;非控件,main() 创建一次,demo 页打开/关) */ meow_dialog *g_dlg; meow_sheet *g_sheet; static meow_view *g_home_view; static meow_view *g_full_view; static meow_view *g_demo_view; static void on_sigterm(int s) { (void)s; meow_ui_request_exit(); } /* ============================================================ */ /* 事件分发:meow_ui_run 平铺回调 → 当前页 */ /* ============================================================ */ static void app_on_key(int keycode, int is_down) { (void)keycode; (void)is_down; meow_log(MEOW_LOG_DEBUG, "key"); } static void app_on_tap(int x, int y) { if (demo_is_active()) { demo_on_tap(x, y); return; } if (full_is_active()) { meow_view_page_pop(); return; } /* 全屏:点任意处回 home */ home_on_tap(x, y); } static void app_on_swipe(int dir, int dx, int dy) { (void)dy; if (demo_is_active()) { demo_swipe(dir, dx); return; } if (dir == MEOW_SWIPE_LEFT) { if (full_is_active()) { meow_view_page_pop(); } else { meow_log(MEOW_LOG_INFO, "exit:swipe"); meow_ui_request_exit(); } } } /* M2.71-bug2/6:拖动过程回调(只对 demo 页有意义;home/全屏不拖拽)。 */ static void app_on_touch_down(int x, int y) { if (demo_is_active()) demo_touch_down(x, y); } static void app_on_touch_move(int x, int y) { if (demo_is_active()) demo_touch_move(x, y); } static void app_on_swipe_progress(int x_start, int dx) { meow_ui_swipe_hint(x_start + dx); } static void app_on_tick(void) { uint64_t now = meow_ui_time_ms(); if (demo_is_active()) { demo_tick(now); return; } static uint64_t last = 0; /* home/全屏计时:1s 一跳(demo 不计数,同旧) */ if (now - last >= 1000) { last = now; logic_secs_add(1); } } /* ============================================================ */ /* main */ /* ============================================================ */ int main(void) { meow_log(MEOW_LOG_INFO, "start"); meow_ui_opts o = { 480, 720 }; if (meow_ui_init(&o) != 0) { meow_log(MEOW_LOG_ERROR, "init failed"); return 1; } meow_theme_add_listener(NULL); signal(SIGTERM, on_sigterm); /* Dialog / BottomSheet 实例(阻塞模态;打开前排空残留触摸由 SDK 处理) */ g_dlg = meow_dialog_create(MEOW_DLG_SELECT, "Pick a fruit"); const char *items[] = { "Apple", "Banana", "Cherry" }; meow_dialog_set_items(g_dlg, items, 3, 1); g_sheet = meow_sheet_create("Options", 0); meow_sheet_add_item(g_sheet, "Copy"); meow_sheet_add_item(g_sheet, "Delete"); meow_sheet_add_item(g_sheet, "Share"); /* 建三页 view(on_create 建各自控件/状态)+ 弹层实例 */ g_home_view = home_view_create(); g_full_view = full_view_create(); g_demo_view = demo_view_create(); /* 进入根页(activity_push + home on_enter → home_redraw) */ meow_view_page_push(ACT_HOME); meow_ui_events ev = { app_on_key, app_on_tap, app_on_swipe, app_on_tick, app_on_swipe_progress, app_on_touch_down, app_on_touch_move }; meow_ui_run(&ev); /* 清理:meow_view_free 触发各页 on_destroy(home 控件 / demo 内容+chrome) */ meow_view_free(g_full_view); meow_view_free(g_demo_view); meow_view_free(g_home_view); meow_dialog_free(g_dlg); meow_sheet_free(g_sheet); meow_ui_shutdown(); meow_log(MEOW_LOG_INFO, "exit"); return 0; }