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:
1 parent
05a19a9ea3
commit
ab4da09e75
45 files changed
+1926
-147
No files matched your search
@@ -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();
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"name":"Files","exec":"/usr/data/mnt/sd_0/MeowAPPs/os.meow.files/files","package":"os.meow.files","version":"0.1","framework":1,"immersive":1,"author":"MeowOS"}
|
||||
{"name":"Files","exec":"/usr/data/mnt/sd_0/MeowAPPs/os.meow.files/files","package":"os.meow.files","version":"0.1","framework":1,"immersive":1,"author":"MeowOS","route.pick":"pick","picker.pick_file":"pick"}
|
||||
@@ -9,7 +9,7 @@ cd "$(dirname "$0")"
|
||||
ROOT="$HOME/Project/R3ProII"
|
||||
CC="$ROOT/.tools/zig-mipsel-cc"
|
||||
SYSROOT="$ROOT/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf"
|
||||
"$CC" -Os -static -Wall -Wextra -I../sdk -I. \
|
||||
"$CC" -Os -static -Wall -Wextra -I../sdk -I../meow_launcherd -I. \
|
||||
app.c ui/browser.c ui/viewer.c ui/common/chrome.c logic/fsx.c \
|
||||
../sdk/meow_ui.a "$SYSROOT/lib/libz.a" -lpthread -o files
|
||||
ls -la files
|
||||
|
||||
Binary file not shown.
@@ -23,6 +23,16 @@
|
||||
#define ACT_BROWSER 0
|
||||
#define ACT_VIEWER 1
|
||||
|
||||
/* ---- picker 模式(AMSD_DESIGN §6.2 二期)----
|
||||
* launcher 注入 MEOW_PICKER_ACTION/REQ_ID/CALLER(amsd `am picker` 路由到本 App)。
|
||||
* 非空 ACTION → 本 App 进入「选文件」picker 模式:浏览目录、点文件=返回路径(经
|
||||
* MSG_PICKER_RESULT 发回 launcher→amsd)+ 退出;返回/左滑退出=取消。 */
|
||||
int picker_active(void); /* 1=进入 picker 模式(MEOW_PICKER_ACTION 非空) */
|
||||
const char *picker_action(void);
|
||||
uint32_t picker_req_id(void);
|
||||
void picker_return_file(const char *path); /* 选文件:发 MSG_PICKER_RESULT + 请求退出 */
|
||||
void picker_cancel(void); /* 取消:发 code=MEOW_ERR_NOENT + 请求退出 */
|
||||
|
||||
/* ---- 布局 ---- */
|
||||
#define APP_W 480
|
||||
#define APP_H 720
|
||||
|
||||
@@ -322,10 +322,12 @@ int browser_on_tap(int x, int y)
|
||||
int row = meow_listview_hit(g_list, x, y); /* 行号(含滚动换算;禁用行 -1) */
|
||||
if (row < 0) { browser_drag_reset(); return 1; } /* 命中列表但无有效行(空隙) */
|
||||
int op = meow_listview_hit_op(g_list, x, y); /* 行右 1/3 = 操作区 */
|
||||
if (op) browser_open_sheet(row);
|
||||
else {
|
||||
if (op) {
|
||||
if (!picker_active()) browser_open_sheet(row); /* §6.2 二期:picker 模式不弹 sheet */
|
||||
} else {
|
||||
fsx_entry *e = &g_entries[row];
|
||||
if (e->is_dir) browser_enter_dir(e->path);
|
||||
else if (picker_active()) picker_return_file(e->path); /* picker:点文件=返回路径 */
|
||||
else browser_open_file(e->path);
|
||||
}
|
||||
browser_drag_reset();
|
||||
@@ -389,6 +391,7 @@ void browser_swipe(int dir, int dist)
|
||||
* TAP(不再触发行体/打开动作),故这里无需再吞后续 tap;打开前清按下高亮与拖动态。 */
|
||||
void browser_on_long_press(int x, int y)
|
||||
{
|
||||
if (picker_active()) return; /* §6.2 二期:picker 模式无长按 BottomSheet */
|
||||
if (g_err != 0 || g_n == 0) return;
|
||||
if (!meow_widget_hit(g_list, x, y)) return;
|
||||
int row = meow_listview_hit(g_list, x, y);
|
||||
@@ -410,7 +413,11 @@ static void browser_page_create(meow_view *v, void *ctx)
|
||||
if (r_list.h < 0) r_list.h = 0;
|
||||
strncpy(g_cur, FSX_SD_ROOT, sizeof g_cur - 1);
|
||||
g_cur[sizeof g_cur - 1] = '\0';
|
||||
g_tb = app_topbar_create("Files", 1, "NEW");
|
||||
/* §6.2 二期:picker 模式 topbar 标题「Pick a file」且无 NEW 动作(点文件即选)。 */
|
||||
if (picker_active())
|
||||
g_tb = app_topbar_create("Pick a file", 1, NULL);
|
||||
else
|
||||
g_tb = app_topbar_create("Files", 1, "NEW");
|
||||
/* 结构化列表:行数据源 browser_src2;单选模式(行高亮用 selected,§5.8.3) */
|
||||
g_list = meow_listview_create(r_list.x, r_list.y, r_list.w, r_list.h, 0,
|
||||
browser_src2, NULL, MEOW_LIST_SEL_SINGLE);
|
||||
|
||||
Reference in new issue
Block a user