- 设置页入口 s_net_sync_from_sys() 改为 toggle 同步(快)+异步 s_net_refresh_kick(); wifi/bt 状态与列表由 run_settings_page 主循环逐步骤 s_net_refresh_pump() 填充 (每步一个带超时 popen、~150ms 一步),draw 用 g_net_* 缓存,数据变化即 need_paint → 入口不再被 wpa_cli/bluetoothctl/hcitool 5 条串行 popen(各 1.2~2.5s 有界超时)拖住。 - 进设置页字体重扫 meow_font_scan_presets(0) 跳过逐套 sha256(gbk/full 套数 MB, 逐套双 sha256 真机耗数秒,入口卡顿主因之一);完整性校验保留给启动/热插拔全量(verify=1)。 - s_net_refresh() 保留同步语义(kick+drain) 供通知中心等调用方;WiFi/BT 子页返回、 网络下拉后改 kick(由主循环承担异步填充)。 - 设置入口加毫秒级分段日志(font rescan / net toggle-sync+kick / page shown)供真机取证。 - 交叉 -Wall -Wextra 0 warning;launcher 宿主测试全 PASS。launcher md5 fbc78c62
860 lines
46 KiB
C
860 lines
46 KiB
C
/* 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 迁移/唤醒判定) */
|
||
|
||
#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(void);
|
||
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=锁屏期间电源键息屏(屏已关)。
|
||
* meow_lock_screen_engage() 供电源菜单「锁定」与唤醒路径用;未配凭据时 no-op。 */
|
||
int run_lock_screen(void);
|
||
int meow_lock_screen_engage(void);
|
||
/* 设置页「锁屏 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 */
|