feat(launcher): 应用列表热重载 — 2s 轮询比对 MeowAPPs 目录签名(自身+各应用目录 mtime FNV 混合),变化即重扫刷新;常驻主界面推新包约 2s 内出现,不再需重启
This commit is contained in:
1 parent
563a9be1d6
commit
f50abae02a
1 file changed
+49
@@ -273,6 +273,32 @@ static int sim_exit_tap_done = 0;
|
||||
|
||||
|
||||
/* real menu loop */
|
||||
/* M2.77 应用列表热重载:MeowAPPs 目录签名(自身 + 各应用目录 mtime 的 FNV 混合),
|
||||
* run_menu 2s 轮询比对,变化即重扫——覆盖 SSH/面板推新包、删包、应用目录内容变动等场景
|
||||
* (此前仅「无卡→有卡」过渡才重扫,常驻主界面下推包不刷新)。 */
|
||||
static unsigned long long apps_dir_sig(void)
|
||||
{
|
||||
unsigned long long sig = 1469598103934665603ULL; /* FNV-1a offset */
|
||||
struct stat st;
|
||||
if (stat(MEOWAPPS, &st) != 0) return 0;
|
||||
sig ^= (unsigned long long)st.st_mtime; sig *= 1099511628211ULL;
|
||||
DIR *d = opendir(MEOWAPPS);
|
||||
if (d) {
|
||||
struct dirent *de;
|
||||
while ((de = readdir(d))) {
|
||||
if (de->d_name[0] == '.') continue;
|
||||
char p[300];
|
||||
snprintf(p, sizeof p, "%s/%s", MEOWAPPS, de->d_name);
|
||||
if (stat(p, &st) == 0 && S_ISDIR(st.st_mode)) {
|
||||
sig ^= (unsigned long long)st.st_mtime * 256 + (unsigned char)de->d_name[0];
|
||||
sig *= 1099511628211ULL;
|
||||
}
|
||||
}
|
||||
closedir(d);
|
||||
}
|
||||
return sig;
|
||||
}
|
||||
|
||||
static void run_menu(struct app apps[MAX_APPS], int napps, int state,
|
||||
long sim_tap_ms, long sim_exit_ms)
|
||||
{
|
||||
@@ -289,6 +315,7 @@ static void run_menu(struct app apps[MAX_APPS], int napps, int state,
|
||||
int had_player = 0; /* M2.2:菜单打开时是否存在存活播放器 */
|
||||
long sim_tap_done = 0, sim_exit_done = 0;
|
||||
long meow_last_poll = 0; /* M2.2:MeowOS 后台拔营(卡/网)轮询时间戳 */
|
||||
unsigned long long apps_sig = 0; /* M2.77:应用目录签名(0=未初始化,首圈建立基线) */
|
||||
|
||||
load_config(); /* meow.conf on the card: bg_color etc. */
|
||||
|
||||
@@ -502,6 +529,28 @@ static void run_menu(struct app apps[MAX_APPS], int napps, int state,
|
||||
}
|
||||
g_sys.sd_mounted = 1;
|
||||
log_poll_card();
|
||||
/* M2.77 应用列表热重载:目录签名变化(推新包/删包/应用目录变动)→ 重扫刷新。
|
||||
* 与上面「无卡→有卡」过渡重扫互补:常驻主界面下目录内容变化也覆盖。 */
|
||||
{
|
||||
unsigned long long asig = apps_dir_sig();
|
||||
if (apps_sig && asig && asig != apps_sig) {
|
||||
struct app fresh[MAX_APPS];
|
||||
int fn = scan_apps(fresh);
|
||||
int fstate = (fn < 0) ? (fn == -1 ? 1 : 2) : (fn == 0 ? 2 : 0);
|
||||
if (fstate == 0 && fn > 0) {
|
||||
memcpy(apps, fresh, sizeof fresh);
|
||||
napps = fn; state = 0;
|
||||
if (cursor >= napps) cursor = napps - 1;
|
||||
dirty = 1;
|
||||
logmsg("hot-reload: MeowAPPs changed -> %d apps", napps);
|
||||
} else if (fstate != state) {
|
||||
state = fstate; napps = (fn > 0) ? fn : 0;
|
||||
dirty = 1;
|
||||
logmsg("hot-reload: state -> %d", state);
|
||||
}
|
||||
}
|
||||
apps_sig = asig;
|
||||
}
|
||||
} else if (!sd_mounted()) {
|
||||
/* 卡在但未挂载(正挂载/失败):保持当前显示不误判;不崩。 */
|
||||
g_sys.sd_mounted = 0;
|
||||
|
||||
Reference in new issue
Block a user