feat: accent color support for linix
This commit is contained in:
		
							parent
							
								
									cb7363d682
								
							
						
					
					
						commit
						79835b2f03
					
				
					 5 changed files with 48 additions and 22 deletions
				
			
		|  | @ -13,7 +13,7 @@ import { ICON_PATH, VIEW_DIR } from "shared/paths"; | |||
| 
 | ||||
| import { autoStart } from "./autoStart"; | ||||
| import { DATA_DIR } from "./constants"; | ||||
| import { createWindows } from "./mainWindow"; | ||||
| import { createWindows, getAccentColor } from "./mainWindow"; | ||||
| import { Settings, State } from "./settings"; | ||||
| import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally"; | ||||
| 
 | ||||
|  | @ -49,6 +49,7 @@ export function createFirstLaunchTour() { | |||
|         Settings.store.discordBranch = data.discordBranch; | ||||
|         Settings.store.arRPC = data.richPresence; | ||||
|         Settings.store.tray = true; | ||||
|         Settings.store.trayColor = getAccentColor()?.slice(1); | ||||
| 
 | ||||
|         if (data.autoStart) autoStart.enable(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,17 +7,7 @@ | |||
| if (process.platform === "linux") import("./venmic"); | ||||
| 
 | ||||
| import { execFile } from "child_process"; | ||||
| import { | ||||
|     app, | ||||
|     BrowserWindow, | ||||
|     clipboard, | ||||
|     dialog, | ||||
|     nativeImage, | ||||
|     RelaunchOptions, | ||||
|     session, | ||||
|     shell, | ||||
|     systemPreferences | ||||
| } from "electron"; | ||||
| import { app, BrowserWindow, clipboard, dialog, nativeImage, RelaunchOptions, session, shell } from "electron"; | ||||
| import { mkdirSync, readFileSync, watch } from "fs"; | ||||
| import { open, readFile } from "fs/promises"; | ||||
| import { release } from "os"; | ||||
|  | @ -28,7 +18,7 @@ import { IpcEvents } from "../shared/IpcEvents"; | |||
| import { setBadgeCount } from "./appBadge"; | ||||
| import { autoStart } from "./autoStart"; | ||||
| import { VENCORD_FILES_DIR, VENCORD_QUICKCSS_FILE, VENCORD_THEMES_DIR } from "./constants"; | ||||
| import { mainWin } from "./mainWindow"; | ||||
| import { getAccentColor, mainWin } from "./mainWindow"; | ||||
| import { Settings } from "./settings"; | ||||
| import { | ||||
|     createTrayIcon, | ||||
|  | @ -172,7 +162,7 @@ watch( | |||
| handle(IpcEvents.SET_TRAY_ICON, (_, iconURI) => setTrayIcon(iconURI)); | ||||
| handle(IpcEvents.GET_TRAY_ICON, (_, iconPath) => getTrayIconFile(iconPath)); | ||||
| handleSync(IpcEvents.GET_TRAY_ICON_SYNC, (_, iconPath) => getTrayIconFileSync(iconPath)); | ||||
| handle(IpcEvents.GET_SYSTEM_ACCENT_COLOR, () => `#${systemPreferences.getAccentColor?.() || ""}`); | ||||
| handle(IpcEvents.GET_SYSTEM_ACCENT_COLOR, () => getAccentColor()); | ||||
| handle(IpcEvents.CREATE_TRAY_ICON_RESPONSE, (_, iconName, dataURL, isCustomIcon) => | ||||
|     createTrayIcon(iconName, dataURL, isCustomIcon) | ||||
| ); | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
|  * Copyright (c) 2023 Vendicated and Vencord contributors | ||||
|  */ | ||||
| 
 | ||||
| import { execFileSync } from "child_process"; | ||||
| import { | ||||
|     app, | ||||
|     BrowserWindow, | ||||
|  | @ -14,6 +15,7 @@ import { | |||
|     nativeTheme, | ||||
|     screen, | ||||
|     session, | ||||
|     systemPreferences, | ||||
|     Tray | ||||
| } from "electron"; | ||||
| import { rm } from "fs/promises"; | ||||
|  | @ -503,3 +505,38 @@ export async function createWindows() { | |||
| 
 | ||||
|     initArRPC(); | ||||
| } | ||||
| 
 | ||||
| export function getAccentColor() { | ||||
|     if (process.platform === "linux") { | ||||
|         var accentColor = execFileSync("gdbus", [ | ||||
|             "call", | ||||
|             "--session", | ||||
|             "--dest", | ||||
|             "org.freedesktop.portal.Desktop", | ||||
|             "--object-path", | ||||
|             "/org/freedesktop/portal/desktop", | ||||
|             "--method", | ||||
|             "org.freedesktop.portal.Settings.Read", | ||||
|             "org.freedesktop.appearance", | ||||
|             "accent-color" | ||||
|         ]); | ||||
|         const rgbMatch = accentColor.toString().match(/\((\d+\.\d+),\s*(\d+\.\d+),\s*(\d+\.\d+)\)/); | ||||
| 
 | ||||
|         if (rgbMatch) { | ||||
|             const r = parseFloat(rgbMatch[1]); | ||||
|             const g = parseFloat(rgbMatch[2]); | ||||
|             const b = parseFloat(rgbMatch[3]); | ||||
| 
 | ||||
|             const r255 = Math.round(r * 255); | ||||
|             const g255 = Math.round(g * 255); | ||||
|             const b255 = Math.round(b * 255); | ||||
| 
 | ||||
|             const toHex = (value: number) => value.toString(16).padStart(2, "0"); | ||||
|             const hexColor = `#${toHex(r255)}${toHex(g255)}${toHex(b255)}`; | ||||
|             return hexColor; | ||||
|         } | ||||
|         return undefined; | ||||
|     } else { | ||||
|         return `#${systemPreferences.getAccentColor?.() || ""}`; | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -11,7 +11,6 @@ import { findByCodeLazy, findByPropsLazy } from "@vencord/types/webpack"; | |||
| import { Button, Forms, Select, Switch, Toasts } from "@vencord/types/webpack/common"; | ||||
| import { setCurrentTrayIcon } from "renderer/patches/tray"; | ||||
| import { useSettings } from "renderer/settings"; | ||||
| import { isLinux } from "renderer/utils"; | ||||
| 
 | ||||
| import { SettingsComponent } from "./Settings"; | ||||
| 
 | ||||
|  | @ -30,10 +29,9 @@ const presets = [ | |||
|     "#FC18EC" // pink
 | ||||
| ]; | ||||
| 
 | ||||
| if (!isLinux) | ||||
|     VesktopNative.app.getAccentColor().then(color => { | ||||
|         if (color) presets.unshift(color); | ||||
|     }); | ||||
| VesktopNative.app.getAccentColor().then(color => { | ||||
|     if (color) presets.unshift(color); | ||||
| }); | ||||
| 
 | ||||
| const statusToSettingsKey = { | ||||
|     icon: { key: "trayMainOverride", label: "Main Icon" }, | ||||
|  |  | |||
|  | @ -27,8 +27,8 @@ export function setCurrentTrayIcon() { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| function changeColorsInSvg(svg: string, stockColor: string, isBadge: boolean = false) { | ||||
|     const pickedColor = VesktopNative.settings.get().trayColor; | ||||
| function changeColorsInSvg(svg: string, stockColor: string) { | ||||
|     const pickedColor = VesktopNative.settings.get().trayColor || VesktopNative.app.getAccentColor(); | ||||
|     const fillColor = VesktopNative.settings.get().trayAutoFill ?? "auto"; | ||||
|     const reg = new RegExp(stockColor, "gim"); | ||||
|     svg = svg.replace(reg, "#" + (pickedColor ?? stockColor)); | ||||
|  | @ -65,7 +65,7 @@ VesktopNative.tray.createIconRequest(async (iconName: string) => { | |||
| 
 | ||||
| VesktopNative.tray.addBadgeToIcon(async (iconDataURL: string, badgeDataSVG: string) => { | ||||
|     const fillColor = VesktopNative.settings.get().trayAutoFill ?? "white"; | ||||
|     badgeDataSVG = changeColorsInSvg(badgeDataSVG, "#F35959", true); | ||||
|     badgeDataSVG = changeColorsInSvg(badgeDataSVG, "#F35959"); | ||||
|     if (fillColor !== "auto") badgeDataSVG = badgeDataSVG.replace(/white/gim, fillColor); | ||||
| 
 | ||||
|     const canvas = document.createElement("canvas"); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Oleh Polisan
						Oleh Polisan