From ed41b2588907572eafd957d41646f298033c90a4 Mon Sep 17 00:00:00 2001 From: Francesco Spissu <94986937+francescospissu@users.noreply.github.com> Date: Mon, 18 Jul 2022 09:03:43 +0200 Subject: [PATCH] IDE startup theme based on OS theme (#1160) * add patch for setting IDE startup theme based on OS theme * Patched the default theme behavior. Signed-off-by: Akos Kitta * add custom themes in register Co-authored-by: Akos Kitta --- electron/.gitignore | 1 - electron/build/patch/{ => backend}/main.js | 0 electron/build/patch/frontend/index.js | 59 ++++++++++++++++++++++ electron/build/template-package.json | 4 +- electron/build/webpack.config.js | 10 ++++ electron/packager/index.js | 1 + 6 files changed, 72 insertions(+), 3 deletions(-) rename electron/build/patch/{ => backend}/main.js (100%) create mode 100644 electron/build/patch/frontend/index.js create mode 100644 electron/build/webpack.config.js diff --git a/electron/.gitignore b/electron/.gitignore index b6d34632..9f6844f0 100644 --- a/electron/.gitignore +++ b/electron/.gitignore @@ -6,7 +6,6 @@ working-copy/ src-gen/ node_modules/ build/yarn.lock -webpack.config.js lib/ # The electron-builder output. diff --git a/electron/build/patch/main.js b/electron/build/patch/backend/main.js similarity index 100% rename from electron/build/patch/main.js rename to electron/build/patch/backend/main.js diff --git a/electron/build/patch/frontend/index.js b/electron/build/patch/frontend/index.js new file mode 100644 index 00000000..1d6a9ff3 --- /dev/null +++ b/electron/build/patch/frontend/index.js @@ -0,0 +1,59 @@ +// Patch for the startup theme. Customizes the `ThemeService.get().defaultTheme();` to dispatch the default IDE2 theme based on the OS' theme. +// For all subsequent starts of the IDE the theme applied will be the last one set by the user. + +// With the current version of Theia adopted (1.25) it is not possible to extend the `ThemeService`, it will be possible starting from Theia 1.27. +// Once the version of Theia is updated, this patch will be removed and this functionality will be implemented via dependency injection. +// Ideally, we should open a PR in Theia and add support for `light` and `dark` default themes in the app config. + +const { + ThemeService, + ThemeServiceSymbol, + BuiltinThemeProvider, +} = require('@theia/core/lib/browser/theming'); +const { + ApplicationProps, +} = require('@theia/application-package/lib/application-props'); + +const lightTheme = 'arduino-theme'; +const darkTheme = 'arduino-theme-dark'; +const defaultTheme = + window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches + ? darkTheme + : lightTheme; + +const arduinoDarkTheme = { + id: 'arduino-theme-dark', + type: 'dark', + label: 'Dark (Arduino)', + editorTheme: 'arduino-theme-dark', + activate() { }, + deactivate() { } +}; + +const arduinoLightTheme = { + id: 'arduino-theme', + type: 'light', + label: 'Light (Arduino)', + editorTheme: 'arduino-theme', + activate() { }, + deactivate() { } +}; + +if (!window[ThemeServiceSymbol]) { + const themeService = new ThemeService(); + Object.defineProperty(themeService, 'defaultTheme', { + get: function () { + return ( + this.themes[defaultTheme] || + this.themes[ApplicationProps.DEFAULT.frontend.config.defaultTheme] + ); + }, + }); + themeService.register(...BuiltinThemeProvider.themes, arduinoDarkTheme, arduinoLightTheme); + themeService.startupTheme(); + themeService.setCurrentTheme(defaultTheme); + window[ThemeServiceSymbol] = themeService; +} + +// Require the original, generated `index.js` for `webpack` as the next entry for the `bundle.js`. +require('../../src-gen/frontend/index'); diff --git a/electron/build/template-package.json b/electron/build/template-package.json index 6ab1037e..d9afb927 100644 --- a/electron/build/template-package.json +++ b/electron/build/template-package.json @@ -23,7 +23,7 @@ "package": "cross-env DEBUG=* && electron-builder --publish=never", "package:publish": "cross-env DEBUG=* && electron-builder --publish=always", "download:plugins": "theia download:plugins", - "patch": "ncp ./patch/main.js ./src-gen/backend/main.js && node ./scripts/patch-theia-preload.js ./lib/index.html" + "patch": "ncp ./patch/backend/main.js ./src-gen/backend/main.js && node ./scripts/patch-theia-preload.js ./lib/index.html" }, "engines": { "node": ">=14.0.0 <15" @@ -157,4 +157,4 @@ "vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.69.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.69.0.vsix", "vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.69.0/file/MS-CEINTL.vscode-language-pack-cs-1.69.0.vsix" } -} \ No newline at end of file +} diff --git a/electron/build/webpack.config.js b/electron/build/webpack.config.js new file mode 100644 index 00000000..bd042642 --- /dev/null +++ b/electron/build/webpack.config.js @@ -0,0 +1,10 @@ +// @ts-check +const config = require('./gen-webpack.config.js'); +const path = require('path'); + +// Load the patched `index.js` that sets the desired theme in IDE2 based on the OS' theme. +// The `patch/frontend/index.js` will require the original, generated `index.js`. +// See: https://github.com/arduino/arduino-ide/pull/1160. +config.entry.bundle = path.resolve(__dirname, 'patch/frontend/index.js'); + +module.exports = config; diff --git a/electron/packager/index.js b/electron/packager/index.js index 2f216f45..a5e78570 100644 --- a/electron/packager/index.js +++ b/electron/packager/index.js @@ -52,6 +52,7 @@ 'resources', 'scripts', 'template-package.json', + 'webpack.config.js' ]; fs.readdirSync(path('..', 'build')) .filter((filename) => resourcesToKeep.indexOf(filename) === -1)