feat(sdk): 绘制期通用clip + view递归/on_event接线 (agent-195) — ①栈式clip rect(g_clip_stack[16]), 所有写像素原语过clip, meow_widget_draw push/pop控件矩形(含W_CUSTOM, 根治越界脏区), IME/模态顶层全屏不受影响 ②view enter/leave递归children + meow_view_dispatch_event(z降序子>父命中即消费); hello App层显式驱动退役
meow_ui.a→da4d3a7d; hello→c655ba43; 宿主4套件全PASS(含clip越界断言+view递归断言) 出入: W_SLIDER拇指在max处被裁(既有几何瑕疵可见化,待修); on_draw祖先已进入即画
This commit is contained in:
1 parent
b2e7cc8c70
commit
32a6a8ed1e
14 files changed
+257
-44
No files matched your search
+12
-12
@@ -5,9 +5,9 @@
|
||||
* fopen/fprintf),重复、易错、无分离/级别。本文件实现 SDK 统一 meow_log():
|
||||
*
|
||||
* - app 一行调用 meow_log(MEOW_LOG_INFO, "start")(见 meow_ui.h);
|
||||
* - SDK 启动时读 env:MEOW_LOG_DIR(日志目录)、MEOW_LOG_APP(app_id,无则 "app")、
|
||||
* MEOW_LOG_LEVEL(本 app 级别,无则默认 INFO)→ 写
|
||||
* `<log_dir>/apps/<app_id>/logs/<启动时间>_<pid>[._<n>].log`(目录自动 mkdir -p),
|
||||
* - SDK 启动时读 env:MEOW_LOG_DIR(日志目录,launcher 已注入到 logs/<app_id>,含 app 分层)、
|
||||
* MEOW_LOG_APP(app_id,无则 "app")、MEOW_LOG_LEVEL(本 app 级别,无则默认 INFO)→ 写
|
||||
* `<log_dir>/<启动时间>_<pid>[._<n>].log`(目录自动 mkdir -p),
|
||||
* 按 app 分目录 + 每次启动新文件(不同启动=不同文件,同一次启动内 O_APPEND 追加),
|
||||
* 级别过滤(lvl < level 丢弃);
|
||||
* - 格式:`<monotonic_ms> [<app_id>] <LEVEL> message\n`(meow_ui_time_ms() 取毫秒);
|
||||
@@ -57,8 +57,8 @@ static char g_app_id[64] = "app"; /* env MEOW_LOG_APP,无则 "app" */
|
||||
static char g_log_dir[256] = ""; /* env MEOW_LOG_DIR,无/空则降级 stdio */
|
||||
static meow_log_level g_level = MEOW_LOG_INFO; /* 默认 INFO */
|
||||
|
||||
/* M2.52:日志文件为 `<log_dir>/apps/<app_id>/logs/<ts>_<pid>[._<n>].log`。
|
||||
* g_log_base 存不含序号后缀的路径前缀 `<dir>/apps/<app>/logs/<ts>_<pid>`;
|
||||
/* M2.52:日志文件为 `<log_dir>/<ts>_<pid>[._<n>].log`;M2.x 简化后 MEOW_LOG_DIR 已含 app 分层
|
||||
* (launcher 注入 logs/<app_id>)。g_log_base 存不含序号后缀的路径前缀 `<dir>/<ts>_<pid>`;
|
||||
* g_log_seq 为轮转序号(0=首个文件无后缀;>0 追加 `_<n>`)。两者均在 log_init()
|
||||
* (pthread_once 那次)里生成一次。 */
|
||||
static char g_log_base[384] = "";
|
||||
@@ -93,7 +93,7 @@ static void log_init(void)
|
||||
s = getenv("MEOW_LOG_DIR");
|
||||
if (s && s[0]) snprintf(g_log_dir, sizeof g_log_dir, "%s", s);
|
||||
|
||||
/* M2.52:构建完整前缀 `<log_dir>/apps/<app_id>/logs/<ts>_<pid>`。
|
||||
/* M2.52:构建完整前缀 `<log_dir>/<ts>_<pid>`(M2.x 简化:MEOW_LOG_DIR 已含 app 分层)。
|
||||
* ts 用 localtime 的 %Y%m%d_%H%M%S(启动时刻);尾拼 _<pid> 防同秒重复启动撞名,
|
||||
* 从而每次启动=新文件,同一次启动内 O_APPEND 追加。若 log_dir 为空(无卡)
|
||||
* 则跳过(log_open 降级 stderr)。 */
|
||||
@@ -103,8 +103,8 @@ static void log_init(void)
|
||||
struct tm tmnow;
|
||||
localtime_r(&now, &tmnow);
|
||||
strftime(ts, sizeof ts, "%Y%m%d_%H%M%S", &tmnow);
|
||||
snprintf(g_log_base, sizeof g_log_base, "%s/apps/%s/logs/%s_%d",
|
||||
g_log_dir, g_app_id, ts, (int)getpid());
|
||||
snprintf(g_log_base, sizeof g_log_base, "%s/%s_%d",
|
||||
g_log_dir, ts, (int)getpid());
|
||||
log_rebuild_file();
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ static int log_mkdir_p(const char *path)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* M2.52:对 `<log_dir>/apps/<app_id>/logs` 增量 mkdir -p,并打开 g_log_file
|
||||
/* M2.52:对 `<log_dir>`(M2.x 简化后已含 app 分层)增量 mkdir -p,并打开 g_log_file
|
||||
* (O_APPEND|O_CREAT;同一次启动内追加,不同启动=不同文件)。失败置 g_log_fallback。
|
||||
* 首次由 meow_log 经 g_log_open_tried 守卫调用;轮转后由 meow_log 再次调用(目录已存在,
|
||||
* mkdir_p 幂等)。仅在持有 g_log_mu 时调用(g_log_base 已构建)。 */
|
||||
@@ -146,7 +146,7 @@ static void log_open(void)
|
||||
{
|
||||
char logs[512];
|
||||
if (!g_log_dir[0] || !g_log_file[0]) { g_log_fallback = 1; return; }
|
||||
if (snprintf(logs, sizeof logs, "%s/apps/%s/logs", g_log_dir, g_app_id) >= (int)sizeof logs) {
|
||||
if (snprintf(logs, sizeof logs, "%s", g_log_dir) >= (int)sizeof logs) {
|
||||
g_log_fallback = 1; return;
|
||||
}
|
||||
if (log_mkdir_p(logs) != 0) { g_log_fallback = 1; return; }
|
||||
@@ -165,7 +165,7 @@ static int log_spill_cmp(const void *a, const void *b)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 每 App 总量清理:扫描 `<log_dir>/apps/<app_id>/logs/` 下所有 .log(跳过当前正写的
|
||||
/* 每 App 总量清理:扫描 `<log_dir>/`(M2.x 简化后已含 app 分层)下所有 .log(跳过当前正写的
|
||||
* g_log_file),累计大小,超过 MEOW_LOG_TOTAL_MAX 则按 mtime 从最旧删到 ≤ 阈值。
|
||||
* 只规整本 App 目录(进程隔离),节流调用(见 meow_log)。仅在持有 g_log_mu 时调用。 */
|
||||
static void log_cleanup_old(void)
|
||||
@@ -178,7 +178,7 @@ static void log_cleanup_old(void)
|
||||
long total = 0;
|
||||
|
||||
if (!g_log_dir[0] || !g_log_file[0]) return;
|
||||
if (snprintf(logs, sizeof logs, "%s/apps/%s/logs", g_log_dir, g_app_id)
|
||||
if (snprintf(logs, sizeof logs, "%s", g_log_dir)
|
||||
>= (int)sizeof logs) return;
|
||||
d = opendir(logs);
|
||||
if (!d) return;
|
||||
|
||||
Reference in new issue
Block a user