|
175 | 175 | } |
176 | 176 | return originalExec.apply(this, [command, options, callback]) |
177 | 177 | } |
| 178 | + |
| 179 | + { |
| 180 | + class CheckDark { |
| 181 | + // 监听gsettings monitor org.gnome.desktop.interface gtk-theme |
| 182 | + monitorTheme(callback) { |
| 183 | + try { |
| 184 | + if (this.callback) { |
| 185 | + this.callback = callback |
| 186 | + return; |
| 187 | + } |
| 188 | + this.callback = callback |
| 189 | + let monitor = null; |
| 190 | + const { DESKTOP_SESSION } = process.env; |
| 191 | + switch (DESKTOP_SESSION) { |
| 192 | + case "deepin": |
| 193 | + monitor = spawn("gsettings", [ |
| 194 | + "monitor", |
| 195 | + "com.deepin.dde.appearance", |
| 196 | + "gtk-theme", |
| 197 | + ]); |
| 198 | + break; |
| 199 | + case "gnome": |
| 200 | + case "gnome-classic": |
| 201 | + monitor = spawn("gsettings", [ |
| 202 | + "monitor", |
| 203 | + "org.gnome.desktop.interface", |
| 204 | + this.gnomeScheme, |
| 205 | + ]); |
| 206 | + break; |
| 207 | + default: |
| 208 | + console.warn( |
| 209 | + `NOT SUPPORTED !!! DESKTOP_SESSION: ${DESKTOP_SESSION}` |
| 210 | + ); |
| 211 | + break; |
| 212 | + } |
| 213 | + monitor && |
| 214 | + monitor.on("error", (err) => { |
| 215 | + console.error("monitorTheme", err); |
| 216 | + }); |
| 217 | + monitor && |
| 218 | + monitor.stdout.on("data", (chunk) => { |
| 219 | + // TODO: 防抖动包装 |
| 220 | + const data = chunk.toString(); |
| 221 | + const isDark = data.toLowerCase().includes("dark"); |
| 222 | + this.callback(isDark) |
| 223 | + }); |
| 224 | + process.on("SIGTERM", (signal) => { |
| 225 | + monitor.kill(signal); |
| 226 | + }); |
| 227 | + } catch (err) { |
| 228 | + console.error("尝试监听主题失败!", err); |
| 229 | + } |
| 230 | + } |
| 231 | + get isDark() { |
| 232 | + try { |
| 233 | + const { DESKTOP_SESSION } = process.env; |
| 234 | + console.log(DESKTOP_SESSION); |
| 235 | + let theme = ""; |
| 236 | + switch (DESKTOP_SESSION) { |
| 237 | + case "deepin": |
| 238 | + theme = execSync( |
| 239 | + `gsettings get com.deepin.dde.appearance gtk-theme` |
| 240 | + ); |
| 241 | + break; |
| 242 | + case "gnome": |
| 243 | + case "gnome-classic": |
| 244 | + theme = execSync( |
| 245 | + `gsettings get org.gnome.desktop.interface ${this.gnomeScheme}` |
| 246 | + ); |
| 247 | + break; |
| 248 | + |
| 249 | + default: |
| 250 | + console.warn( |
| 251 | + `NOT SUPPORTED !!! DESKTOP_SESSION: ${DESKTOP_SESSION}` |
| 252 | + ); |
| 253 | + break; |
| 254 | + } |
| 255 | + console.log(theme.toString()); |
| 256 | + return theme.toString().toLowerCase().includes("dark"); |
| 257 | + } catch (error) { |
| 258 | + console.error("尝试获取主题信息失败,使用默认暗色"); |
| 259 | + return true; |
| 260 | + } |
| 261 | + } |
| 262 | + get gnomeScheme() { |
| 263 | + try { |
| 264 | + // 判断 Gnome-Shell 版本 from @icepie |
| 265 | + const gnomeVersion = execSync(`gnome-shell --version`) |
| 266 | + .toString() |
| 267 | + .replace(/[\r\n]/g, "") |
| 268 | + .split(" "); |
| 269 | + const gnomeVersionNum = |
| 270 | + gnomeVersion.length == 3 ? Number(gnomeVersion[2]) : 0; |
| 271 | + return gnomeVersionNum >= 42 ? "color-scheme" : "gtk-theme"; |
| 272 | + } catch (err) { |
| 273 | + console.error("检查gnome版本失败, 使用gtk-theme", err); |
| 274 | + return "gtk-theme"; |
| 275 | + } |
| 276 | + } |
| 277 | + } |
| 278 | + const checkDark = new CheckDark() |
| 279 | + const original = MediaQueryList.prototype.addEventListener |
| 280 | + MediaQueryList.prototype.addEventListener = function (...args) { |
| 281 | + console.warn('----------> MediaQueryList.addEventListener:', ...args) |
| 282 | + checkDark.monitorTheme((isDark) => { |
| 283 | + args[1]({ |
| 284 | + matches: isDark |
| 285 | + }) |
| 286 | + }) |
| 287 | + return original.apply(this, args) |
| 288 | + } |
| 289 | + } |
178 | 290 | } catch (error) { |
179 | 291 | process.stderr.write(error.message); |
180 | 292 | process.stderr.write(error.stack); |
|
0 commit comments