refactor: 使用更简洁的主题监听方式

This commit is contained in:
msojocs 2025-07-17 20:28:41 +08:00
parent 322de01a35
commit 465af9b79a
3 changed files with 119 additions and 25 deletions

View File

@ -175,6 +175,118 @@
} }
return originalExec.apply(this, [command, options, callback]) return originalExec.apply(this, [command, options, callback])
} }
{
class CheckDark {
// 监听gsettings monitor org.gnome.desktop.interface gtk-theme
monitorTheme(callback) {
try {
if (this.callback) {
this.callback = callback
return;
}
this.callback = callback
let monitor = null;
const { DESKTOP_SESSION } = process.env;
switch (DESKTOP_SESSION) {
case "deepin":
monitor = spawn("gsettings", [
"monitor",
"com.deepin.dde.appearance",
"gtk-theme",
]);
break;
case "gnome":
case "gnome-classic":
monitor = spawn("gsettings", [
"monitor",
"org.gnome.desktop.interface",
this.gnomeScheme,
]);
break;
default:
console.warn(
`NOT SUPPORTED !!! DESKTOP_SESSION: ${DESKTOP_SESSION}`
);
break;
}
monitor &&
monitor.on("error", (err) => {
console.error("monitorTheme", err);
});
monitor &&
monitor.stdout.on("data", (chunk) => {
// TODO: 防抖动包装
const data = chunk.toString();
const isDark = data.toLowerCase().includes("dark");
this.callback(isDark)
});
process.on("SIGTERM", (signal) => {
monitor.kill(signal);
});
} catch (err) {
console.error("尝试监听主题失败!", err);
}
}
get isDark() {
try {
const { DESKTOP_SESSION } = process.env;
console.log(DESKTOP_SESSION);
let theme = "";
switch (DESKTOP_SESSION) {
case "deepin":
theme = execSync(
`gsettings get com.deepin.dde.appearance gtk-theme`
);
break;
case "gnome":
case "gnome-classic":
theme = execSync(
`gsettings get org.gnome.desktop.interface ${this.gnomeScheme}`
);
break;
default:
console.warn(
`NOT SUPPORTED !!! DESKTOP_SESSION: ${DESKTOP_SESSION}`
);
break;
}
console.log(theme.toString());
return theme.toString().toLowerCase().includes("dark");
} catch (error) {
console.error("尝试获取主题信息失败,使用默认暗色");
return true;
}
}
get gnomeScheme() {
try {
// 判断 Gnome-Shell 版本 from @icepie
const gnomeVersion = execSync(`gnome-shell --version`)
.toString()
.replace(/[\r\n]/g, "")
.split(" ");
const gnomeVersionNum =
gnomeVersion.length == 3 ? Number(gnomeVersion[2]) : 0;
return gnomeVersionNum >= 42 ? "color-scheme" : "gtk-theme";
} catch (err) {
console.error("检查gnome版本失败, 使用gtk-theme", err);
return "gtk-theme";
}
}
}
const checkDark = new CheckDark()
const original = MediaQueryList.prototype.addEventListener
MediaQueryList.prototype.addEventListener = function (...args) {
console.warn('----------> MediaQueryList.addEventListener:', ...args)
checkDark.monitorTheme((isDark) => {
args[1]({
matches: isDark
})
})
return original.apply(this, args)
}
}
} catch (error) { } catch (error) {
process.stderr.write(error.message); process.stderr.write(error.message);
process.stderr.write(error.stack); process.stderr.write(error.stack);

View File

@ -3,7 +3,7 @@ const { execSync, spawn } = require("child_process");
class CheckDark { class CheckDark {
// 监听gsettings monitor org.gnome.desktop.interface gtk-theme // 监听gsettings monitor org.gnome.desktop.interface gtk-theme
monitorTheme() { monitorTheme(callback) {
try { try {
let monitor = null; let monitor = null;
const { DESKTOP_SESSION } = process.env; const { DESKTOP_SESSION } = process.env;
@ -37,11 +37,8 @@ class CheckDark {
monitor.stdout.on("data", (chunk) => { monitor.stdout.on("data", (chunk) => {
// TODO: 防抖动包装 // TODO: 防抖动包装
const data = chunk.toString(); const data = chunk.toString();
const t = data.toLowerCase().includes("dark"); const isDark = data.toLowerCase().includes("dark");
console.log(data); callback(isDark)
console.log("dark", t);
// (this._theme = t ? i.Dark : i.Light),
// this._onDidThemeChange.fire(this._theme);
}); });
process.on("SIGTERM", (signal) => { process.on("SIGTERM", (signal) => {
monitor.kill(signal); monitor.kill(signal);
@ -83,7 +80,7 @@ class CheckDark {
} }
get gnomeScheme() { get gnomeScheme() {
try { try {
// 判断 Gnome-Shell 版本 // 判断 Gnome-Shell 版本 from @icepie
const gnomeVersion = execSync(`gnome-shell --version`) const gnomeVersion = execSync(`gnome-shell --version`)
.toString() .toString()
.replace(/[\r\n]/g, "") .replace(/[\r\n]/g, "")
@ -98,7 +95,9 @@ class CheckDark {
} }
} }
const cd = new CheckDark(); const cd = new CheckDark();
cd.monitorTheme(); cd.monitorTheme((isDark) => {
console.info('is dark:', isDark)
});
console.log(cd.isDark); console.log(cd.isDark);
function original() { function original() {

View File

@ -64,23 +64,6 @@ if [[ "$WINE" != 'true' ]];then
echo $timeStamp > "${package_dir}/.build_time" echo $timeStamp > "${package_dir}/.build_time"
fi fi
# fix theme
notice "fix theme"
find_result=$( grep -lr "OSThemeController=" "$tmp_dir/core.wxvpkg" )
echo "theme: $find_result"
if [[ -n $find_result ]];then
# require of child_process
sed -i 's/"use strict";O/"use strict";const {execSync,spawn}=require("child_process");O/' $find_result
# replace listener to monitor
sed -i 's/this.registerListeners()/this.monitorTheme()/' $find_result
# replace check func
sed -i 's/mediaQuery.matches/isDark/' $find_result
# add functions
sed -i 's#}getDefaultTheme#}get isDark(){try{const{DESKTOP_SESSION}=process.env;console.log(DESKTOP_SESSION);let theme="";switch(DESKTOP_SESSION){case"deepin":theme=execSync(`gsettings get com.deepin.dde.appearance gtk-theme`);break;case"gnome":case"gnome-classic":theme=execSync(`gsettings get org.gnome.desktop.interface ${this.gnomeScheme}`);break;default:break}return theme.includes("dark");}catch(err){console.error("尝试获取主题信息失败,使用默认暗色",err);return true;}}get gnomeScheme(){try{const gnomeVersion=execSync(`gnome-shell --version`).toString().replace(/[\\r\\n]/g,"").split(" ");const gnomeVersionNum=gnomeVersion.length==3?Number(gnomeVersion[2]):0;return gnomeVersionNum>=42?"color-scheme":"gtk-theme";}catch(err){console.error("检查gnome版本失败, 使用gtk-theme", err);return "gtk-theme";}}monitorTheme(){try{let monitor=null;const{DESKTOP_SESSION}=process.env;switch(DESKTOP_SESSION){case"deepin":monitor=spawn("gsettings",["monitor","com.deepin.dde.appearance","gtk-theme",]);break;case"gnome":case"gnome-classic":monitor=spawn("gsettings",["monitor","org.gnome.desktop.interface",this.gnomeScheme,]);break;default:console.warn(`NOT SUPPORTED!!!DESKTOP_SESSION:${DESKTOP_SESSION}`);break}monitor\&\&monitor.on("error",(err)=>{console.error("monitorTheme",err)});monitor\&\&monitor.stdout.on("data",e.debounce((chunk)=>{const data=chunk.toString();const t=data.toLowerCase().includes("dark");(this._theme=t?i.Dark:i.Light),this._onDidThemeChange.fire(this._theme)},400));process.on("SIGTERM",(signal)=>{monitor.kill(signal);});}catch(err){console.error("尝试监听主题失败!", err);}}getDefaultTheme#' $find_result
else
warn "theme位置未找到"
fi
# pack 路径 到 文件 # pack 路径 到 文件
notice "pack" notice "pack"
node "$pack_script" "$tmp_dir/core.wxvpkg" "$package_dir/core.wxvpkg" node "$pack_script" "$tmp_dir/core.wxvpkg" "$package_dir/core.wxvpkg"