feat(panic): FUCK [panic] mode=strict|fallback + realtest image variant
- UTSM panic_full returns in fallback mode (logs [PANIC:FALLBACK] + code + hit count); panic_halt keeps always-halt sites (CPU exception, VMM-E11 LA57, VMM-E15 DSK jump, UTSM-E42 test hook). Call sites given safe continuations. - Mode passed to DSK/FirstInit/login/desktop via DSK_BOOT_FLAG_PANIC_FALLBACK; DKM kernel_api.panic / kern.log.panic return to driver; ext4 fatal aborts the op via setjmp/longjmp and DSK falls back to FAT32 ESP. - build.ps1/Makefile: dev=strict, release=fallback, new realtest (release options + strict); default -Variant all; serialized iso packing under -j. - Fix '*/' inside comments (dkm.h, kernel_api.h, bus.c) that broke the build. - Includes pending work: dkm_bus service bus, mt7920/wlan drivers, desktop files/startmenu/prank, pe-tools, diskinfo, docs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+345
-8
@@ -54,6 +54,9 @@ static wf_btn_state tb_hover_state(const int r[4]);
|
||||
#define WIFI_NETAPI_IS_WIRELESS 0x40
|
||||
#define WIFI_NETAPI_CONNECT 0x48
|
||||
#define WIFI_NETAPI_DEVICE_COUNT 0x08
|
||||
#define WIFI_NETAPI_DEVICE_INFO 0x10
|
||||
#define TRAY_NET_LINK_UP (1u << 0)
|
||||
#define TRAY_NET_WIRELESS (1u << 3)
|
||||
|
||||
#define WIFI_MAX_ROWS 8 /* 卡片内最多显示行数 */
|
||||
#define WIFI_PW_MAX 63
|
||||
@@ -79,6 +82,7 @@ int g_wifi_open = 0;
|
||||
static int g_wifi_mode; /* 0=列表 1=密码输入 */
|
||||
static int g_wifi_dev = -1; /* 无线设备索引,-1 = 无 */
|
||||
static int g_wifi_scanning;
|
||||
static int g_wifi_guest; /* 1 = 结果来自 Linux 客户机 iw,不是原生网卡 */
|
||||
static int g_wifi_n; /* 缓存的扫描结果数 */
|
||||
static int g_wifi_sel = -1;
|
||||
static char g_wifi_sel_ssid[33];
|
||||
@@ -103,6 +107,43 @@ static void *wifi_slot(u32 slot_off) {
|
||||
return (void *)(unsigned long)fn;
|
||||
}
|
||||
|
||||
/* 与 dkm_net_device_info 同布局:name 指针、6 字节 MAC、对齐后的 flags。 */
|
||||
typedef struct tray_netdev {
|
||||
const char *name;
|
||||
u8 mac[6];
|
||||
u32 flags;
|
||||
} tray_netdev;
|
||||
typedef int (*tray_info_fn)(u32 index, tray_netdev *out);
|
||||
|
||||
static int g_tray_n, g_tray_up, g_tray_wl;
|
||||
|
||||
/* 扫已注册网卡。返回 0 = 计数有效。链路起来的有线口在 QEMU e1000 上应为 1。 */
|
||||
static int tray_net_query(void) {
|
||||
wifi_fn_device_count cnt = (wifi_fn_device_count)wifi_slot(WIFI_NETAPI_DEVICE_COUNT);
|
||||
tray_info_fn info = (tray_info_fn)wifi_slot(WIFI_NETAPI_DEVICE_INFO);
|
||||
if (!cnt) return -1;
|
||||
u32 n = cnt();
|
||||
if (n > 8) n = 8;
|
||||
int up = 0, wl = 0;
|
||||
for (u32 i = 0; i < n; i++) {
|
||||
tray_netdev d;
|
||||
d.flags = 0;
|
||||
if (info && info(i, &d) == 0) {
|
||||
if (d.flags & TRAY_NET_LINK_UP) up++;
|
||||
if (d.flags & TRAY_NET_WIRELESS) wl++;
|
||||
}
|
||||
}
|
||||
if (n != (u32)g_tray_n || up != g_tray_up || wl != g_tray_wl) {
|
||||
g_tray_n = (int)n;
|
||||
g_tray_up = up;
|
||||
g_tray_wl = wl;
|
||||
slog_num("[tray] net devices=", g_tray_n);
|
||||
slog_num("[tray] net link_up=", g_tray_up);
|
||||
slog_num("[tray] net wireless=", g_tray_wl);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 找无线设备;返回 0 = 已定位 g_wifi_dev */
|
||||
static int wifi_dev_find(void) {
|
||||
wifi_fn_device_count cnt = (wifi_fn_device_count)wifi_slot(WIFI_NETAPI_DEVICE_COUNT);
|
||||
@@ -129,6 +170,176 @@ static void wifi_results_pull(void) {
|
||||
g_wifi_n = n;
|
||||
}
|
||||
|
||||
static void wifi_status_set(const char *m) {
|
||||
int i = 0;
|
||||
for (; m[i] && i < 63; i++) g_wifi_status[i] = m[i];
|
||||
g_wifi_status[i] = 0;
|
||||
}
|
||||
|
||||
static int wifi_line_eq_prefix(const char *s, const char *p) {
|
||||
while (*p) {
|
||||
if (*s++ != *p++) return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int wifi_parse_i(const char *s, int *out) {
|
||||
int sign = 1;
|
||||
if (*s == '-') { sign = -1; s++; }
|
||||
if (*s < '0' || *s > '9') return -1;
|
||||
int v = 0;
|
||||
while (*s >= '0' && *s <= '9') {
|
||||
v = v * 10 + (*s - '0');
|
||||
s++;
|
||||
}
|
||||
*out = v * sign;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wifi_hex_nibble(char c) {
|
||||
if (c >= '0' && c <= '9') return c - '0';
|
||||
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
|
||||
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 把一行 iw scan 文本并进当前 BSS。返回 1 表示遇到新的 BSS 头。 */
|
||||
static int g_guest_have;
|
||||
static char g_guest_ssid[33];
|
||||
static u8 g_guest_bssid[6];
|
||||
static u8 g_guest_ch;
|
||||
static signed char g_guest_rssi;
|
||||
static u8 g_guest_sec;
|
||||
|
||||
static void wifi_guest_commit(void) {
|
||||
if (!g_guest_have || !g_guest_ssid[0] || g_wifi_n >= 32) {
|
||||
g_guest_have = 0;
|
||||
return;
|
||||
}
|
||||
wifi_scan_item *it = &g_wifi_items[g_wifi_n];
|
||||
int i = 0;
|
||||
for (; i < 32 && g_guest_ssid[i]; i++) it->ssid[i] = g_guest_ssid[i];
|
||||
it->ssid[i] = 0;
|
||||
for (i = 0; i < 6; i++) it->bssid[i] = g_guest_bssid[i];
|
||||
it->channel = g_guest_ch;
|
||||
it->rssi = g_guest_rssi;
|
||||
it->security = g_guest_sec;
|
||||
g_wifi_n++;
|
||||
g_guest_have = 0;
|
||||
}
|
||||
|
||||
static void wifi_guest_line(const char *s) {
|
||||
while (*s == ' ' || *s == '\t') s++;
|
||||
if (wifi_line_eq_prefix(s, "BSS ")) {
|
||||
wifi_guest_commit();
|
||||
g_guest_have = 1;
|
||||
g_guest_ssid[0] = 0;
|
||||
g_guest_ch = 0;
|
||||
g_guest_rssi = -90;
|
||||
g_guest_sec = 0;
|
||||
for (int i = 0; i < 6; i++) g_guest_bssid[i] = 0;
|
||||
const char *p = s + 4;
|
||||
for (int i = 0; i < 6; i++) {
|
||||
int hi = wifi_hex_nibble(p[0]);
|
||||
int lo = wifi_hex_nibble(p[1]);
|
||||
if (hi < 0 || lo < 0) { g_guest_have = 0; return; }
|
||||
g_guest_bssid[i] = (u8)((hi << 4) | lo);
|
||||
p += 2;
|
||||
if (i < 5) {
|
||||
if (*p != ':') { g_guest_have = 0; return; }
|
||||
p++;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!g_guest_have) return;
|
||||
if (wifi_line_eq_prefix(s, "SSID:")) {
|
||||
s += 5;
|
||||
while (*s == ' ') s++;
|
||||
int i = 0;
|
||||
for (; s[i] && s[i] != '\n' && i < 32; i++) g_guest_ssid[i] = s[i];
|
||||
g_guest_ssid[i] = 0;
|
||||
return;
|
||||
}
|
||||
if (wifi_line_eq_prefix(s, "signal:")) {
|
||||
s += 7;
|
||||
while (*s == ' ') s++;
|
||||
int dbm = 0;
|
||||
if (wifi_parse_i(s, &dbm) == 0) {
|
||||
if (dbm < -128) dbm = -128;
|
||||
if (dbm > 127) dbm = 127;
|
||||
g_guest_rssi = (signed char)dbm;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (wifi_line_eq_prefix(s, "freq:")) {
|
||||
s += 5;
|
||||
while (*s == ' ') s++;
|
||||
int freq = 0;
|
||||
if (wifi_parse_i(s, &freq) == 0) {
|
||||
int ch = 0;
|
||||
if (freq >= 2412 && freq <= 2472) ch = (freq - 2407) / 5;
|
||||
else if (freq >= 5180 && freq <= 5885) ch = (freq - 5000) / 5;
|
||||
if (ch > 0 && ch < 256) g_guest_ch = (u8)ch;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (wifi_line_eq_prefix(s, "RSN:")) g_guest_sec = 3; /* WPA2 */
|
||||
else if (wifi_line_eq_prefix(s, "WPA:") && g_guest_sec == 0) g_guest_sec = 2;
|
||||
}
|
||||
|
||||
/* 客户机里跑 iw。没有 wlan0 或客户机没起来时返回负值,不填假热点。 */
|
||||
static int wifi_guest_scan(void) {
|
||||
g_wifi_guest = 0;
|
||||
g_wifi_n = 0;
|
||||
g_guest_have = 0;
|
||||
if (!g_lxc_svc || !g_lxc_svc->is_available || !g_lxc_svc->exec || !g_lxc_svc->file_read)
|
||||
return -1;
|
||||
if (!g_lxc_svc->is_available()) return -1;
|
||||
const char *argv[] = {
|
||||
"sh", "-c",
|
||||
"if ! iw dev wlan0 info >/dev/null 2>&1; then echo NOIF; exit 0; fi; "
|
||||
"iw dev wlan0 scan > /tmp/deshab-wifi.txt 2>/tmp/deshab-wifi.err; echo OK"
|
||||
};
|
||||
char head[8];
|
||||
for (int i = 0; i < 8; i++) head[i] = 0;
|
||||
u64 ec = 0;
|
||||
int rc = g_lxc_svc->exec("/bin/sh", 3, argv, head, 7, 0, &ec);
|
||||
slog_num("[wifi] guest iw rc=", rc);
|
||||
if (rc != 0) return -2;
|
||||
if (head[0] == 'N' && head[1] == 'O') return -3;
|
||||
if (head[0] != 'O') return -2;
|
||||
|
||||
static char chunk[2048];
|
||||
char line[192];
|
||||
int ln = 0;
|
||||
u64 off = 0;
|
||||
for (int part = 0; part < 32; part++) {
|
||||
u64 got = 0;
|
||||
int fr = g_lxc_svc->file_read("/tmp/deshab-wifi.txt", off, chunk, sizeof(chunk), &got, 0);
|
||||
if (fr != 0 || got == 0) break;
|
||||
for (u64 i = 0; i < got; i++) {
|
||||
char c = chunk[i];
|
||||
if (c == '\n' || ln >= (int)sizeof(line) - 1) {
|
||||
line[ln] = 0;
|
||||
if (ln) wifi_guest_line(line);
|
||||
ln = 0;
|
||||
} else if (c != '\r') {
|
||||
line[ln++] = c;
|
||||
}
|
||||
}
|
||||
off += got;
|
||||
}
|
||||
if (ln) {
|
||||
line[ln] = 0;
|
||||
wifi_guest_line(line);
|
||||
}
|
||||
wifi_guest_commit();
|
||||
g_wifi_guest = 1;
|
||||
slog_num("[wifi] guest aps=", g_wifi_n);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* 打开卡片并踢一脚扫描 */
|
||||
static void wifi_card_open(void) {
|
||||
g_wifi_open = 1;
|
||||
@@ -137,13 +348,32 @@ static void wifi_card_open(void) {
|
||||
g_wifi_pw[0] = 0;
|
||||
g_wifi_status[0] = 0;
|
||||
g_wifi_n = 0;
|
||||
g_wifi_guest = 0;
|
||||
g_wifi_scanning = 1;
|
||||
tray_net_query();
|
||||
if (wifi_dev_find() != 0) {
|
||||
g_wifi_scanning = 0;
|
||||
const char *m = "未检测到无线网卡";
|
||||
int i = 0;
|
||||
for (; m[i]; i++) g_wifi_status[i] = m[i];
|
||||
g_wifi_status[i] = 0;
|
||||
int grc = wifi_guest_scan();
|
||||
if (grc == 0) {
|
||||
if (g_wifi_n == 0) wifi_status_set("未发现网络");
|
||||
else wifi_status_set("来自客户机");
|
||||
return;
|
||||
}
|
||||
if (grc == -3) {
|
||||
wifi_status_set("客户机无无线接口");
|
||||
slog("[wifi] guest has no wlan0");
|
||||
return;
|
||||
}
|
||||
if (grc == -2) {
|
||||
wifi_status_set("客户机扫描失败");
|
||||
return;
|
||||
}
|
||||
if (g_tray_up > 0) {
|
||||
wifi_status_set("有线已连接");
|
||||
slog("[wifi] wired link up, no wireless device");
|
||||
return;
|
||||
}
|
||||
wifi_status_set("未检测到无线网卡");
|
||||
slog("[wifi] no wireless device");
|
||||
return;
|
||||
}
|
||||
@@ -160,6 +390,11 @@ static void wifi_card_open(void) {
|
||||
|
||||
/* 发起连接(当前选中网络 + 密码) */
|
||||
static void wifi_connect_go(void) {
|
||||
if (g_wifi_guest) {
|
||||
wifi_status_set("客户机关联未实现");
|
||||
slog("[wifi] guest assoc not implemented");
|
||||
return;
|
||||
}
|
||||
wifi_fn_connect conn = (wifi_fn_connect)wifi_slot(WIFI_NETAPI_CONNECT);
|
||||
if (!conn || g_wifi_dev < 0) return;
|
||||
const char *m = "连接中...";
|
||||
@@ -244,7 +479,7 @@ static void wifi_draw(void) {
|
||||
y += 42;
|
||||
} else {
|
||||
/* ---- 列表模式 ---- */
|
||||
if (g_wifi_dev < 0) {
|
||||
if (g_wifi_dev < 0 && g_wifi_n == 0) {
|
||||
zh_draw_string(&g_fb, g_wifi_status[0] ? g_wifi_status : "无无线设备",
|
||||
cx + 14, y + 8, t->text_dim, 0);
|
||||
y += 34;
|
||||
@@ -371,6 +606,85 @@ int wifi_key(u8 sc, int shift) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* 快速设置卡片(托盘音量按钮弹出:音量/亮度滑块)
|
||||
*
|
||||
* M6 提前落地最小版:du_wf_slider 组件实战。音量接 g_vol(状态),
|
||||
* 亮度接 g_bright(apply_brightness 真实调暗)。拖拽复用主循环
|
||||
* g_drag_slider 通道(卡片绘制时把自己的轨道矩形写进 g_vol_rect/
|
||||
* g_bri_rect,主循环 slider_set 即可作用到卡片滑块)。
|
||||
* ============================================================ */
|
||||
|
||||
int g_qs_open = 0;
|
||||
static int g_qs_card_rect[4];
|
||||
static int g_qs_vol_rect[4]; /* 音量滑块命中区(镜像到 g_vol_rect) */
|
||||
static int g_qs_bri_rect[4]; /* 亮度滑块命中区(镜像到 g_bri_rect) */
|
||||
|
||||
static void qs_draw(void) {
|
||||
if (!g_qs_open) return;
|
||||
const wf_theme *t = tb_theme();
|
||||
int W = (int)g_fb_w;
|
||||
const int CW = 300, CH = 46 + 2 * 58 + 8;
|
||||
|
||||
int cx = g_tb2_vol_rect[0] + g_tb2_vol_rect[2] - CW;
|
||||
if (cx < 8) cx = 8;
|
||||
if (cx + CW > W - 8) cx = W - 8 - CW;
|
||||
int cy = (int)g_fb_h - TB_H - TB_BOTTOM_GAP - CH - 8;
|
||||
|
||||
g_qs_card_rect[0] = cx; g_qs_card_rect[1] = cy;
|
||||
g_qs_card_rect[2] = CW; g_qs_card_rect[3] = CH;
|
||||
du_wf_card(&g_fb, cx, cy, CW, CH, 235, t);
|
||||
|
||||
zh_draw_string(&g_fb, "快速设置", cx + 14, cy + 12, t->text_primary, 0);
|
||||
|
||||
int y = cy + 46;
|
||||
/* 音量行:标签 + 百分比 + 滑块 */
|
||||
{
|
||||
char vb[8];
|
||||
int n = u32dec((u32)g_vol, vb);
|
||||
vb[n] = '%'; vb[n + 1] = 0;
|
||||
zh_draw_string(&g_fb, "音量", cx + 14, y, t->text_secondary, 0);
|
||||
du_draw_string(&g_fb, vb, cx + CW - 14 - (n + 1) * 8, y,
|
||||
t->text_primary, 0, DU_ASCII_STEP);
|
||||
du_wf_slider(&g_fb, cx + 14, y + 22, CW - 28, g_vol, t, g_qs_vol_rect);
|
||||
g_vol_rect[0] = g_qs_vol_rect[0]; g_vol_rect[1] = g_qs_vol_rect[1];
|
||||
g_vol_rect[2] = g_qs_vol_rect[2]; g_vol_rect[3] = g_qs_vol_rect[3];
|
||||
y += 58;
|
||||
}
|
||||
/* 亮度行(真实调暗:apply_brightness 每帧消费 g_bright) */
|
||||
{
|
||||
char vb[8];
|
||||
int n = u32dec((u32)g_bright, vb);
|
||||
vb[n] = '%'; vb[n + 1] = 0;
|
||||
zh_draw_string(&g_fb, "亮度", cx + 14, y, t->text_secondary, 0);
|
||||
du_draw_string(&g_fb, vb, cx + CW - 14 - (n + 1) * 8, y,
|
||||
t->text_primary, 0, DU_ASCII_STEP);
|
||||
du_wf_slider(&g_fb, cx + 14, y + 22, CW - 28, g_bright, t, g_qs_bri_rect);
|
||||
g_bri_rect[0] = g_qs_bri_rect[0]; g_bri_rect[1] = g_qs_bri_rect[1];
|
||||
g_bri_rect[2] = g_qs_bri_rect[2]; g_bri_rect[3] = g_qs_bri_rect[3];
|
||||
}
|
||||
}
|
||||
|
||||
/* 卡片点击(返回 1 = 已消费;点外部收起并放行) */
|
||||
static int qs_click(int mx, int my) {
|
||||
if (!g_qs_open) return 0;
|
||||
if (!rect_hit(g_qs_card_rect, mx, my)) {
|
||||
g_qs_open = 0;
|
||||
return 0;
|
||||
}
|
||||
if (rect_hit(g_qs_vol_rect, mx, my)) {
|
||||
g_drag_slider = 1;
|
||||
slider_set(g_vol_rect, &g_vol, mx);
|
||||
return 1;
|
||||
}
|
||||
if (rect_hit(g_qs_bri_rect, mx, my)) {
|
||||
g_drag_slider = 2;
|
||||
slider_set(g_bri_rect, &g_bright, mx);
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ---- 开始菜单 logo(textures/startMenuLogo.rgba,加载失败回退字形) ---- */
|
||||
static int g_smlogo_ok = 0;
|
||||
|
||||
@@ -507,7 +821,15 @@ void taskbar_draw(void) {
|
||||
g_tb2_net_rect[0] = x; g_tb2_net_rect[1] = iy;
|
||||
g_tb2_net_rect[2] = TB_BTN; g_tb2_net_rect[3] = TB_BTN;
|
||||
du_wf_icon_button(&g_fb, x, iy, TB_BTN, t, tb_hover_state(g_tb2_net_rect));
|
||||
du_wf_icon(&g_fb, WF_ICON_NETWORK, x + (TB_BTN - 20) / 2, iy + (TB_BTN - 20) / 2, 20, t->text_primary);
|
||||
tray_net_query();
|
||||
{
|
||||
u32 col = g_tray_up > 0 ? t->accent : t->text_dim;
|
||||
int ix = x + (TB_BTN - 20) / 2;
|
||||
int iy2 = iy + (TB_BTN - 20) / 2;
|
||||
du_wf_icon(&g_fb, WF_ICON_NETWORK, ix, iy2, 20, col);
|
||||
if (g_tray_n == 0 || g_tray_up == 0)
|
||||
du_wf_line(&g_fb, ix + 2, iy2 + 18, ix + 18, iy2 + 2, 2, col);
|
||||
}
|
||||
x += TB_BTN + 2;
|
||||
|
||||
g_tb2_vol_rect[0] = x; g_tb2_vol_rect[1] = iy;
|
||||
@@ -533,8 +855,12 @@ void taskbar_draw(void) {
|
||||
g_tb2_tray_rect[0] = tx; g_tb2_tray_rect[1] = by;
|
||||
g_tb2_tray_rect[2] = tray_w; g_tb2_tray_rect[3] = TB_H;
|
||||
|
||||
/* 快速设置卡片(音量/亮度) */
|
||||
qs_draw();
|
||||
/* WiFi 快捷卡片(最顶) */
|
||||
wifi_draw();
|
||||
/* M3: 开始菜单(叠加在一切之上) */
|
||||
startmenu_draw();
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
@@ -542,9 +868,14 @@ void taskbar_draw(void) {
|
||||
* ============================================================ */
|
||||
|
||||
int taskbar_click(int mx, int my) {
|
||||
/* M3: 开始菜单(打开时优先消费;点面板外关闭并放行) */
|
||||
if (g_sm_open) {
|
||||
if (startmenu_click(mx, my)) return 1;
|
||||
if (rect_hit(g_tb2_start_rect, mx, my)) return 1; /* 已在 click 内关闭 */
|
||||
}
|
||||
/* 主任务栏 */
|
||||
if (rect_hit(g_tb2_start_rect, mx, my)) {
|
||||
slog("[taskbar] start button (start menu: M3)");
|
||||
startmenu_toggle();
|
||||
return 1;
|
||||
}
|
||||
if (rect_hit(g_tb2_tv_rect, mx, my)) {
|
||||
@@ -567,6 +898,8 @@ int taskbar_click(int mx, int my) {
|
||||
}
|
||||
/* WiFi 卡片(打开时优先消费;点外部收起并放行点击) */
|
||||
if (g_wifi_open) wifi_click(mx, my);
|
||||
/* 快速设置卡片(打开时优先消费;点外部收起并放行点击) */
|
||||
if (g_qs_open) qs_click(mx, my);
|
||||
|
||||
/* 托盘 */
|
||||
if (rect_hit(g_tb2_pwr_rect, mx, my)) {
|
||||
@@ -575,12 +908,16 @@ int taskbar_click(int mx, int my) {
|
||||
}
|
||||
if (rect_hit(g_tb2_net_rect, mx, my)) {
|
||||
/* 网络:弹出/收起 WiFi 快捷卡片(扫描 → 选网 → 密码 → 连接) */
|
||||
g_qs_open = 0;
|
||||
if (g_wifi_open) g_wifi_open = 0;
|
||||
else wifi_card_open();
|
||||
return 1;
|
||||
}
|
||||
if (rect_hit(g_tb2_vol_rect, mx, my)) {
|
||||
slog("[taskbar] volume (quick settings: M6)");
|
||||
/* 音量:弹出/收起快速设置卡片(音量/亮度滑块) */
|
||||
g_wifi_open = 0;
|
||||
if (g_qs_open) g_qs_open = 0;
|
||||
else g_qs_open = 1;
|
||||
return 1;
|
||||
}
|
||||
if (rect_hit(g_tb2_clk_rect, mx, my)) {
|
||||
|
||||
Reference in New Issue
Block a user