diff --git a/.gitignore b/.gitignore index d018f3b251..4c9c3c8165 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ locales/**/**.js lens.log static/build static/types +build/tray/ binaries/client/ binaries/server/ src/extensions/*/*.js diff --git a/Makefile b/Makefile index 6db96fbc2b..1199ee381d 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ compile-dev: node_modules ci-validate-dev: binaries/client build-extensions compile-dev .PHONY: dev -dev: binaries/client build-extensions +dev: binaries/client build/tray/trayIconTemplate.png build-extensions rm -rf static/build/ yarn dev @@ -53,7 +53,7 @@ integration: build yarn integration .PHONY: build -build: node_modules binaries/client +build: node_modules binaries/client build/tray/trayIconTemplate.png yarn run npm:fix-build-version $(MAKE) build-extensions -B yarn run compile @@ -70,6 +70,9 @@ $(extension_node_modules): node_modules $(extension_dists): src/extensions/npm/extensions/dist $(extension_node_modules) cd $(@:/dist=) && ../../node_modules/.bin/npm run build +build/tray/trayIconTemplate.png: node_modules + yarn ts-node ./build/generate-tray-icons.ts + .PHONY: clean-old-extensions clean-old-extensions: find ./extensions -mindepth 1 -maxdepth 1 -type d '!' -exec test -e '{}/package.json' \; -exec rm -rf {} \; @@ -126,6 +129,7 @@ clean: clean-npm clean-extensions rm -rf binaries/client rm -rf dist rm -rf static/build + rm -rf build/tray rm -rf node_modules rm -rf site rm -rf docs/extensions/api diff --git a/build/generate-tray-icons.ts b/build/generate-tray-icons.ts new file mode 100644 index 0000000000..c09ab6320d --- /dev/null +++ b/build/generate-tray-icons.ts @@ -0,0 +1,50 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { readFileSync } from "fs"; +import { ensureDirSync } from "fs-extra"; +import { JSDOM } from "jsdom"; +import path from "path"; +import sharp from "sharp"; + +const size = Number(process.env.OUTPUT_SIZE || "16"); +const outputFolder = process.env.OUTPUT_DIR || "./build/tray"; +const inputFile = process.env.INPUT_SVG_PATH || "./src/renderer/components/icon/logo-lens.svg"; + +const svgData = readFileSync(inputFile, { encoding: "utf-8" }); +const svgDom = new JSDOM(`
${svgData}`); +const svgRoot = svgDom.window.document.body.getElementsByTagName("svg")[0]; + +svgRoot.innerHTML += ``; +const lightTemplate = svgRoot.outerHTML; + +svgRoot.innerHTML += ``; + +const darkTemplate = svgRoot.outerHTML; + +console.log("Generating tray icon pngs"); + +ensureDirSync(outputFolder); + +Promise.allSettled([ + sharp(Buffer.from(darkTemplate)) + .resize({ width: size, height: size }) + .png() + .toFile(path.join(outputFolder, "trayIconDarkTemplate.png")), + sharp(Buffer.from(darkTemplate)) + .resize({ width: size*2, height: size*2 }) + .png() + .toFile(path.join(outputFolder, "trayIconDarkTemplate@2x.png")), + sharp(Buffer.from(lightTemplate)) + .resize({ width: size, height: size }) + .png() + .toFile(path.join(outputFolder, "trayIconTemplate.png")), + sharp(Buffer.from(lightTemplate)) + .resize({ width: size*2, height: size*2 }) + .png() + .toFile(path.join(outputFolder, "trayIconTemplate@2x.png")), +]) + .then(console.log) + .catch(console.error); diff --git a/package.json b/package.json index 0b8c5a6abf..373802ca80 100644 --- a/package.json +++ b/package.json @@ -124,9 +124,6 @@ "rpm", "AppImage" ], - "asarUnpack": [ - "**/node_modules/sharp/**" - ], "extraResources": [ { "from": "binaries/client/linux/${arch}/kubectl", @@ -263,7 +260,6 @@ "rfc6902": "^4.0.2", "selfsigned": "^2.0.1", "semver": "^7.3.7", - "sharp": "^0.30.3", "shell-env": "^3.0.1", "spdy": "^4.0.2", "tar": "^6.1.11", @@ -325,7 +321,7 @@ "@types/request": "^2.48.7", "@types/request-promise-native": "^1.0.18", "@types/semver": "^7.3.9", - "@types/sharp": "^0.30.0", + "@types/sharp": "^0.30.2", "@types/spdy": "^3.4.5", "@types/tar": "^4.0.5", "@types/tar-stream": "^2.2.2", @@ -392,6 +388,7 @@ "react-window": "^1.8.6", "sass": "^1.51.0", "sass-loader": "^12.6.0", + "sharp": "^0.30.4", "style-loader": "^3.3.1", "tailwindcss": "^3.0.23", "tar-stream": "^2.2.0", diff --git a/src/main/index.ts b/src/main/index.ts index 5b4f965a93..f6c0b1bbc0 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -305,7 +305,7 @@ async function main(di: DiContainer) { onQuitCleanup.push( initMenu(applicationMenuItems), - await initTray(windowManager, trayMenuItems, navigateToPreferences), + initTray(windowManager, trayMenuItems, navigateToPreferences), () => ShellSession.cleanup(), ); diff --git a/src/main/tray/tray.ts b/src/main/tray/tray.ts index af129ac27a..e2c4425f42 100644 --- a/src/main/tray/tray.ts +++ b/src/main/tray/tray.ts @@ -4,22 +4,19 @@ */ import packageInfo from "../../../package.json"; -import type { NativeImage } from "electron"; -import { Menu, nativeImage, nativeTheme, Tray } from "electron"; +import { Menu, Tray } from "electron"; import type { IComputedValue } from "mobx"; import { autorun } from "mobx"; import { showAbout } from "../menu/menu"; import { checkForUpdates, isAutoUpdateEnabled } from "../app-updater"; import type { WindowManager } from "../window-manager"; import logger from "../logger"; -import { isWindows, productName } from "../../common/vars"; +import { isDevelopment, isWindows, productName, staticFilesDirectory } from "../../common/vars"; import { exitApp } from "../exit-app"; import type { Disposer } from "../../common/utils"; -import { base64, disposer, getOrInsertWithAsync, toJS } from "../../common/utils"; +import { disposer, toJS } from "../../common/utils"; import type { TrayMenuRegistration } from "./tray-menu-registration"; -import sharp from "sharp"; -import LogoLens from "../../renderer/components/icon/logo-lens.svg"; -import { JSDOM } from "jsdom"; +import path from "path"; const TRAY_LOG_PREFIX = "[TRAY]"; @@ -27,69 +24,25 @@ const TRAY_LOG_PREFIX = "[TRAY]"; // note: instance of Tray should be saved somewhere, otherwise it disappears export let tray: Tray; -interface CreateTrayIconArgs { - shouldUseDarkColors: boolean; - size: number; - sourceSvg: string; +function getTrayIconPath(): string { + return path.resolve( + staticFilesDirectory, + isDevelopment ? "../build/tray" : "icons", // copied within electron-builder extras + "trayIconTemplate.png", + ); } -const trayIcons = new Map