183 lines
7.5 KiB
Plaintext
183 lines
7.5 KiB
Plaintext
|
|
#!/bin/bash
|
|||
|
|
# 由 KasmVNC base 的 openbox 会话在桌面就绪后执行(以 app 用户身份)。
|
|||
|
|
# v1.2.0 多应用:实例承载的应用(微信/Telegram/Chromium/自定义)由面板写入容器环境 WOC_APP_TYPE,
|
|||
|
|
# 再由 02-woc-app 钩子落到数据卷 /config/.woc-app。本脚本据此等待对应应用就绪并常驻拉起
|
|||
|
|
# (关窗自动重开;更新后从新版本路径重启)。读不到类型 → 回退微信,老实例零改动。
|
|||
|
|
|
|||
|
|
set -u
|
|||
|
|
|
|||
|
|
# 容器内无 GPU,强制软件渲染
|
|||
|
|
export LIBGL_ALWAYS_SOFTWARE=1
|
|||
|
|
|
|||
|
|
# 解析本实例应用类型与启动信息(APP_BIN / APP_LAUNCH / APP_NAME)
|
|||
|
|
APP_TYPE=wechat
|
|||
|
|
# shellcheck source=/dev/null
|
|||
|
|
[ -f /config/.woc-app ] && . /config/.woc-app 2>/dev/null || true
|
|||
|
|
APP_TYPE="${WOC_APP_TYPE:-wechat}"
|
|||
|
|
# shellcheck source=/dev/null
|
|||
|
|
. /woc/app-defs.sh
|
|||
|
|
woc_app_def "$APP_TYPE"
|
|||
|
|
|
|||
|
|
# 深色模式(实例环境 WOC_DARK=1 时;由面板顶栏主题开关持久化、经容器环境下发,改后需重启实例生效)。
|
|||
|
|
# 仅浏览器(Chromium):加 --force-dark-mode 让其 UI + 网页走深色——这是极简容器里实测唯一稳的办法。
|
|||
|
|
# 微信:内核虽是 Chromium 但不吃命令行参数,也不订阅桌面 portal 的 color-scheme 信号(实测 portal 方案在
|
|||
|
|
# 极简容器里 session 总线不稳、微信也不跟随),故本开关对微信无效;微信深色请在微信「设置→通用→深色模式」
|
|||
|
|
# 里手动选(设置随数据卷持久化)。
|
|||
|
|
if { [ "${WOC_DARK:-}" = "1" ] || [ "${WOC_DARK:-}" = "true" ]; } && [ "$APP_TYPE" = "chromium" ]; then
|
|||
|
|
APP_LAUNCH="${APP_LAUNCH} --force-dark-mode --enable-features=WebContentsForceDark"
|
|||
|
|
echo "[autostart] 浏览器深色已启用(--force-dark-mode)"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 防“最小化后丢失”:本桌面(openbox)无任务栏,窗口被最小化就无处恢复 → 黑屏。
|
|||
|
|
# 看守进程:每 2s 把“被最小化(不可见)”的顶层窗口重新激活,相当于禁用最小化。对任意应用通用。
|
|||
|
|
(
|
|||
|
|
export DISPLAY="${DISPLAY:-:1}"
|
|||
|
|
while sleep 2; do
|
|||
|
|
all=$(xdotool search --name '.+' 2>/dev/null) || continue
|
|||
|
|
vis=$(xdotool search --onlyvisible --name '.+' 2>/dev/null)
|
|||
|
|
for w in ${all}; do
|
|||
|
|
printf '%s\n' "${vis}" | grep -qx "${w}" || xdotool windowactivate "${w}" 2>/dev/null || true
|
|||
|
|
done
|
|||
|
|
done
|
|||
|
|
) &
|
|||
|
|
|
|||
|
|
# 自定义应用若未配置启动命令,给出提示并退出(避免空等)
|
|||
|
|
if [ "$APP_TYPE" = "custom" ] && [ -z "${APP_LAUNCH:-}" ]; then
|
|||
|
|
echo "[autostart] 自定义应用尚未配置启动命令,请在面板「数据卷」上传安装包并设定后重启实例"
|
|||
|
|
exit 0
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 1) 应用壁纸(若用户设置了自定义背景图)。
|
|||
|
|
# 关键:Xvnc 启动时是默认分辨率,浏览器连上后 KasmVNC 会 resize-remote 到浏览器尺寸。若只在启动时设一次,
|
|||
|
|
# 屏幕一变大,X 会把当时设的小尺寸 root pixmap【平铺】填满新屏(表现为壁纸被 2×2 平铺,见 issue 反馈)。
|
|||
|
|
# 故用看守:每 2s 检查分辨率,一变就用 --zoom(填充裁切、保持比例)重设壁纸。也顺带跟随面板对壁纸文件的改动。
|
|||
|
|
WALLPAPER_FILE="/config/.wallpaper"
|
|||
|
|
WALLPAPER_DIR="/config/backgrounds"
|
|||
|
|
(
|
|||
|
|
export DISPLAY="${DISPLAY:-:1}"
|
|||
|
|
last=""
|
|||
|
|
while sleep 2; do
|
|||
|
|
[ -f "$WALLPAPER_FILE" ] || { last=""; continue; }
|
|||
|
|
wp=$(cat "$WALLPAPER_FILE" 2>/dev/null) || continue
|
|||
|
|
[ -n "$wp" ] && [ -f "$WALLPAPER_DIR/$wp" ] || { last=""; continue; }
|
|||
|
|
# 用「分辨率 + 壁纸名」做签名:分辨率变(resize)或换了壁纸都会重设
|
|||
|
|
sig="${wp}@$(xrandr 2>/dev/null | grep -o '[0-9]\+x[0-9]\+' | head -1)"
|
|||
|
|
if [ "$sig" != "$last" ]; then
|
|||
|
|
last="$sig"
|
|||
|
|
xwallpaper --zoom "$WALLPAPER_DIR/$wp" 2>/dev/null && echo "[autostart] 壁纸已应用/重设: $sig"
|
|||
|
|
fi
|
|||
|
|
done
|
|||
|
|
) &
|
|||
|
|
|
|||
|
|
# 2) 应用自定义字体(若用户设置了)
|
|||
|
|
# 从持久卷恢复系统级 fontconfig 配置(跨越容器重建)
|
|||
|
|
if [ -f /config/.woc-fc-local.conf ]; then
|
|||
|
|
cp /config/.woc-fc-local.conf /etc/fonts/local.conf
|
|||
|
|
echo "[autostart] 系统字体配置已恢复"
|
|||
|
|
fi
|
|||
|
|
# 确保 ~/.local/share/fonts → /config/.fonts symlink 存在(旧容器升级兼容)
|
|||
|
|
mkdir -p /config/.fonts 2>/dev/null || true
|
|||
|
|
if [ ! -L /config/.local/share/fonts ] && [ ! -d /config/.local/share/fonts ]; then
|
|||
|
|
mkdir -p /config/.local/share 2>/dev/null || true
|
|||
|
|
ln -sfn /config/.fonts /config/.local/share/fonts 2>/dev/null || true
|
|||
|
|
fi
|
|||
|
|
FONT_CONF="/config/.config/fontconfig/fonts.conf"
|
|||
|
|
FONT_FAMILY_FILE="/config/.woc-font-family"
|
|||
|
|
if [ -f "$FONT_FAMILY_FILE" ]; then
|
|||
|
|
family=$(cat "$FONT_FAMILY_FILE")
|
|||
|
|
if [ -n "$family" ]; then
|
|||
|
|
mkdir -p "$(dirname "$FONT_CONF")" 2>/dev/null || true
|
|||
|
|
cat > "$FONT_CONF" << EOF
|
|||
|
|
<?xml version="1.0"?>
|
|||
|
|
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
|
|||
|
|
<fontconfig>
|
|||
|
|
<!-- generic families -->
|
|||
|
|
<alias>
|
|||
|
|
<family>sans-serif</family>
|
|||
|
|
<prefer><family>${family}</family></prefer>
|
|||
|
|
</alias>
|
|||
|
|
<alias>
|
|||
|
|
<family>serif</family>
|
|||
|
|
<prefer><family>${family}</family></prefer>
|
|||
|
|
</alias>
|
|||
|
|
<alias>
|
|||
|
|
<family>monospace</family>
|
|||
|
|
<prefer><family>${family}</family></prefer>
|
|||
|
|
</alias>
|
|||
|
|
<!-- system CJK fonts that WeChat/CEF may request -->
|
|||
|
|
<alias>
|
|||
|
|
<family>WenQuanYi Micro Hei</family>
|
|||
|
|
<prefer><family>${family}</family></prefer>
|
|||
|
|
</alias>
|
|||
|
|
<alias>
|
|||
|
|
<family>WenQuanYi Zen Hei</family>
|
|||
|
|
<prefer><family>${family}</family></prefer>
|
|||
|
|
</alias>
|
|||
|
|
<alias>
|
|||
|
|
<family>Noto Sans CJK SC</family>
|
|||
|
|
<prefer><family>${family}</family></prefer>
|
|||
|
|
</alias>
|
|||
|
|
<alias>
|
|||
|
|
<family>Noto Sans CJK</family>
|
|||
|
|
<prefer><family>${family}</family></prefer>
|
|||
|
|
</alias>
|
|||
|
|
<!-- force user font for any zh text regardless of requested family -->
|
|||
|
|
<match target="pattern">
|
|||
|
|
<test name="lang" compare="contains"><string>zh</string></test>
|
|||
|
|
<edit name="family" mode="prepend" binding="strong"><string>${family}</string></edit>
|
|||
|
|
</match>
|
|||
|
|
</fontconfig>
|
|||
|
|
EOF
|
|||
|
|
echo "[autostart] 自定义字体已恢复: ${family}"
|
|||
|
|
fc-cache -f 2>/dev/null || true
|
|||
|
|
fi
|
|||
|
|
elif [ -f "$FONT_CONF" ]; then
|
|||
|
|
echo "[autostart] 自定义字体配置已就绪"
|
|||
|
|
fc-cache -f 2>/dev/null || true
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 3) 启动 xsettingsd(让 GTK/Qt 应用实时响应字体/DPI 等 XSETTINGS 变更,无需重启)
|
|||
|
|
XSETTINGS_CONF="/config/.xsettingsd"
|
|||
|
|
if command -v xsettingsd >/dev/null 2>&1; then
|
|||
|
|
XSETTINGS_FONT="WenQuanYi Micro Hei"
|
|||
|
|
# 若用户保存了字体偏好,优先使用
|
|||
|
|
if [ -f "$FONT_FAMILY_FILE" ]; then
|
|||
|
|
family=$(cat "$FONT_FAMILY_FILE")
|
|||
|
|
[ -n "$family" ] && XSETTINGS_FONT="$family"
|
|||
|
|
fi
|
|||
|
|
cat > "${XSETTINGS_CONF}" << EOF
|
|||
|
|
Xft/Antialias 1
|
|||
|
|
Xft/Hinting 1
|
|||
|
|
Xft/HintStyle "hintslight"
|
|||
|
|
Xft/RGBA "rgb"
|
|||
|
|
Xft/DPI 96
|
|||
|
|
Gtk/FontName "${XSETTINGS_FONT} 10"
|
|||
|
|
EOF
|
|||
|
|
xsettingsd --config="${XSETTINGS_CONF}" 2>/dev/null &
|
|||
|
|
echo "[autostart] xsettingsd 已启动"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 4) 等待应用安装就绪(首次需在面板点「下载并安装」)
|
|||
|
|
notified=0
|
|||
|
|
while [ -n "${APP_BIN:-}" ] && [ ! -x "${APP_BIN}" ]; do
|
|||
|
|
if [ "${notified}" -eq 0 ]; then
|
|||
|
|
echo "[autostart] ${APP_NAME} 尚未安装,等待面板触发下载…(首次使用请在面板点「下载并安装」)"
|
|||
|
|
notified=1
|
|||
|
|
fi
|
|||
|
|
sleep 2
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
# 3) 常驻拉起应用
|
|||
|
|
while true; do
|
|||
|
|
if [ -n "${APP_BIN:-}" ] && [ ! -x "${APP_BIN}" ]; then
|
|||
|
|
# 更新过程中本体被临时挪走,等就位再继续
|
|||
|
|
sleep 2
|
|||
|
|
continue
|
|||
|
|
fi
|
|||
|
|
echo "[autostart] 启动 ${APP_NAME}: ${APP_LAUNCH}"
|
|||
|
|
# APP_LAUNCH 可带参数,按 word-split 执行(各应用参数均不含空格,见 app-defs.sh)
|
|||
|
|
${APP_LAUNCH}
|
|||
|
|
echo "[autostart] ${APP_NAME} 已退出,2 秒后重启"
|
|||
|
|
sleep 2
|
|||
|
|
done
|