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

+123
View File
@@ -0,0 +1,123 @@
/*
* test_sdk_input_keys.c — M2.55 宿主验证:SDK 输入层接管系统按键语义(App 前台也生效)。
*
* 覆盖(直接调输入层语义函数,等效"模拟按键事件"):
* K1 音量 +/step:audio.volume 迈一步(volume_step 约束),settings.conf 落到值改变;
* K2 音量 ± clamp:volume_max 软上限、0 下限、硬上限 100;到限不再写;
* K3 保留其它键:改 audio.volume 不整文件 O_TRUNC(display.brightness/注释保留);
* K4 媒体键本地回调:注册 playctl 回调后,sys_key(上一曲/下一曲/播放暂停) → 回调 cmd 正确
* (播放/暂停按最近上报 state 切换:播放中→暂停(2),暂停/停止→播放(1));
* K5 媒体键 IPC 兜底:未注册回调(g_cb==NULL)→ 走 IPC 发 launcher(无 socket → 静默不崩)。
*
* 编译(宿主 gcc,仅链 vol/media 两个 TU;无需 meow_ui 其它子系统):
* gcc -Wall -Wextra -pthread -o test_sdk_input_keys test_sdk_input_keys.c \
* meow_ui_vol.c meow_ui_media.c -I. -I../meow_launcherd
*/
#include "meow_ui_vol.h"
#include "meow_ui_media.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
static int failures = 0;
static void check(const char *name, int cond)
{
printf("%s %s\n", cond ? "PASS" : "FAIL", name);
if (!cond) failures++;
}
static char g_path[64];
static void wfile(const char *content)
{
FILE *f = fopen(g_path, "w");
if (!f) { perror("fopen"); exit(2); }
fputs(content, f);
fclose(f);
}
static int vol_in_file(void)
{
return meow_ui_vol_read(g_path, "audio.volume", -1);
}
/* —— 媒体回调捕获 —— */
static int cb_calls = 0, cb_cmd = 0;
static int64_t cb_seek = 0;
static void playctl_cb(int cmd, int64_t seek_ms)
{ cb_calls++; cb_cmd = cmd; cb_seek = seek_ms; }
int main(void)
{
snprintf(g_path, sizeof g_path, "/tmp/meow_kb_%d.conf", (int)getpid());
char sock[64]; /* 指向不存在路径:让 IPC 兜底路径确定性静默失败 */
snprintf(sock, sizeof sock, "/tmp/meow_kb_%d.sock", (int)getpid());
setenv("MEOW_IPC_SOCK", sock, 1);
/* ---- K1 音量迈一步(volume_step=1 默认)---- */
wfile("audio.volume = 60\naudio.volume_max = 100\naudio.volume_step = 1\n");
check("K1 vol 60 +1 -> 61", meow_ui_vol_step(g_path, +1) == 61);
check("K1 settings.conf 落到 61", vol_in_file() == 61);
check("K1 vol 61 -1 -> 60", meow_ui_vol_step(g_path, -1) == 60);
check("K1 settings.conf 回到 60", vol_in_file() == 60);
/* ---- K2 步进 volume_step=4 + clamp ---- */
wfile("audio.volume = 60\naudio.volume_max = 100\naudio.volume_step = 4\n");
check("K2 step=4: 60 +1 -> 64", meow_ui_vol_step(g_path, +1) == 64);
wfile("audio.volume = 99\naudio.volume_max = 100\naudio.volume_step = 4\n");
check("K2 step=4: 99 +1 -> 100 (硬上限)", meow_ui_vol_step(g_path, +1) == 100);
/* volume_max 软上限 */
wfile("audio.volume = 60\naudio.volume_max = 55\naudio.volume_step = 1\n");
meow_ui_vol_step(g_path, +1);
check("K2 volume_max=55: vol -> 55 (clamp 上限)", vol_in_file() == 55);
/* 到上限不再写 */
wfile("audio.volume = 100\naudio.volume_max = 100\naudio.volume_step = 1\n");
check("K2 at hard max: +1 -> 100 (no write)", meow_ui_vol_step(g_path, +1) == 100);
wfile("audio.volume = 0\naudio.volume_max = 100\naudio.volume_step = 1\n");
check("K2 at min: -1 -> 0 (no write)", meow_ui_vol_step(g_path, -1) == 0);
check("K2 at min settings 保持 0", vol_in_file() == 0);
/* ---- K3 保留其它键(不整文件 O_TRUNC)---- */
wfile("# meow-settings 1\ndisplay.brightness = 100\naudio.volume = 60\n");
meow_ui_vol_step(g_path, +1);
check("K3 vol 60 -> 61", vol_in_file() == 61);
check("K3 保留其它键 display.brightness=100",
meow_ui_vol_read(g_path, "display.brightness", -1) == 100);
/* ---- K5 媒体键 IPC 兜底:未注册回调 → 走 IPC(无 socket 静默不崩)---- */
cb_calls = 0;
meow_ui_media_sys_key(165); /* 上一曲:g_cb==NULL 走 IPC 兜底,不崩 */
check("K5 未注册回调不崩", cb_calls == 0);
/* ---- K4 媒体键本地回调:注册后按 cmd 分发 ---- */
meow_ui_media_on_playctl(playctl_cb);
meow_ui_media_sys_key(165); /* 上一曲 */
check("K4 上一曲(165) -> cb(3)", cb_calls == 1 && cb_cmd == 3 && cb_seek == 0);
meow_ui_media_sys_key(163); /* 下一曲 */
check("K4 下一曲(163) -> cb(4)", cb_calls == 2 && cb_cmd == 4);
meow_ui_media_sys_key(19); /* 旧码上一曲 */
check("K4 旧码(19) -> cb(3)", cb_calls == 3 && cb_cmd == 3);
/* 播放/暂停按最近上报 state 切换 */
meow_ui_media_meta(1, 0, 0, "t", "a", "al", NULL, NULL); /* state=PLAYING */
meow_ui_media_sys_key(164);
check("K4 播放中按播放/暂停 -> cb(2) 暂停", cb_calls == 4 && cb_cmd == 2);
meow_ui_media_meta(2, 0, 0, "t", "a", "al", NULL, NULL); /* state=PAUSED */
meow_ui_media_sys_key(164);
check("K4 暂停中按播放/暂停 -> cb(1) 播放", cb_calls == 5 && cb_cmd == 1);
meow_ui_media_meta(0, 0, 0, "t", "a", "al", NULL, NULL); /* state=STOPPED */
meow_ui_media_sys_key(164);
check("K4 停止中按播放/暂停 -> cb(1) 播放", cb_calls == 6 && cb_cmd == 1);
meow_ui_media_stop();
unlink(g_path);
unlink(sock);
printf("\n%s (%d failure%s)\n", failures ? "RESULT: FAIL" : "RESULT: PASS",
failures, failures == 1 ? "" : "s");
return failures ? 1 : 0;
}