Files
MeowOS-For-R3P2/patch_v2/meow_launcherd/meow_launcher_internal.h
T

874 lines
47 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* meow_launcher_internal.h — MeowOS launcher 拆分模块共享内部头(LAUNCHER_SPLIT_PLAN). */
/* 只收“被 2 个以上模块引用”的声明;单一模块自含的不上此头。逻辑与原 meow_launcherd.c 0-diff。*/
#ifndef MEOW_LAUNCHER_INTERNAL_H
#define MEOW_LAUNCHER_INTERNAL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <dirent.h>
#include <stdint.h>
#include <time.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <poll.h> /* 0-warning:musl 把 <sys/poll.h> 重定向到 <poll.h>,用后者消除 -W#warnings */
#include "meow_touch.h" /* M2.25:Launcher 统一触摸接口(电源菜单/确认框复用) */
#include "pm_icons.h" /* M2.32:Material Symbols rounded 图标(电源菜单圆钮,alpha 位图+主题色) */
#include "sb_icons.h" /* MD3 状态栏/通知中心图标(Material Symbols rounded,32x32 单通道 alpha) */
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/syscall.h> /* Bug 2:直连 reboot(2) syscall 用 */
#include <pthread.h> /* M0:IPC 线程 */
#include <sys/eventfd.h> /* M0:IPC→主循环唤醒(EFD_NONBLOCK) */
#include <sys/socket.h> /* M0:AF_UNIX IPC */
#include <sys/un.h> /* M0:sockaddr_un */
#include <linux/input.h>
#include "meow_font.h" /* M2.6: 预渲染位图字体(agent-28 交付;对象已打包进 meow_ui.a,launcher 不再单独链 meow_font.a) */
#include "meow_ipc.h" /* M0+M1:IPC 协议帧/消息/负载定(与 meow_ipc 工具同源) */
#include "meow_settings.h" /* B2a:统一系统设置后端(SYSTEM_SETTINGS.md §3/MEOWOS_API §2) */
#include "meow_notif.h" /* M2a:通知存储 + 分发(NOTIFICATION_SYSTEM.md §4/§7/§8) */
#include "meow_media.h" /* 阶段D附录B:媒体会话注册表(MSG_META/MSG_PLAYCTL/最近活跃源) */
#include "meow_bgplay.h" /* M4:后台播放保活 + 无头后台服务运行时表(§9) */
#include "meow_ui.h" /* A-1/A-2:launcher 用 SDK 渲染栈(meow_ui_fill_rect/text/flush/theme) */
#include "meow_ui_internal.h" /* A-1/A-2:launcher 与 SDK 共用 back_buf + 手动脏模型桥接(mark_full/back_buf) */
#include "meow_notif_panel.h" /* 阶段B:通知中心面板纯逻辑(header-only,可单测) */
#include "lock_screen.h" /* M2.x:锁屏 4 位 PIN 纯逻辑(设置/校验/错5锁定持久化/panel.pin 迁移/唤醒判定) */
/* M7.0b 文案抽取(SDK meow_str i18n 雏形):`meow_str(id)` 在 id 未进内嵌表(且无 TF 覆盖表)
* 时原样返回含'.'的 id —— 系统 UI 硬编码中文案经本辅助抽取,未知 id 回退 `zh` 兜底,保证默认
* 中文不被裸 id 顶替;其 en/自定义文案可由 TF `strings/<locale>.txt` 覆盖表或后续并入 SDK 内嵌表补齐。
* 注:static inline 不跨 TU 产生未用告警(GCC 忽略 `unused static inline`)。 */
static inline const char *meow_str_zh(const char *id, const char *zh)
{
const char *s = meow_str(id);
return (s && s[0] && !strchr(s, '.')) ? s : zh;
}
#define DEV_POWER "/dev/input/event0" /* md-gpio-keys: KEY_POWER, KEY_PREVIOUS */
#define DEV_KEYS "/dev/input/event2" /* jz adc keyboard: VOL, PLAY, NEXT */
#define DEV_TOUCH "/dev/input/event1" /* goodix-ts (not grabbed, shareable) */
#define MEOWAPPS "/usr/data/mnt/sd_0/MeowAPPs"
#define LOG_DIR_CARD "/usr/data/mnt/sd_0/MeowOS/logs" /* TF card logs(系统约定:系统文件放 MeowOS/ 下) */
#define PID_PATH "/usr/data/meow_launcherd.pid"
#define WATCHDOG1 "/usr/data/meow_watchdog"
#define WATCHDOG2 "/usr/bin/meow_watchdog"
#define POWMENU_MARKER "/tmp/meow_power_menu"
#define POWMENU_ACTIVE "/tmp/meow_power_menu_active"
/* §10.5:launcher 展开通知中心叠加会话的让位标记(App 前台;同 /tmp/meow_power_menu_active 语义,
* 让 watchdog 对电源长按让位——当前 watchdog 只认 POWMENU_ACTIVE,故叠加会话期间同时写它,见 app_launcher.c) */
#define NOTIF_ACTIVE "/tmp/meow_notif_active"
#define BACKLIGHT "/sys/class/backlight/backlight_pwm0/brightness"
#define BACKLIGHT_POWER "/sys/class/backlight/backlight_pwm0/bl_power"
#define FB_DEV "/dev/fb0"
#define MOUNTS "/proc/mounts"
#ifndef KEY_POWER
#define KEY_POWER 116
#endif
#ifndef KEY_PREVIOUSSONG
#define KEY_PREVIOUSSONG 165
#endif
#ifndef KEY_VOLUMEDOWN
#define KEY_VOLUMEDOWN 114
#endif
#ifndef KEY_VOLUMEUP
#define KEY_VOLUMEUP 115
#endif
#ifndef KEY_PLAYPAUSE
#define KEY_PLAYPAUSE 164
#endif
#ifndef KEY_NEXT
#define KEY_NEXT 163
#endif
#define SEQ_DEFAULT_TAPS 3 /* default hotkey: VOL_UP x3 quick taps */
#define POLL_MS 10
#define MEOWOS_VERSION "dev" /* M2.50:版本号唯一来源 = /etc/meowos_version(运行时 load_meowos_version 读);本宏仅作文件缺失时占位,不再当实际版本,升级只改 /etc/meowos_version */
#define MAX_APPS 8
#define TOAST_MS 1500
#define LOG_SIZE_LIMIT (1u << 30) /* 1 GB total on the TF card */
#define MEOW_MAX_ACTS 16
#define MEOW_MAX_ROUTES 8
#define MEOW_MAX_SVCS 8
#define BTN_TOUCH 0x14a
#define ABS_X 0x00
#define ABS_Y 0x01
#define ABS_MT_POSITION_X 0x35
#define ABS_MT_POSITION_Y 0x36
#ifndef EV_KEY
#define EV_KEY 1
#endif
#ifndef EV_ABS
#define EV_ABS 3
#endif
#ifndef EVIOCGKEY
#define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len)
#endif
#define KEYBUF_WORDS 32 /* 1024 bits, covers KEY_MAX 767 */
#define BOOT_BUF_TMP "/tmp/meow_boot.log"
#define BOOT_BUF_MAX (256 * 1024)
#define FBIOGET_VSCREENINFO 0x4600
#define FBIOGET_FSCREENINFO 0x4602
#define FBIOPAN_DISPLAY 0x4606
#define FBIOBLANK 0x4611
#define FBIO_WAITFORVSYNC 0x4620
#define KEY_DEBOUNCE_MS 40 /* 键值须稳定此毫秒数才认可(抗 ADC 抖动) */
#define CLICK_MS 400 /* 按压 <此毫秒 = 单击一次;≥ = 长按(连续) */
#define SCREEN_OFF_TIMEOUT_DEFAULT 30
#define SCREEN_OFF_MODE_DEFAULT 0 /* 0=panel, 1=black */
#define PWR_MENU_MS_DEFAULT 3000
#define PWR_FORCE_MS_DEFAULT 8000
#define REFRESH_RATE_CFG_DEFAULT 60
#define UI_FONT_PNG_CARD "/usr/data/mnt/sd_0/MeowOS/fonts/default/regular/font.png"
#define UI_FONT_IDX_CARD "/usr/data/mnt/sd_0/MeowOS/fonts/default/regular/font.idx"
#define UI_FONT_PNG_SYS "/usr/share/meowos/font/font.png"
#define UI_FONT_IDX_SYS "/usr/share/meowos/font/font.idx"
#define MEOW_FONTS_CFG "MeowOS/fonts"
/* 字体 preset 上限(FONT_SYSTEM 三级定案后按 (family,weight,tier) 一套一 preset):
* 1 默认 + 卡内各套(如 source_han_sans_cn:7 字重 common + regular/medium/bold gbk = 10 套,
* 叠加既有 6 套 + 后续多语言/多档位余量)。静态有界、非堆,全数组 BSS 约 36KB,可接受。
* 注:SDK meow_font.c MEOW_FONT_INDEX_MAX=32 读 index 时取前 32 条(sdk/ 并行作业,未同步改)。 */
#define FONT_PRESETS_MAX 64
#define ROW_H 52
#define ROW_TOP 96
#define EXIT_ROW 640
#define TOAST_Y 590
#define HOTKEY_MODE_PWRVOL 0
#define HOTKEY_MODE_SEQ 1
#define HK_PWRWIN_MIN 60 /* min power-hold time before VOL_DOWN counts */
#define HK_PWRWIN_MAX 2500 /* max power-hold window; beyond this no trig */
#define MAX_SEQ_LEN 6
#define MEOW_VOL_MAX 100 /* 硬上限 0-100 */
#define MEOW_VOL_DEFAULT 60 /* 默认音量 */
#define MEOW_VOL_STEP_DEFAULT 1 /* 默认跳步 1%(线性渐变;可配 audio.volume_step 1-5) */
#define MEOW_VOL_STEP_MAX 5 /* 跳步上限(SYSTEM_SETTINGS.md:最大 5) */
#define MEOW_VOL_MAX_DEFAULT 100 /* 默认最大音量上限(尊重上限;可配 audio.volume_max) */
#define VOL_DRAG_DAC_MS 60 /* 滑条拖动期间两次真实 DAC 写入的最短墙钟间隔 */
#define VOL_RAMP_MS 15 /* 每 1% 步进的最短墙钟间隔 */
#define VOL_RAMP_MAX_MS 3000 /* ramp 总时长上限(防 ADC 噪声假按住一次打满;正常长按到上限 <3s) */
#define JACK_POLL_MS 1000 /* 插孔状态节流读取间隔(绝不在 10ms 热路径每圈读文件) */
#define JACK_DEBOUNCE_MS 800 /* 插孔变化后忽略音量键边沿的窗口(插拔时没人按音量,误伤可忽略) */
#define BT_ROLE_OFF 0 /* 关 */
#define BT_ROLE_ON_NO_CONN 1 /* 开未连接 */
#define BT_ROLE_MASTER 2 /* 主模式:连了外围(如耳机) */
#define BT_ROLE_SLAVE 3 /* 从模式:被远端接入,设备自身当耳机 */
#define BT_ROLE_UNKNOWN (-1) /* 判定失败(调用方按实际态兜底) */
#define MEOWOS_VERSION_FILE "/etc/meowos_version"
#define MEOWOS_VERSION_DEF MEOWOS_VERSION /* 兜底默认 = 编译期宏;运行时读 /etc/meowos_version 覆盖 */
#define WIFI_LVL_UNKNOWN (-1000) /* wifi_signal_level 读取失败哨兵(低于任何真实 dBm) */
#define SB_BAR_Y 0
#define SB_BAR_H 28 /* rows 0..27;分隔线在 y=28 不在此(40→28,用户定) */
#define SB_FONT 20 /* 状态栏字体 28→20(28px 栏放不下 28 号;垂直居中锚点见 sb_text_y) */
#define MEOW_SBAR_ANIM_MS 200 /* App 前台全屏/收合切换的顶条「上移出屏」过渡时长(ms,agent-146) */
#define THEME_MODE_MANUAL 0 /* display.theme_mode 枚举索引 0 = 手动 */
#define THEME_MODE_AUTO 1 /* display.theme_mode 枚举索引 1 = 时段自动 */
#define SB_TGAP 6 /* 图标右缘 ↔ 文字间隙 */
#define SB_XGAP 10 /* 相邻两项(右→左)间隙 */
#define SB_ICON_INK 16 /* 主图标目标 ink 高(px):24→16(28px 栏等比缩放,留上下边距) */
#define SB_CLK_MARGIN 14 /* 右簇左缘相对时钟右缘须留出的安全间距 */
#define SB_ICON_CY 14
#define MENU_SWIPE_THRESH 65 /* px:抬手位移 >= 阈值判为滑动,不启动行(同 SDK SWIPE_THRESH) */
#define NCP_DRAG_ENTER_SLOP 16
#define NCP_DRAG_THR_PCT 40
#define TAP_ARM_DELAY_MS 300
#define PM_NUM 6
#define PM_R 50 /* 圆钮半径(直径 100) */
#define PM_GAPX 130 /* 两列圆心 x 间距(175->305,居中 240) */
#define PM_GAPY 140 /* 相邻行圆心 y 间距 */
#define PM_CARD_X0 40 /* 圆角卡片左 */
#define PM_CARD_W 400 /* 圆角卡片宽(40..440,居中) */
#define PM_CARD_CX (PM_CARD_X0 + PM_CARD_W / 2) /* 卡片水平中心 240 */
#define PM_CARD_Y0 115 /* 圆角卡片顶 */
#define PM_CARD_H 505 /* 圆角卡片高(115..620) */
#define PM_CARD_R 26 /* 圆角卡片圆角 */
#define LINUX_REBOOT_MAGIC1 0xfee1dead
#define LINUX_REBOOT_MAGIC2 672274793 /* 0x28121969 */
#define LINUX_REBOOT_CMD_RESTART 0x01234567
#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc
#define NET_LIST_WIFI_SSID 1 /* WiFi 当前连接(只读信息;点开显示详情) */
#define NET_LIST_WIFI_SAVED 2 /* WiFi 已保存网络(下拉,可 connect) */
#define NET_LIST_WIFI_SCAN 3 /* 附近WiFi:WiFi 扫描结果(按 BSSID 去重,只读展示) */
#define NET_LIST_BT_NEARBY 4 /* 蓝牙附近设备(已配对 + 扫描发现;下拉,只读展示) */
#define NET_LIST_BT_MODE 5 /* 蓝牙当前连接模式(只读信息;对应"蓝牙模式"行,s_net_get 显示) */
#define NET_LIST_ABOUT 6 /* 系统设置「关于本机」:只读设备信息弹窗(复用 s_dd_modal) */
#define NET_LIST_WIFI_PAGE 7 /* M2.76:WiFi 独立子页面入口(tap → run_wifi_page) */
#define NET_LIST_BT_PAGE 8 /* M2.76:蓝牙独立子页面入口(tap → run_bt_page) */
#define NET_LIST_PIN_PAGE 9 /* M6.x:锁屏 PIN 独立子页面入口(tap → run_lock_settings_page) */
#define S_NET_MAX 8 /* 网络下拉一次最多展示项(屏幕高度限制) */
#define BG_PRESETS_N 3
#define HK_PRESETS_N 2
#define SEQ_PRESETS_N 2
#define OUT_PRESETS_N 1
#define S_TIME_TIERS_N ((int)(sizeof s_time_tiers / sizeof s_time_tiers[0]))
#define SMENU_N ((int)(sizeof SMENU / sizeof SMENU[0]))
#define SROW_H 58 /* M2.37:行高 52→58,便于触摸点选 */
#define SET_CARD_X 8
#define SET_CARD_W (fb_xres - 16)
#define SET_CARD_Y 92
#define SET_CARD_H 536 /* 卡片底 628;视口高 = 536-16 = 520 = 10×52 */
#define SET_CONTENT_X (SET_CARD_X + 12)
#define SET_CONTENT_W (SET_CARD_W - 24)
#define SET_CONTENT_Y (SET_CARD_Y + 8)
#define SET_CONTENT_H (SET_CARD_H - 16)
#define SET_CONTENT_BOT (SET_CONTENT_Y + SET_CONTENT_H)
#define S_SCROLL_SLOP 40 /* px:触摸纵向位移超此值 → 判为列表拖动滚动(非 tap;tap 判定 ady<60) */
#define S_SLIDER_X (SET_CARD_X + 16)
#define S_SLIDER_W (SET_CONTENT_W)
#define NCP_TOP SB_BAR_H /* 28:面板顶缘(状态栏下) */
#define NCP_GRAB_Y 32
#define NCP_TITLE_Y 46
#define NCP_CHIP_Y 86
#define NCP_CHIP_H 44
#define NCP_CHIP_W 70
#define NCP_CHIP_GAP 8
#define NCP_CHIP_N 5 /* ⑥:快捷 chip 扩充为 5 个(+电源菜单) */
#define NCP_SLIDER_X 20
#define NCP_SLIDER_W (fb_xres - 40)
#define NCP_SL1_Y 162 /* 亮度滑条 track 顶(label 在 -26 =136) */
#define NCP_SL2_Y 214 /* 音量滑条 track 顶(label 在 -26 =188) */
#define NCP_DIV_Y 258
#define NCP_DND_Y 264 /* ⑥:勿扰面板内开关带顶缘(分隔线下方) */
#define NCP_DND_H 40 /* 勿扰开关带高(label+状态+s_draw_switch 48×28) */
#define NCP_LIST_TOP 308 /* 通知列表顶缘(原 266 → 下移 42 给勿扰带) */
#define NCP_LIST_BOT 694
#define NCP_ROW_H 92
#define NCP_ROW_X 12
#define NCP_ROW_W (fb_xres - 24)
#define NCP_ICON_X 26
#define NCP_TEXT_X 72
#define NCP_TEXT_W (NCP_ROW_W - (NCP_TEXT_X - NCP_ROW_X) - 10)
#define NCP_FOOT_Y 700
#define NCP_MAX_ROWS 24 /* 面板一次缓冲的通知行上限(防御) */
#define NCP_SCROLL_REBOUND_TOL 48 /* px:列表拖到顶/底仍继续拖过此容差 → 判回弹(关闭语义),
避免在边界小幅抖动即误关(> S_SCROLL_SLOP=40) */
#define NCP_SWIPE_SLOP 24 /* px:行内水平位移达此值且横向主导+左移 → 进行左滑(>阈值) */
#define NCP_SWIPE_RATE 3 /* px/ms:行左滑落位动画线性速率(回弹/滑出) */
#define NCP_SWIPE_DELETE_FRAC 40 /* %:行宽百分比阈值(│off│>=row_w*40/100 → 删) */
#define NCP_SWIPE_DELETE_MIN 110 /* px:绝对像素阈值(│off│>=110 → 删;OR 语义,窄行由 frac 起作用) */
#define NCP_DND_MIN_URGENCY 2
#define NCP_DND_SPLIT_X (fb_xres / 2) /* 勿扰/清除带分割中线(左右对称) */
#define NCP_ANIM_FIX 1024 /* 进度 p 的定点分母(1/1024 精度) */
#define NCP_ANIM_MS 180 /* 单程打开/关闭时长(ms,真机可调) */
#define MEOW_IPC_RING 16 /* 无锁环深度(单生产者=IPC线程,单消费者=主循环) */
#define MEOW_IPC_CONNS 10 /* 同时接入连接上限(backlog 4 + 余量) */
#define MEOW_IPC_BACKLOG 4
#define MEOW_SBAR_MODE_FILE "/tmp/meowapp_sbar"
/* M2.71-bug5:App 前台触摸/交互 → SDK 写该标记;launcher 前台 app 循环消费(unlink + 重置息屏计时) */
#define MEOW_APP_ACTIVITY_FILE "/tmp/meow_app_activity"
/* ---- 共享结构体/枚举(来自 meow_launcherd.c,拆分后统一放置)---- */
struct kd_state { int raw, stable, down; int longpressed; unsigned long long since, down_at; };
/* ---- M2.16 按键防抖:键值须稳定 KEY_DEBOUNCE_MS 才认可,防 ADC 抖动("点一下跳 5-6 下")。
* 返回值:0=无事件;KD_DOWN=稳定按下边沿;KD_UP=稳定松开边沿(下沿后计数)。
* s->down=稳定按住;s->longpressed=按住已 ≥CLICK_MS(长按)。 */
enum { KD_NONE = 0, KD_DOWN = 1, KD_UP = 2 };
/* ================================================================== */
/* key state polling (EVIOCGKEY) */
/* ================================================================== */
struct keypoll {
int fd;
unsigned long cur[KEYBUF_WORDS];
unsigned long prev[KEYBUF_WORDS];
int ok;
};
/* ================================================================== */
/* app scanning (MeowAPPs spec) */
/* ================================================================== */
/* 路由行:route.<act>=<chain>。act=route 键后缀(activity_id 的 app 内部分),
* chain=根屏→目标屏的 activity_id 序列(';' 分隔),链长=逻辑深度。 */
struct meow_route {
char act[16]; /* route 键后缀,如 "nowplaying" */
char chain[MEOW_CHAIN_MAX]; /* 如 "home;search;nowplaying" */
int keep_awake; /* M2.17:该 activity 常亮(app.json awake.<id>=1 / route.<id>.keep_awake=1) */
int fullscreen; /* 活动级全屏声名(app.json route.<id>.fullscreen=1;M3 活动切换时消费) */
};
/* 服务行:service.<svc>=mode:restart:max:window_ms(M1 仅解析存储,M4 保活) */
struct meow_svc {
char name[16];
int mode; /* 0=keepalive 1=ondemand(预留) */
int restart; /* 1=退避重启 */
int max; /* max_restart 熔断阈值 */
int window_ms; /* 重启窗口 */
};
/* 二进制依赖行:depends=<name>[:<mod>][,...]。<name>=二进制名;<mod>=required|req(默认)/optional|opt。
* launcher 启动前检查(required 缺失阻断,optional 缺失放行),nyai 安装时提示。 */
#define MEOW_MAX_DEPS 8
struct meow_dep {
char name[32]; /* 二进制名(/usr/bin/<name> 或 <卡>/MeowOS/opt/bin/<name>) */
char req; /* '1'=required(缺失阻断启动) '0'=optional(缺失仅 WARN 放行) */
};
struct app {
char id[MEOW_APP_ID_MAX]; /* M2.52:app_id=app.json 的 package(权威,缺省回退卡上目录名 de->d_name),供 MEOW_LOG_APP 注入 */
char package[MEOW_APP_ID_MAX]; /* 安卓化:app.json 的 package 字段(反域名权威标识;目录名=package),scan_apps 据此定 app_id */
char name[49]; /* display name(UTF-8,截断走 json_str 整序列保护) */
char exec[129]; /* absolute path */
int ok; /* exec exists and X_OK */
/* ---- 阶段 D · M1:app.json 路由/框架/服务/图标(scan_apps 解析)---- */
char framework; /* '1'=framework=true(看门狗返回发 SIGUSR1) */
char immersive; /* '1'=immersive=true(隐藏虚拟返回键,返回手势归 SDK) */
char fullscreen; /* '1'=app.json fullscreen=true(注入 MEOW_FULLSCREEN=1,SDK 预先设全屏) */
char fonts; /* 字库档:0=默认4K常用 1=大字库GBK 2=Full(app.json "fonts";注入 MEOW_FONT_TIER) */
char background; /* M4:'1'=app.json background=true(可注册无头后台服务) */
char background_audio; /* M4:'1'=background_audio=true(播放中退出转后台保活,§9) */
char icon[129]; /* icon= 路径 */
int nroute; /* route.<id> 行数 */
struct meow_route routes[MEOW_MAX_ROUTES];
int nsvc;
struct meow_svc svcs[MEOW_MAX_SVCS];
int ndep; /* app.json depends 二进制依赖项数(meow_dep.c) */
struct meow_dep deps[MEOW_MAX_DEPS];
};
/* Activity 路由注册表项:app_id 全局唯一的运行时路由层,由 scan_apps(静态 app.json)
* 与 MSG_ACT_DECLARE/HELLO(运行时)并集填充;单一写者=主循环,无需锁。 */
struct meow_acct {
char app_id[MEOW_APP_ID_MAX];
char name[49];
char exec[129];
int ok;
char framework;
char icon[129];
int nroute;
struct meow_route routes[MEOW_MAX_ROUTES];
int nsvc;
struct meow_svc svcs[MEOW_MAX_SVCS];
int declared; /* 是否经 HELLO/ACT_DECLARE 运行时声明过 */
char background; /* M4:'1'=app.json background=true(MSG_REGISTER 权限位0) */
char background_audio; /* M4:'1'=background_audio=true(MSG_REGISTER MF_PLAYBACK 权限位1) */
};
/* ---- volume save/restore ---- */
/* The player sets volume via ioctl on /dev/snd/controlC0 writing the
* CS43198 "Left/Right Playback Volume" controls (§11.4). We snapshot the
* same controls through amixer so a hotkey sequence's volume side effects
* can be restored silently (the player itself never reads these; next key
* press it writes its own value again — acceptable). */
struct vol_snap { int l, r; };
/* ================================================================== */
/* 系统状态统一快照(A:进 MeowOS 全量重抓 + 每进必刷) */
/* 主循环 10ms 热键轮询绝不读系统态;全量 meow_sys_refresh() 仅在进 */
/* MeowOS 时调一次;1s 轻刷 meow_sys_light() 只更新时钟/电量/WiFi, */
/* 并约 5s 节流探测一次蓝牙角色(M2.48)。 */
/* 状态栏/后续设置/面板统一读此快照,单点一致,避免重复读 amixer/sysfs。*/
/* ================================================================== */
typedef struct meow_sys_state {
int batt; /* 容量 % 0-100,-1 未知 */
int charging; /* 1 充电 0 放电 */
int batt_mv; /* 电压 mV */
int wifi_on; /* M2.48:1 网卡 up(射频开)0 down(关则不显示图标) */
int wifi_connected;/* M2.48:1 已关联 AP(operstate up)0 未连(区分「网卡up未连」→WIFI_NO) */
int wifi_level; /* M2.66+:信号 dBm(-1000=未知);状态栏 WiFi 分档(强/中/弱),喂给 SDK */
char wifi_ssid[33];
char wifi_ip[16];
int bt_on; /* 1 蓝牙上电 0 关 */
int bt_seen; /* hci 节点存在 1/0(无模块不放图标) */
int bt_role; /* M2.48:蓝牙角色(bt_role() 判定缓存):BT_ROLE_* */
int vol; /* 系统软件音量 0-100(settings) */
int brightness; /* sysfs */
long data_free_kb; /* /data 剩余 KB */
int sd_mounted; /* TF 卡已挂载 */
long sd_free_kb; long sd_total_kb;
int mode; /* 1 meow 0 hiby(调用方) */
int napps; /* 应用数(调用方) */
char ver[16];
} meow_sys_state;
/* ---- 主题(MD3 color roles,dark/light 两套)----
* M2.44:上移到本处(状态栏绘制之前),使状态栏/设置页共用同一套主题色板。 */
typedef struct meow_ui_theme {
uint32_t surface; /* 全局背景 */
uint32_t surface_variant; /* 卡片/列表底 */
uint32_t surface_container; /* 控件容器 */
uint32_t primary; /* 高亮/选中/accent */
uint32_t on_surface; /* 主文字 */
uint32_t on_surface_variant; /* 次文字 */
uint32_t outline; /* 描边/分隔线 */
uint32_t error; /* 错误提示 */
uint32_t surface_tint; /* 选中态叠色 */
} meow_ui_theme_t;
/* ================================================================== */
/* M2.36 阶段 B2b:实体系统设置页(MD3 风格) */
/* - 入口:应用列表「系统设置」builtin 行(draw_menu 中位于 Exit 行上 */
/* 方;触摸命中 run_menu 分发到此 run_settings_page)。 */
/* - 结构:分组列表(显示/电源/开机/输入/字体主题/通知/日志/音频), */
/* 全屏单张 surface_variant 圆角卡片,组标题 on_surface_variant 小字。*/
/* - 控件:开关(SC_SWITCH)/滑条(SC_SLIDER)/选择器(SC_ENUM)/预设路径 */
/* (SC_PRESET)。所有读写仅走 meow_settings_getXXX / setXXX 接口; */
/* meow_settings_save(),绝不直接改文件(SYSTEM_SETTINGS §4)。 */
/* ================================================================== */
/* M2.36 阶段 B2b:实体系统设置页(MD3 风格) */
/* - 入口:应用列表「系统设置」builtin 行(draw_menu 中位于 Exit 行上 */
/* 方;触摸命中 run_menu 分发到此 run_settings_page)。 */
/* - 结构:分组列表(显示/电源/开机/输入/字体主题/通知/日志/音频), */
/* 全屏单张 surface_variant 圆角卡片,组标题 on_surface_variant 小字。*/
/* - 控件:开关(SC_SWITCH)/滑条(SC_SLIDER)/选择器(SC_ENUM)/预设路径 */
/* (SC_PRESET)。所有读写仅走 meow_settings_getXXX / setXXX 接口; */
/* meow_settings_save(),绝不直接改文件(SYSTEM_SETTINGS §4)。 */
/* - 主题:MD3 color roles(dark/light 两套,接 display.theme),集中 */
/* 下表,禁止散落硬编码色值(MD3_UI_SPEC §1)。 */
/* - 交互:音量键=调系统音量 / 电源键=系统级语义(单击=息屏/亮屏、长按=电源菜单、
8s=强关;不再返回)/ 播放键=抓住(不返回)/ 退出仅靠触摸(底部返回 + 左缘左滑)。*/
/* 选中行 tonal 高亮(meow_ui_fill_rect_alpha),滑条拖动实时 set_*。 */
/* 静态展示不主动刷新,仅交互时经 meow_dirty 区标脏 + blit 局部。 */
/* ================================================================== */
/* 主题(MD3 color roles)定义已上移到本文件前方状态栏处(M2.44)。 */
/* ---- 控件类型 ---- */
typedef enum { SC_HEADER, SC_SWITCH, SC_SLIDER, SC_ENUM, SC_PRESET, SC_INFO, SC_LIST } sctrl_t;
/* ---- 一行描述(label+key+控件);key=NULL 表示分组标题行 ---- */
typedef struct {
const char *label;
const char *key;
sctrl_t ctrl;
int min, max, step; /* SC_SLIDER 取值域/步进 */
const char *const *presets; /* SC_PRESET 选项名 */
const char *const *preset_labels; /* SC_PRESET 选项中文标签 */
int preset_n;
int net_list; /* SC_INFO/SC_LIST 网络信息类别(NET_LIST_*),0=无 */
} srow_t;
/* 已保存网络 / 扫描结果 / 蓝牙设备名称列表(用于下拉展示与连接动作)。
* M2.76:追加 mac[24](AP BSSID / 蓝牙设备 MAC),供连接/配对/详情展示;无则空串。
* M6.0:追加 sec[16](WiFi 扫描结果安全类型:Open/WPA-PSK/...;无则空=未知),
* 供「WiFi 新网络录入」判断是否需要弹 IME 输密码。 */
typedef struct { int id; char name[48]; char mac[24]; char sec[16]; } meow_net_t;
/* ================================================================== */
/* M2.76:WiFi/蓝牙独立子页面脚手架(安卓风:顶栏+返回+分组列表+滚动) */
/* 实现:subpage.c(统一循环) + wifi_page.c / bt_page.c(数据/动作)。 */
/* 与设置页同主题(s_ui_theme,MD3 语义色,明暗自动);滑动方向沿用 */
/* 设置页语义(含 input.swipe_invert);局部刷新不整屏重绘;模态弹窗 */
/* 复用 launcher 既有 s_dd_modal(点外关闭不穿透,见 settings_page.c)。*/
/* ================================================================== */
#define SUB_ROWS_MAX 44 /* 子页一次最多行数(分组标题+各行,防爆) */
/* 子页一行:kind 决定渲染(组标题 / 普通行 / 开关行 / 动作行<右chevron>) */
typedef enum { SUB_HDR, SUB_ROW, SUB_SW, SUB_ACT } sub_kind_t;
typedef struct {
sub_kind_t kind;
const char *label; /* 主文本 */
const char *sub; /* 副文本/摘要(右侧 dim 文字),可空 */
int on; /* SUB_SW:开关态 */
int act; /* 动作码(回传给 act 回调定位具体行) */
} sub_row_t;
/* 子页描述(页面提供回调,脚手架负责绘制/滚动/触摸/按键/自动息屏) */
typedef struct sub_page {
const char *title; /* 顶栏标题 */
int (*top_sw)(void *ctx, int *on); /* 顶栏开关:返回 1=显示开关并写 *on;0=无开关 */
void (*top_sw_set)(void *ctx, int on);/* 顶栏开关切换(写+生效+触发重扫) */
int (*rows)(void *ctx, sub_row_t *rbuf, int max); /* 填行,返回行数 */
int (*act)(void *ctx, int idx, int act); /* 点动作行/开关行;返回 1=重绘+重填行 */
int (*detail)(void *ctx, int idx, int act);/* 点 SUB_ROW 行(如连接/设备详情);返回 1=重绘 */
int live; /* 1=驻留时周期性(约2s)重扫行(蓝牙/附近扫描刷新用) */
void *ctx; /* 页面私有上下文 */
} sub_page_t;
/* 运行子页(阻塞到返回;返回 0)。由 wifi_page.c / bt_page.c 各自实现。 */
int meow_subpage_run(sub_page_t *p);
int run_wifi_page(void);
int run_bt_page(void);
/* chip 索引(⑥:第 5 个 = 电源菜单,点击唤起既有系统电源菜单 show_power_menu) */
enum { NCP_CHIP_WIFI=0, NCP_CHIP_BT=1, NCP_CHIP_THEME=2, NCP_CHIP_BRIGHT=3,
NCP_CHIP_POWER=4, NCP_CHIP_COUNT=5 };
/* 通知行快照(面板读取字段 + 缓存的 icon 句柄)。 */
typedef struct {
uint32_t id;
char app_id[MEOW_NOTIF_APP_ID_MAX];
char category[MEOW_NOTIF_CAT_MAX]; /* 通知类型(媒体="media")——点击 route_status 判定用 */
char summary[MEOW_NOTIF_SUMMARY_MAX];
char body[MEOW_NOTIF_BODY_MAX];
char icon[MEOW_NOTIF_ICON_MAX];
char target[MEOW_NOTIF_ACTIVITY_MAX];
uint64_t created_ms;
int progress;
uint8_t urgency;
meow_img *img; /* 缓存图标(meow_img_load_file 结果;NULL=回退首字符圆点) */
} ncp_row_t;
/* M5 通知中心点击产出:run_notif_center 经 *click 回报,run_menu 消费。
* app_idx: -1=无启动;>=0 = apps[] 下标(本批 run_menu 传入同源)。
* status : route_status(FRAMEWORK_DESIGN §4):-1=NONE(面板已关,未点任何通知,run_menu 不动);
* 0=OK 跳转;1=NO ROUTE;2=SOURCE NOT FOUND。
* chain : status==0 时解析出的 activity 链路(';' 分隔);空=裸启动/整 app 级(媒体→主屏)。
* status==1/2/NONE 时置空。 */
#define NOTIF_CLICK_STATUS_NONE (-1)
#define NOTIF_CLICK_STATUS_OK 0
#define NOTIF_CLICK_STATUS_NOROUTE 1
#define NOTIF_CLICK_STATUS_NOSRC 2
typedef struct notif_click {
int app_idx;
int status;
char chain[MEOW_CHAIN_MAX];
} notif_click_t;
/* ---- ⑧ 一键清除(批量):先转储留档 → 再清空显示(红线:保留 ongoing/media/progress)---- */
typedef struct { uint32_t ids[NCP_MAX_ROWS]; int n; } ncp_clear_ctx_t;
/* 入队消息:类型 + 请求 id + 客户端 fd(回包用)+ 负载拷贝(≤CARGO) */
struct meow_ipc_msg {
uint16_t type;
uint16_t plen;
uint32_t req_id;
int fd;
uint8_t payload[MEOW_IPC_CARGO];
};
/* 每连接字节流帧组装状态(TCP 流语义下逐字节缓冲,跨 poll 保留) */
struct meow_ipc_conn {
int fd;
uint8_t hdr[MEOW_IPC_HDR_LEN];
int hdr_n;
uint8_t pay[MEOW_IPC_MAX];
uint32_t pay_tot;
uint32_t pay_n;
};
/* ---- 跨模块共享变量(extern)---- */
extern int back_buf_ok;
extern unsigned char *fb;
extern int fb_xres, fb_yres, fb_line, fb_bpp;
extern int fb_fd;
extern const char *font_preset_fams[FONT_PRESETS_MAX];
extern const char *font_preset_labels[FONT_PRESETS_MAX];
extern const char *font_preset_names[FONT_PRESETS_MAX];
extern const char *font_preset_tiers[FONT_PRESETS_MAX];
extern const char *font_preset_wts[FONT_PRESETS_MAX];
extern const char *font_presets[FONT_PRESETS_MAX];
extern int font_presets_n;
extern char g_meowos_version[16];
extern int g_naccts;
extern int g_sb_icon_cy;
extern int g_sb_mode_last;
extern meow_sys_state g_sys;
extern int hotkey_mode;
extern volatile int ipc_shutdown;
extern char ipc_sock_path[MEOW_IPC_SOCK_LEN];
extern char log_dir[256];
extern int log_fd;
extern char log_file[256];
/* M2.x 应用日志目录简化(apps/<id>/logs → <id>):mkdir -p 幂等;迁移用。 */
int meow_mkdir_p(const char *path);
/* M2.85 内存护栏:/proc/meminfo MemAvailable(kB);失败 -1(util.c)。 */
long sys_mem_available_kb(void);
extern uint32_t menu_bg;
extern int menu_opened_blank;
extern int meow_auto_slept;
extern int meow_brightness_pending; /* M2.86:亮度待补应用挂起(apply_user_brightness 在设置未读到时不写,置 1) */
extern int meow_mode;
extern int meow_saved_brightness;
extern int meow_screen_on;
extern int mfont_forced;
extern int mfont_ready;
extern int player_stopped;
/* §10.5:App 前台叠加通知中心会话的跨模块状态(app_launcher.c 置位;util.c ipc_dispatch 读) */
extern volatile int g_app_session_active; /* 1=launch_app waitpid 前台会话中 */
extern int g_notif_ctrl_pid; /* >0=run_notif_center 处于 App 叠加会话,周期探测 App 存活 */
extern int g_notif_ctrl_died; /* 1=会话中 App 已死 → 立即结束会话走统一退出路径 */
extern const int pm_cx[PM_NUM];
extern int power_forceoff_ms;
extern int power_longpress_menu_ms;
extern int refresh_always_max;
extern int refresh_rate_cfg;
extern int saved_brightness;
extern int screen_off_mode;
extern int screen_off_timeout;
extern int seq_codes[MAX_SEQ_LEN];
extern int seq_gap_ms;
extern int seq_len;
extern int settings_cache_registered;
extern int settings_volume;
extern int settings_volume_max;
extern int settings_volume_step;
extern volatile sig_atomic_t sigterm_flag;
extern int sim_no_exec;
extern int sim_power_pick;
extern int vol_ramp_dir;
/* ---- 跨模块共享函数原型 ---- */
void apply_user_brightness(void);
void bt_role_refresh(int force);
int card_present(void);
int chain_depth(const char *c);
int confirm_reboot_player(void);
void cont_player(void);
void dim_screen(void);
void drain_input(void);
void draw_clock(void);
void draw_statusbar(void);
void draw_text(int x, int y, const char *s, int scale, uint32_t color);
void ensure_backlight(void);
int ensure_card_mounted(void);
void ensure_wifi(void);
void fb_backup_player(void);
void fb_norm_buf0(void);
int fb_open(void);
void fb_pan_buf0_force(void);
void fb_restore_player(void);
int fg_keep_awake(void);
void fill_circle(int cx, int cy, int r, uint32_t color);
void fill_rect(int x0, int y0, int w, int h, uint32_t color);
void fill_round_rect(int x0, int y0, int w, int h, int r, uint32_t color);
int find_hiby_pid(void);
void font_family_weight_from_png(const char *png, char *fam, int flen, char *wt, int wlen);
int hci_powered(void);
unsigned long long idle_ms_since(unsigned long long t, unsigned long long last);
int is_meow_mode(void);
int json_str(const char *buf, const char *key, char *out, int olen);
int kd_tick(struct kd_state *s, int raw);
void kp_close(struct keypoll *kp);
int kp_is_down(const struct keypoll *k, int code);
int kp_open(struct keypoll *kp, const char *dev);
int kp_poll(struct keypoll *kp, int (*cb)(int code, int down, void *ctx),
void *ctx);
int launch_app(struct app *a);
/* ---- app.json 二进制依赖(depends)解析与启动前检查(meow_dep.c)---- */
int meow_parse_depends(const char *val, struct meow_dep *deps, int max);
int meow_check_app_depends(const struct app *a, char *missing, int mlen);
void meow_dep_clear_reason(void);
const char *meow_dep_block_reason(void);
/* M3:以指定 activity 链路冷启动某 app(注入 MEOW_ACTIVITY/MEOW_CHAIN + 设 nav_stack 栈深)。
* chain=NULL 或空 = 裸启动(进 App 主屏/首页,不注入 activity env)。 */
int launch_activity(struct app *a, const char *chain);
void load_config(void);
void log_cleanup_old(void);
int log_open_card(void);
void log_poll_card(void);
void logmsg(const char *fmt, ...);
void meow_acct_declare(const char *app_id, const char *entries, int count);
struct meow_acct *meow_acct_find(const char *app_id);
void meow_acct_hello(const char *app_id, uint32_t version, uint32_t flags);
void meow_dac_vol_flush(void);
/* M3 导航栈(每 app ≤16 深;v1 单前台应用)。launcher 侧镜像,主循环单写者。 */
#define MEOW_NAV_MAX_DEPTH 16
void meow_nav_begin(const char *app_id, const char *chain); /* chain=NULL→depth 0(裸启动) */
void meow_nav_report(const char *app_id, uint32_t depth, const char *current);
void meow_nav_exit(void); /* 清栈(应用退出/EXIT) */
void meow_nav_request_exit(void); /* MSG_NAV{EXIT}:置位让前台 waitpid 循环终止 app */
int meow_nav_exit_pending(void); /* 读取并清除退出请求(前台 launch_* 循环轮询) */
/* ---- amsd 控制挂点(AMSD_DESIGN §4.3 / §6.2 二期):主循环单写者,跨模块声明 ----
* pending-start 状态/拉起决策在 meow_ams_start.c(自包含、可单测,见 meow_ams_start.h);
* pending-kill 在 app_launcher.c。仅在主循环上下文写入与消费(ipc_dispatch 写、
* run_menu 前台循环/菜单循环读)。 */
void meow_ams_pending_kill_set(const char *pkg); /* 请求终止某 pkg */
int meow_ams_kill_pending(const char *pkg); /* 匹配则清除并返回 1(前台循环轮询) */
/* run_menu 消费 pending-start:复用 launch_app/launch_activity 链真正拉起目标 App。
* 返回 0=无 pending/busy;1=已消费(拉起成功/拒绝);2=列表未就绪(pending 保留待重扫)。
* app_ran=1=app 已运行(据以设 touch 冷却);idx_out>=0 且 app_ran=0 → 启动失败,打 launch_fail_toast。 */
int meow_ams_start_consume(const char *const *ids, int napps, int state,
char *toast, int toast_len, int *app_ran, int *idx_out);
/* launch_app_chain 入口拾取 picker 上下文(一次性清位)。 */
int meow_ams_take_picker(char *action, int action_len,
char *caller, int caller_len, uint32_t *req);
/* 组装 amsd-start ops(生产=launch_app/launch_activity+resolve_chain+logmsg;meow_ipc_init 末尾调)。 */
void meow_ams_launcher_init(void);
/* 供 run_menu/idle 挂当前 apps[] 上下文(ops.launch 的 idx→app 映射用)。 */
void meow_ams_ctx_set(struct app *apps, int napps);
/* §6.2 二期:amsd 上报通道(best-effort,app_launcher.c 的 ams_send 公开包装)。
* util.c 转发运行时 declare 与 picker call/result 给 amsd 用。 */
void meow_ams_send(const char *payload, int len);
/* ---- M4 后台保活/后台服务胶水(app_launcher.c 实现;util.c/main_menu.c 消费)---- */
/* launcher 侧 meow_bgplay ops 组装(meow_ipc_init 末尾调一次)。 */
void meow_bgplay_launcher_init(void);
/* 后台表周期维护:drain 各 bg App 的 stdout 管道 + meow_bg_tick + meow_svc_tick。
* 挂载点=meow_ipc_process 末尾(主循环单写者排空点,四处循环都经它)。 */
void meow_bg_housekeep(void);
/* 查静态声明的 service.<svc>;无返回 NULL。 */
const struct meow_svc *meow_acct_svc_find(const struct meow_acct *ac, const char *svc);
/* 后台权限位:bit0=background(可注册服务)bit1=background_audio(后台音频)。 */
int meow_acct_background_perm(const struct meow_acct *ac);
/* M4:服务 exec 路径约定 = App 二进制同目录下的 <svc> 名文件。 */
void meow_svc_exec_path(const char *app_exec, const char *svc, char *out, int olen);
void meow_dac_vol_write(int pct);
void meow_dac_vol_write_throttled(void);
void meow_dirty_add(int x, int y, int w, int h);
void meow_dirty_full(void);
void meow_fg_act_back(void);
void meow_fg_act_set(const char *app_id, const char *act);
void meow_font_bind_fb(void);
int meow_font_effective_paths_tiered(int tier, char *out_png, int plen,
char *out_idx, int ilen, char *out_family, int flen);
int meow_font_effective_tier(int app_tier);
int meow_font_ensure(void);
void meow_font_reload_multifont(void);
int meow_font_resolve_path(const char *ref, char *out, int olen);
void meow_font_scan_presets(int verify_sha);
void meow_font_scan_presets_root(const char *card_root, int verify_sha);
int meow_ipc_init(void);
void meow_ipc_process(void);
/* M4:IPC 连接存活查询(熔断广播投递前判连接未断;util.c ipc_conns 表查 fd)。 */
int meow_ipc_conn_alive(int fd);
/* M4:ipc_send 公开包装(meow_bgplay send_frame 回调用;同 meow_media 的注入口径)。 */
size_t meow_ipc_send_pub(int fd, uint16_t type, uint32_t req_id,
const void *payload, uint32_t len);
/* §10.5:读并清除待处理的 MSG_NOTIF_OPEN(App 前台顶部下滑请求展开通知中心叠加会话)。
* 调用方=launch_app waitpid 循环;返回 1 并填 *out(待处理),0=无。 */
int meow_notif_open_take(m_notif_open_t *out);
/* §10.5:清残留待处理 OPEN(进入新 App 前台会话前调用,防旧会话残留误展开)。 */
void meow_notif_open_clear(void);
void meow_panel_off(void);
void meow_panel_on(void);
void meow_parse_app_json(FILE *f, struct app *a);
int meow_pkg_export(const char *pkg, const char *out_path);
int meow_pkg_install(const char *mpk_path);
void meow_sys_light(void);
void meow_sys_refresh(void);
void meow_toggle_panel(void);
void net_wifi_ssid(char *buf, int len);
/* M2.76:网络/蓝牙列表现拆分给 WiFi/蓝牙独立子页面用(原 static,改为跨模块暴露) */
void net_wifi_scan_trigger(void);
void net_bt_scan_trigger(void);
int net_wifi_info(char (*info)[48], int max);
int net_wifi_saved(meow_net_t *out, int max);
int net_wifi_scan(meow_net_t *out, int max);
int net_bt_paired(meow_net_t *out, int max);
int net_bt_scan(meow_net_t *out, int max);
int net_bt_connected(meow_net_t *out, int max);
int bt_role(char *desc, int len);
void net_bt_mode_str(char *buf, int len);
unsigned long long now_ms(void);
void paint_sb_clock(void);
void paint_sb_right(void);
void pm_capture_app_frame(void);
char *popen_read_tmo(int tmo_ms, const char *cmd);
int proc_by_comm(const char *target);
void put_px(int x, int y, uint32_t color);
int read_brightness(void);
int read_file_int(const char *path);
int resolve_chain(const char *app_id, const char *activity, char *out, int *depth);
void restore_backlight(void);
uint16_t rgb565(uint32_t c);
void run_notif_center(struct app *apps, int napps, notif_click_t *click,
int live_open, int lox, int loy);
/* 阶段D附录B:Now Playing 大页(主界面横划进入;左缘右滑返回;阻塞到返回)。 */
void run_now_playing(struct app *apps, int napps);
void run_settings_page(void);
void s_about_open(void);
int s_dd_modal(const char *title, const char *item[S_NET_MAX], int n, int cur);
void s_draw_chevron(int x, int y, uint32_t color);
void s_draw_chevron_left(int x, int y, uint32_t color);
void s_draw_slider(int x, int y, int w, int val, int mn, int mx,
const meow_ui_theme_t *th);
void s_draw_switch(int x, int y, int on, const meow_ui_theme_t *th);
int s_net_get(const srow_t *r, char *buf, int len);
void s_net_open(const srow_t *r);
void s_net_refresh(void);
void s_net_sync_from_sys(void);
/* M3:设置页异步网络刷新 —— kick 重置步骤机并触发扫描(非阻塞);pump 每步一个
* 有界 popen,返回 1=数据可能更新(调用方重绘)。run_settings_page 主循环逐步骤驱动。 */
void s_net_refresh_kick(void);
int s_net_refresh_pump(void);
void s_net_toggle_bt(int on);
void s_net_toggle_wifi(int on);
/* ================= meow_netmgrd IPC 客户端(netmgr_ipc.c)=================
* M6.0 设置页迁移(NETMGR_DESIGN §12):wifi_page/bt_page 的查询/操作统一走 netmgrd
* IPC(socket /usr/data/meow_net.sock,env MEOW_NET_SOCK 覆盖)。netmgrd 是 WiFi/BT
* 操作权威;其不可达(NETMGR_UNREACH)时回退 net.c 直连 wpa_cli/hciconfig(双轨保功能)。
* 迁移注释:此封装是「设置页客户端→权威 IPC」的唯一入口,netmgrd 不可达才走直连回退。 */
#define NETMGR_UNREACH (-1000) /* 传输/握手不可达(区别于 netmgrd MEOW_ERR_* 业务码) */
int netmgr_ok(void); /* 1=netmgrd 可达(结果约 1s 缓存,节流) */
int netmgr_wifi(const char *cmd, const char *arg, char *text, int tlen); /* 返回 code / NETMGR_UNREACH */
int netmgr_bt(const char *cmd, const char *arg, char *text, int tlen);
/* WiFi(IPC 优先;网卡链路态 wlan_connected()/hci_powered() 仍读内核,属只读观测) */
int nm_wifi_connected(void);
void nm_wifi_ssid(char *buf, int len);
int nm_wifi_info(char (*info)[48], int max);
int nm_wifi_saved(meow_net_t *out, int max);
int nm_wifi_scan(meow_net_t *out, int max);
void nm_wifi_scan_trigger(void);
int nm_wifi_connect(const char *ssid, const char *psk, char *err, int elen); /* MEOW_OK=成功 */
int nm_wifi_disconnect(char *err, int elen);
int nm_wifi_toggle(int on);
/* BT(IPC 优先:on/off/status/paired;连接/断开/配对/附近扫描 netmgrd 无子命令,仍直连) */
int nm_bt_powered(void);
int nm_bt_onoff(int on);
int nm_bt_status(int *powered, int *paired_n, char *addr, int alen);
int nm_bt_paired(meow_net_t *out, int max);
const meow_ui_theme_t *s_ui_theme(void);
void sb_blit_icon(int icon_idx, int x, uint32_t fg, int ink_h);
int scan_apps(struct app apps[MAX_APPS]);
int sd_device_present(void);
int sd_mounted(void);
void settings_load(void);
void settings_sync_cache_from_backend(void);
void settings_sync_cache_listener(const char *key);
void settings_volume_adj(int delta);
int settings_volume_get(void);
int show_power_menu(void);
/* M2.x 锁屏:阻塞式锁屏页(渲染+输入);返回 1=已解锁(回主屏),0=锁屏期间电源键息屏(屏已关),
* -1(LCK_OVERLAY_RET_DIED)=锁屏叠加期 App 崩溃(run_app_lock_overlay 走统一退出路径)。
* meow_lock_screen_engage() 供电源菜单「锁定」与唤醒路径用;未配凭据时 no-op。 */
int run_lock_screen(void);
int meow_lock_screen_engage(void);
/* §310 残影:锁屏处于 App 前台叠加会话时置位当前 App pid(run_app_lock_overlay 写入,
* run_lock_screen 每圈据此 proc_is_zombie 探测;菜单直接锁屏时保持 0=不探)。 */
extern int g_lock_overlay_pid;
/* 设置页「锁屏 PIN」数字输入模态(系统级 PIN 设置/修改输入):满 4 位返回 1 并拷贝到 out,电源=取消返回 0。 */
int lck_input_pin_modal(const char *title, char *out, int outcap);
/* 设置页「锁屏 PIN」独立子页面(subpage.c 脚手架;阻塞到返回)。 */
int run_lock_settings_page(void);
int stop_player(void);
/* 电源管理服务 IPC(SYSTEM_FRAMEWORK_SERVICES §3.2:launcher 电源动作经 meow_svc_power 执行) */
int pm_power_ipc(uint32_t cmd, uint32_t flag, const char *arg, char *res, int reslen);
/* §10.5:/proc/<pid>/stat 状态位 == 'Z'(僵尸子进程=已死未回收)。notif_center 叠加会话用它
* 立即感知 App 崩溃(waitpid 回收仍由 app_launcher waitpid 循环统一做)。 */
int proc_is_zombie(int pid);
int meow_power_action(uint32_t cmd);
void ui_draw(int x, int y, const char *s, uint32_t color, int size);
int ui_width(const char *s, int size);
void unblank_panel(void);
int vol_clamp(int v);
int vol_ramp_tick(int key_held);
void vol_restore(struct vol_snap s);
struct vol_snap vol_snapshot(void);
int wlan_connected(void);
int wlan_radio_up(void);
void write_brightness(int val, const char *src); /* src=调用源线索,随值一并 logmsg(亮度幽灵排查) */
#ifdef __cplusplus
}
#endif
#endif /* MEOW_LAUNCHER_INTERNAL_H */