/* 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 #include #include #include #include #include #include #include #include #include #include #include #include #include /* 0-warning:musl 把 重定向到 ,用后者消除 -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 #include #include /* Bug 2:直连 reboot(2) syscall 用 */ #include /* M0:IPC 线程 */ #include /* M0:IPC→主循环唤醒(EFD_NONBLOCK) */ #include /* M0:AF_UNIX IPC */ #include /* M0:sockaddr_un */ #include #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/.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=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.=1 / route..keep_awake=1) */ int fullscreen; /* 活动级全屏声名(app.json route..fullscreen=1;M3 活动切换时消费) */ }; /* 服务行:service.=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=[:][,...]。=二进制名;=required|req(默认)/optional|opt。 * launcher 启动前检查(required 缺失阻断,optional 缺失放行),nyai 安装时提示。 */ #define MEOW_MAX_DEPS 8 struct meow_dep { char name[32]; /* 二进制名(/usr/bin/ 或 <卡>/MeowOS/opt/bin/) */ 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 background_keepalive; /* 批①:'1'=background_keepalive=true(进入后台即保活,不依赖媒体会话=通用常驻) */ char icon[129]; /* icon= 路径 */ int nroute; /* route. 行数 */ 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) */ char background_keepalive; /* 批①:'1'=background_keepalive=true(进入后台即保活,不依赖媒体会话) */ }; /* ---- 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; /* 页面私有上下文 */ /* ---- 批③ 后台管理页按钮化(可选;NULL/0=按旧路径,未填页/WiFi/蓝牙/锁屏等不受影响)---- * 提供下方任一回调即启用对应渲染/命中定制;全 NULL 时行为与旧版完全一致。 */ const char *top_action; /* 顶栏标题栏右侧动作按钮文案(NULL=无按钮) */ int (*top_action_cb)(void *ctx); /* 点顶栏动作按钮;返回 1=重绘 */ /* 行完全自绘(覆盖默认 renderer;页内由 r->kind 区分行型)。state=MEOW_LISTVIEW_ST_*(选中/按压/禁用)。 */ void (*row_draw)(void *ctx, int idx, sub_row_t *r, int x, int y, int w, int h, int state); /* 点 SUB_ROW 行(自定义命中:页内自行区分「行内按钮区 vs 行体」;x,y=tap,rx..rh=行视口矩形); * 返回 1=重绘。仅 kind==SUB_ROW 且本回调非空时走此路径,否则走 detail。 */ int (*row_tap)(void *ctx, int idx, sub_row_t *r, int x, int y, int rx, int ry, int rw, int rh); } 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); /* 批③:后台管理页(bg_page.c;桌面顶栏居右按钮进入;阻塞到返回)。 */ int run_bg_page(struct app *apps, int napps); /* 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//logs → ):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.;无返回 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 二进制同目录下的 名文件。 */ 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 优先:全量子命令权威收口 P1;netmgrd 不可达回退 net.c 直连)。 * P1 收口(BLUETOOTH_FULL_OVERHAUL_PLAN §六/§八):connect/disconnect/pair/unpair/scan 写级 * 迁 netmgrd;connected/devices/a2dp 读级也迁 netmgrd(launcher 只做客户端)。 */ 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); int nm_bt_connected(meow_net_t *out, int max); int nm_bt_devices(meow_net_t *out, int max); /* A2DP 单端点详情(codec/采样率/声道/位深/acquired/role;netmgrd bt a2dp 解析) */ typedef struct { char mac[24]; /* 端点设备 MAC(与 connected/paired 列表可 join) */ char codec[16]; /* SBC/AAC/aptX/LDAC...;空=未知 */ char rate[16]; /* 采样率(如 "44100");空=未知 */ char chn[8]; /* 声道数 */ char bits[8]; /* 位深 */ int acquired; /* 1=传输已获取(streaming 中) */ char role[8]; /* "src"/"snk"/"-"(设备侧 A2DP 角色) */ } bt_ep_t; int nm_bt_a2dp(bt_ep_t *eps, int max); /* 返回端点数 */ int nm_bt_connect(const char *mac); int nm_bt_disconnect(const char *mac); int nm_bt_pair(const char *mac); int nm_bt_unpair(const char *mac); void nm_bt_scan_on(void); void nm_bt_scan_off(void); 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//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 */