Files
MeowOS-For-R3P2/patch_v2/meow_launcherd/meow_launcher_internal.h
T
2026-08-31 06:27:10 +08:00

733 lines
36 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_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,可单测) */
#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"
#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 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 5
#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 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; /* 重启窗口 */
};
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[17]; /* ASCII display name */
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 icon[129]; /* icon= 路径 */
int nroute; /* route.<id> 行数 */
struct meow_route routes[MEOW_MAX_ROUTES];
int nsvc;
struct meow_svc svcs[MEOW_MAX_SVCS];
};
/* Activity 路由注册表项:app_id 全局唯一的运行时路由层,由 scan_apps(静态 app.json)
* 与 MSG_ACT_DECLARE/HELLO(运行时)并集填充;单一写者=主循环,无需锁。 */
struct meow_acct {
char app_id[MEOW_APP_ID_MAX];
char name[17];
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 运行时声明过 */
};
/* ---- 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),供连接/配对/详情展示;无则空串。 */
typedef struct { int id; char name[48]; char mac[24]; } 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);
extern uint32_t menu_bg;
extern int menu_opened_blank;
extern int meow_auto_slept;
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;
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);
/* 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_* 循环轮询) */
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(void);
void meow_font_scan_presets_root(const char *card_root);
int meow_ipc_init(void);
void meow_ipc_process(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);
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);
void s_net_toggle_bt(int on);
void s_net_toggle_wifi(int on);
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);
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);
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);
#ifdef __cplusplus
}
#endif
#endif /* MEOW_LAUNCHER_INTERNAL_H */