diff --git a/res/img/monochrome.ico b/res/img/monochrome.ico new file mode 100644 index 0000000..6324ab8 Binary files /dev/null and b/res/img/monochrome.ico differ diff --git a/res/img/monochrome.png b/res/img/monochrome.png new file mode 100644 index 0000000..5f9d0d7 Binary files /dev/null and b/res/img/monochrome.png differ diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index 4404692..7868f33 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -20,8 +20,8 @@ declare global { var launcher: AutoLaunch; var vectorConfig: Record; var trayConfig: { - // eslint-disable-next-line camelcase - icon_path: string; + color_icon_path: string; // eslint-disable-line camelcase + monochrome_icon_path: string; // eslint-disable-line camelcase brand: string; }; var store: Store<{ @@ -31,6 +31,7 @@ declare global { autoHideMenuBar?: boolean; locale?: string | string[]; disableHardwareAcceleration?: boolean; + monochrome?: boolean; }>; } /* eslint-enable no-var */ diff --git a/src/electron-main.ts b/src/electron-main.ts index febd87b..9ff8f8f 100644 --- a/src/electron-main.ts +++ b/src/electron-main.ts @@ -212,9 +212,11 @@ async function setupGlobals(): Promise { // The tray icon // It's important to call `path.join` so we don't end up with the packaged asar in the final path. - const iconFile = `element.${process.platform === "win32" ? "ico" : "png"}`; + const colorIconFile = `element.${process.platform === "win32" ? "ico" : "png"}`; + const monochromeIconFile = `monochrome.${process.platform === "win32" ? "ico" : "png"}`; global.trayConfig = { - icon_path: path.join(resPath, "img", iconFile), + monochrome_icon_path: path.join(resPath, "img", monochromeIconFile), + color_icon_path: path.join(resPath, "img", colorIconFile), brand: global.vectorConfig.brand || "Element", }; @@ -453,7 +455,7 @@ app.on("ready", async () => { titleBarStyle: process.platform === "darwin" ? "hidden" : "default", trafficLightPosition: { x: 9, y: 8 }, - icon: global.trayConfig.icon_path, + icon: global.trayConfig.color_icon_path, show: false, autoHideMenuBar: global.store.get("autoHideMenuBar", true), diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 2bdb0bc..cc776da 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -14,6 +14,7 @@ "redo": "Redo", "select_all": "Select All", "show_hide": "Show/Hide", + "toggle_monochrome": "Monochrome Icon", "undo": "Undo", "zoom_in": "Zoom In", "zoom_out": "Zoom Out" diff --git a/src/tray.ts b/src/tray.ts index 339ca83..f633380 100644 --- a/src/tray.ts +++ b/src/tray.ts @@ -38,8 +38,20 @@ function toggleWin(): void { } } +function toggleMonochrome(): void { + const monochrome = !isMonochrome(); + if (monochrome) { + trayIcon?.setImage(nativeImage.createFromPath(global.trayConfig.monochrome_icon_path)); + } else { + trayIcon?.setImage(nativeImage.createFromPath(global.trayConfig.color_icon_path)); + } + global.store.set("monochrome", monochrome); + initApplicationMenu(); +} + interface IConfig { - icon_path: string; // eslint-disable-line camelcase + color_icon_path: string; // eslint-disable-line camelcase + monochrome_icon_path: string; // eslint-disable-line camelcase brand: string; } @@ -49,10 +61,16 @@ function getUuid(): string { return global.vectorConfig["uuid"] || "eba84003-e499-4563-8e9d-166e34b5cc25"; } +function isMonochrome(): boolean { + return global.store.get("monochrome", process.platform === "linux"); +} + export function create(config: IConfig): void { // no trays on darwin if (process.platform === "darwin" || trayIcon) return; - const defaultIcon = nativeImage.createFromPath(config.icon_path); + const defaultIcon = nativeImage.createFromPath( + isMonochrome() ? config.monochrome_icon_path : config.color_icon_path, + ); let guid: string | undefined; if (process.platform === "win32" && app.isPackaged) { @@ -114,6 +132,12 @@ export function initApplicationMenu(): void { } const contextMenu = Menu.buildFromTemplate([ + { + label: _t("action|toggle_monochrome"), + click: toggleMonochrome, + type: "checkbox", + checked: isMonochrome(), + }, { label: _t("action|show_hide"), click: toggleWin,