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

+69
View File
@@ -50,3 +50,72 @@ int meow_ui_vol_read(const char *path, const char *key, int def)
while (*found == ' ' || *found == '\t') found++; /* value 左去空白;atoi 天然停于非数字 */
return atoi(found);
}
/* 改 settings.conf 一个 int 键:流式拷贝原文件到 <path>.tmp,命中键行改写为
* "key = value"(launcher 落盘格式,带空格),键缺失则末尾追加;rename 原子替换。
* 保留其余行(注释/其它设置)——绝不 O_TRUNC 整文件。 */
int meow_ui_vol_set(const char *path, const char *key, int val)
{
if (!path || !path[0] || !key || !key[0]) return -1;
FILE *in = fopen(path, "r");
char tmp[512];
int kl = (int)strlen(key);
snprintf(tmp, sizeof tmp, "%s.tmp", path);
FILE *out = fopen(tmp, "w");
if (!out) { if (in) fclose(in); return -1; }
int found = 0;
char line[256];
while (in && fgets(line, sizeof line, in)) {
char *eq = strchr(line, '=');
char *k = line;
while (*k == ' ' || *k == '\t') k++;
int n = eq ? (int)(eq - k) : 0;
while (n > 0 && (k[n-1] == ' ' || k[n-1] == '\t')) n--;
if (eq && n == kl && strncmp(k, key, (size_t)kl) == 0) {
fprintf(out, "%s = %d\n", key, val); /* 命中:改写为规范格式 */
found = 1;
} else {
fputs(line, out); /* 其它行原样保留 */
}
}
if (in) fclose(in);
if (!found) fprintf(out, "%s = %d\n", key, val);
fclose(out);
if (rename(tmp, path) != 0) { remove(tmp); return -1; }
return 0;
}
/* 音量步进(系统语义,与 launcher 设置页/watchdog 同源:volume_step/volume_max 约束)。
* 只做 settings 逻辑 + 持久化;DAC 写入由调用方(meow_ui_vol_dac_write)负责。 */
int meow_ui_vol_step(const char *path, int dir)
{
int vol = meow_ui_vol_read(path, "audio.volume", MEOW_UI_VOL_DEFAULT);
int vol_max= meow_ui_vol_read(path, "audio.volume_max", MEOW_UI_VOL_MAX_DEF);
int step = meow_ui_vol_read(path, "audio.volume_step", 1);
if (step < 1) step = 1;
if (step > 5) step = 5; /* 与 watchdog 读取口径一致(1..5) */
if (dir < 0) dir = -1;
else if (dir > 0) dir = 1;
else return vol;
int v = meow_ui_vol_clamp(vol + dir * step, vol_max);
if (v == vol) return vol; /* 已在上下限:无进展,不写 */
meow_ui_vol_set(path, "audio.volume", v);
return v;
}
/* 真实 DAC 音量(CS43198, numid 1/2, 0-255),pct→255 映射直写两声道。
* 与 launcher meow_dac_vol_write / watchdog wd_vol_write 完全同路径(语义同源)。 */
void meow_ui_vol_dac_write(int pct)
{
int dac = pct * 255 / 100;
if (dac < 0) dac = 0;
if (dac > 255) dac = 255;
char cmd[160];
snprintf(cmd, sizeof cmd,
"amixer -c 0 cset numid=1 %d >/dev/null 2>&1; amixer -c 0 cset numid=2 %d >/dev/null 2>&1",
dac, dac);
system(cmd);
}