• 全新单提交:清除含敏感信息的旧历史(sudo 口令、内网 IP、SSH 密钥路径、热点 SSID、设备 MAC) • 本地开发文档/测试记录/构建脚本全部移入 gitignored 的 devdocs/ 与 scripts/build/(不入库) • 保留:MeowOS 源码(launcher/watchdog/bootmenu/meow_svcd/SDK)、项目规范文档、mips-repo 增补组件:SDK 统一日志+通知 API、meow_svcd 服务管理器、mips-repo 软件仓库
120 lines
4.5 KiB
C
120 lines
4.5 KiB
C
/* hello.c — MeowOS SDK 版示例应用(链 meow_ui.a,B1)。
|
||
*
|
||
* 契约(MEOW_APP_SDK.md §1/§3/§6):应用只调 meow_ui API —— 屏幕(back_buf +
|
||
* flush 上屏)与输入(meow_ui_run 事件循环)由框架接管;不再 open/mmap/ioctl
|
||
* /dev/fb0、不再读 /dev/input/event*。本应用验证「清屏 + 画文本 + 画按钮 +
|
||
* 响应触摸」这一最小工作闭环。
|
||
*
|
||
* 交互:
|
||
* - 点按钮 → tap 计数 +1(按钮标签实时更新);
|
||
* - 左缘左滑(抬手触发)→ 请求退出(回应用列表);滑动过程顶部出现随位移增长的进度条;
|
||
* - 物理键 POWER 不再映射 exit(§3.4.1:物理键系统统一管理,电源键=纯息屏/亮屏);
|
||
* - 空闲时 on_tick 每秒刷新一行状态(含运行秒数)。
|
||
*
|
||
* 宿主/qemu 离屏:设 MEOW_UI_DUMP=<ppm 路径> 时,首帧 flush 即把 back_buf 写成
|
||
* PPM 截图供检查;设备上无副作用。
|
||
*
|
||
* Build(见 build_hello.sh):
|
||
* zig-mipsel-cc -Os -static hello.c meow_ui.a libz.a -lpthread -o hello
|
||
*/
|
||
#include "meow_ui.h"
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <signal.h>
|
||
#include <unistd.h>
|
||
#include <time.h>
|
||
|
||
static meow_widget *g_btn;
|
||
static int g_taps = 0;
|
||
static int g_secs = 0;
|
||
static char g_btn_label[32] = "TAP ME";
|
||
|
||
/* M2.51:统一日志改用 SDK meow_log()(按 app 分离 + 级别过滤 + 降级),
|
||
* 删除自造轮子的 hellolog()(自读 MEOW_LOG_DIR + snprintf + fopen/fprintf)。 */
|
||
static void on_sigterm(int s) { (void)s; meow_ui_request_exit(); }
|
||
|
||
static void redraw(void)
|
||
{
|
||
const meow_theme *th = meow_theme_get();
|
||
int sb = meow_ui_statusbar_height(); /* A-0 全局状态栏 inset:内容下移避免被盖 */
|
||
meow_ui_clear(th->bg);
|
||
meow_ui_text_center(240, sb + 8, "MEOWOS HELLO", 28, th->fg);
|
||
meow_ui_text_center(240, sb + 38, "SDK: meow_ui.a", 20, th->dim);
|
||
meow_widget_draw(g_btn);
|
||
char line[64];
|
||
snprintf(line, sizeof line, "taps=%d uptime=%ds", g_taps, g_secs);
|
||
meow_ui_text_center(240, 500, line, 20, th->dim);
|
||
meow_ui_text(20, 660, "left-swipe = exit", 20, th->dim);
|
||
meow_ui_flush();
|
||
}
|
||
|
||
static void on_tap(int x, int y)
|
||
{
|
||
if (meow_widget_hit(g_btn, x, y)) {
|
||
g_taps++;
|
||
snprintf(g_btn_label, sizeof g_btn_label, "TAPPED x%d", g_taps);
|
||
/* 重建按钮标签(release 旧控件,重新 create 保持几何) */
|
||
meow_widget_free(g_btn);
|
||
g_btn = meow_btn_create(120, 300, 240, 64, g_btn_label);
|
||
redraw();
|
||
}
|
||
}
|
||
|
||
static void on_key(int keycode, int is_down)
|
||
{
|
||
/* §3.4.1:物理键语义由系统统一管理,APP 禁映射(电源=息屏/亮屏、音量=调音量、播放=媒体)。
|
||
* 这里仅记录日志,不做任何 exit/confirm 行为。 */
|
||
(void)keycode; (void)is_down;
|
||
meow_log(MEOW_LOG_DEBUG, "key"); /* 不处理:SDK 内部消化系统键语义 */
|
||
}
|
||
|
||
static void on_swipe_progress(int x_start, int dx)
|
||
{
|
||
/* 左滑过程实时回调:SDK 已自动画顶部进度条;这里演示 app 侧接入(画同长度条,幂等——
|
||
* 长度=当前 X=x_start+dx,与 SDK 自动画一致,不会误清条)。
|
||
* 抬手达标时 SDK 清条 + 触发 on_swipe(LEFT)→退出。 */
|
||
meow_ui_swipe_hint(x_start + dx);
|
||
}
|
||
|
||
static void on_swipe(int dir, int dx, int dy)
|
||
{
|
||
(void)dx; (void)dy;
|
||
if (dir == MEOW_SWIPE_LEFT) { meow_log(MEOW_LOG_INFO, "exit:swipe"); meow_ui_request_exit(); }
|
||
}
|
||
|
||
static void on_tick(void)
|
||
{
|
||
/* 每秒刷新一次状态行(避免 16ms 高频重绘) */
|
||
static uint64_t last = 0;
|
||
uint64_t now = meow_ui_time_ms();
|
||
if (now - last >= 1000) {
|
||
last = now;
|
||
g_secs++;
|
||
redraw();
|
||
}
|
||
}
|
||
|
||
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; }
|
||
/* M2.46 不再强制 set_mode 深色——主题跟随系统 display.theme/theme_mode(manual/auto+时段),
|
||
* 与 launcher s_ui_theme() 判定对齐(meow_theme_get() 已读 settings.conf)。 */
|
||
meow_theme_add_listener(NULL); /* noop: 预留主题变化重绘 */
|
||
|
||
signal(SIGTERM, on_sigterm); /* 看门狗返回键 → 干净退出 */
|
||
|
||
g_btn = meow_btn_create(120, 300, 240, 64, g_btn_label);
|
||
redraw();
|
||
|
||
meow_ui_events ev = { on_key, on_tap, on_swipe, on_tick, on_swipe_progress };
|
||
meow_ui_run(&ev);
|
||
|
||
meow_widget_free(g_btn);
|
||
meow_ui_shutdown();
|
||
meow_log(MEOW_LOG_INFO, "exit");
|
||
return 0;
|
||
}
|