fix(sdk+launcher): 图标不渲染真根因(agent-219) — meow_ui_img.c scale_buf cover 采样把乘写成除(÷缩放比→采到源图左上角透明区,全丢); 改乘+居中裁剪偏移修正; 宿主旧测试用纯色图掩盖了该bug。+ main_menu App退出/结构变化重绘时 fb_pan_buf0_force 无条件pan回buffer0(防App翻页留buffer1致菜单残帧)

meow_ui.a→3e0ee8f7 launcher→9d0efc2f hello→9609ea6e files→90f5cf07 ncm→be8be221(均已上卡); 真机截图证据 .tmp/meowbug/fix1.png+fix_b2_after.png
This commit is contained in:
MeowOS committed 2026-08-31 15:42:24 +08:00
1 parent 05a19a9ea3
commit ab4da09e75
45 files changed
+1926 -147

No files matched your search

+63 -1
View File
@@ -10,14 +10,74 @@
* 文本预览换页(push ACT_VIEWER)。退出=在根目录左滑或 SIGTERM(看门狗)。
*/
#include "files_internal.h"
#include "meow_notify_ipc.h" /* §6.2 二期:picker 结果经 MSG_PICKER_RESULT 回传 */
#include "meow_ipc.h"
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static meow_view *g_browser_view;
static meow_view *g_viewer_view;
static void on_sigterm(int s) { (void)s; meow_ui_request_exit(); }
/* ============================================================ */
/* §6.2 二期:picker 模式(launcher 注入 MEOW_PICKER_* → 选文件返回路径) */
/* ============================================================ */
static char g_picker_action[24];
static char g_picker_caller[MEOW_APP_ID_MAX];
static uint32_t g_picker_req_id;
static int g_picker_active;
int picker_active(void) { return g_picker_active; }
const char *picker_action(void) { return g_picker_action; }
uint32_t picker_req_id(void) { return g_picker_req_id; }
static void picker_init(void)
{
const char *a = getenv("MEOW_PICKER_ACTION");
if (!a || !a[0]) return;
snprintf(g_picker_action, sizeof g_picker_action, "%s", a);
g_picker_active = 1;
const char *c = getenv("MEOW_PICKER_CALLER");
if (c) snprintf(g_picker_caller, sizeof g_picker_caller, "%s", c);
const char *r = getenv("MEOW_PICKER_REQ_ID");
g_picker_req_id = r ? (uint32_t)atoi(r) : 0;
meow_log(MEOW_LOG_INFO, "picker: mode action=%s req=%u caller=%s",
g_picker_action, g_picker_req_id, g_picker_caller);
}
/* 选文件:发 MSG_PICKER_RESULT(OK+路径)+ 请求退出。best-effort(launcher 不在静默)。 */
void picker_return_file(const char *path)
{
m_picker_result_t r;
memset(&r, 0, sizeof r);
snprintf(r.caller, sizeof r.caller, "%s", g_picker_caller);
r.req_id = g_picker_req_id;
snprintf(r.action, sizeof r.action, "%s", g_picker_action);
r.code = MEOW_OK;
if (path) snprintf(r.value, sizeof r.value, "%s", path);
(void)meow_notify_ipc_send_raw(MSG_PICKER_RESULT, &r, (uint32_t)sizeof r, 1);
meow_log(MEOW_LOG_INFO, "picker: return path=%s", path ? path : "");
meow_ui_request_exit();
}
/* 取消:发 MSG_PICKER_RESULT(MEOW_ERR_NOENT+空值)+ 请求退出。 */
void picker_cancel(void)
{
m_picker_result_t r;
memset(&r, 0, sizeof r);
snprintf(r.caller, sizeof r.caller, "%s", g_picker_caller);
r.req_id = g_picker_req_id;
snprintf(r.action, sizeof r.action, "%s", g_picker_action);
r.code = MEOW_ERR_NOENT; /* 用户取消 */
(void)meow_notify_ipc_send_raw(MSG_PICKER_RESULT, &r, (uint32_t)sizeof r, 1);
meow_log(MEOW_LOG_INFO, "picker: cancel");
meow_ui_request_exit();
}
/* ============================================================ */
/* 事件分发:meow_ui_run 平铺回调 → 当前页 */
/* ============================================================ */
@@ -38,9 +98,10 @@ static void app_on_swipe(int dir, int dx, int dy)
{
(void)dx;
if (dir == MEOW_SWIPE_LEFT) {
/* 左缘返回:预览页→回目录;浏览器→上级目录;到根→退出 App。 */
/* 左缘返回:预览页→回目录;浏览器→上级目录;到根→退出 App(picker 模式则取消)。 */
if (viewer_is_active()) { meow_view_page_pop(); return; }
if (browser_is_active() && browser_go_up()) return;
if (picker_active()) { picker_cancel(); return; } /* §6.2 二期:根屏左滑=取消 picker */
meow_log(MEOW_LOG_INFO, "exit:swipe");
meow_ui_request_exit();
return;
@@ -88,6 +149,7 @@ int main(void)
meow_theme_add_listener(NULL);
signal(SIGTERM, on_sigterm);
picker_init(); /* §6.2 二期:读 MEOW_PICKER_* 决定是否进入 picker 模式 */
/* 建两页 view(on_create 建各自控件/状态 + 读卡扫首个目录) */
g_browser_view = browser_view_create();