diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eb9c81a1..47c40965f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - new icon styles preference for tray (showing time to break or visual progress to break) - Autostart functionality in Flatpaks - updated appExclusions section on README to include description for Windows and substring matching +- portable version for Windows ### Fixed - snap package not starting on Wayland diff --git a/app/css/commons.css b/app/css/commons.css index cf65c6e9e..992434eb2 100644 --- a/app/css/commons.css +++ b/app/css/commons.css @@ -157,7 +157,8 @@ body { .linux .linux-hidden, .freebsd .linux-hidden, .openbsd .linux-hidden, -.store .store-hidden { +.store .store-hidden, +.portable .portable-hidden { display: none; } diff --git a/app/main.js b/app/main.js index 5b9a2a470..590966d34 100644 --- a/app/main.js +++ b/app/main.js @@ -17,7 +17,7 @@ import { DateTime } from 'luxon' import { canPostpone, canSkip, formatTimeRemaining, - minutesRemaining, insideWindowsStore, insideFlatpak, insideSnap + minutesRemaining, insideWindowsStore, insideFlatpak, insideSnap, insideWindowsPortable } from './utils/utils.js' import IdeasLoader from './utils/ideasLoader.js' import BreaksPlanner from './breaksPlanner.js' @@ -78,6 +78,14 @@ let currentTrayIconPath = null let currentTrayMenuTemplate = null let trayUpdateIntervalObj = null +if (insideWindowsPortable()) { + const portableDataPath = join(process.env.PORTABLE_EXECUTABLE_DIR, 'Data') + if (!existsSync(portableDataPath)) { + mkdirSync(portableDataPath, { recursive: true }) + } + app.setPath('userData', portableDataPath) +} + log.initialize({ preload: true }) // https://stackoverflow.com/questions/65859634/notification-from-electron-shows-electron-app-electron/65863174#65863174 diff --git a/app/platform.js b/app/platform.js index 57e3ca8c2..708884970 100644 --- a/app/platform.js +++ b/app/platform.js @@ -2,4 +2,7 @@ document.body.classList.add(window.runtime.platform()) if (window.runtime.windowsStore()) { document.body.classList.add('store') } +if (window.runtime.windowsPortable()) { + document.body.classList.add('portable') +} export default {} diff --git a/app/preferences-renderer.js b/app/preferences-renderer.js index 961927637..c721933a3 100644 --- a/app/preferences-renderer.js +++ b/app/preferences-renderer.js @@ -92,6 +92,7 @@ window.onload = async (e) => { document.querySelector('#electron').innerHTML = await window.runtime.electron() document.querySelector('#platform').innerHTML = await window.runtime.platform() document.querySelector('#windowsStore').innerHTML = await window.runtime.windowsStore() || false + document.querySelector('#windowsPortable').innerHTML = await window.runtime.windowsPortable() || false } setWindowHeight() } diff --git a/app/preferences.html b/app/preferences.html index 2ae1d0ec2..ca8c74c5d 100644 --- a/app/preferences.html +++ b/app/preferences.html @@ -48,7 +48,7 @@
diff --git a/app/utils/context-bridge-exposers.js b/app/utils/context-bridge-exposers.js index 7400eed10..bf01b79c7 100644 --- a/app/utils/context-bridge-exposers.js +++ b/app/utils/context-bridge-exposers.js @@ -45,6 +45,7 @@ function exposeRuntime () { electron: () => process.versions.electron, windowsStore: () => utils.insideWindowsStore(), snap: () => utils.insideSnap(), + windowsPortable: () => utils.insideWindowsPortable(), getSystemVersion: () => process.getSystemVersion() }) } diff --git a/app/utils/defaultSettings.js b/app/utils/defaultSettings.js index 7b0426ddb..93b1de03a 100644 --- a/app/utils/defaultSettings.js +++ b/app/utils/defaultSettings.js @@ -1,6 +1,6 @@ import defaultBreakIdeas from './defaultBreakIdeas.js' import defaultMicrobreakIdeas from './defaultMicrobreakIdeas.js' -import { insideFlatpak, insideWindowsStore, insideSnap } from './utils.js' +import { insideFlatpak, insideWindowsStore, insideSnap, insideWindowsPortable } from './utils.js' export default { microbreakDuration: 20000, @@ -76,7 +76,7 @@ export default { resetBreaksShortcut: '', showTrayMenuInStrictMode: false, customPreferencesMessage: '', - disableAppUpdateFeatures: insideFlatpak() || insideWindowsStore() || insideSnap(), + disableAppUpdateFeatures: insideFlatpak() || insideWindowsStore() || insideSnap() || insideWindowsPortable(), hidePreferencesFileLocation: false, hideStrictModePreferences: false, miniBreakManualFinish: false, diff --git a/app/utils/utils.js b/app/utils/utils.js index af4518c55..623fc395f 100644 --- a/app/utils/utils.js +++ b/app/utils/utils.js @@ -87,6 +87,10 @@ function insideSnap () { return process.platform === 'linux' && !!process.env.SNAP } +function insideWindowsPortable () { + return process.platform === 'win32' && !!process.env.PORTABLE_EXECUTABLE_DIR +} + export { formatTimeRemaining, formatElapsedDuration, @@ -99,5 +103,6 @@ export { shouldShowNotificationTitle, insideFlatpak, insideWindowsStore, - insideSnap + insideSnap, + insideWindowsPortable } diff --git a/package.json b/package.json index 47b7943de..8471f80a5 100644 --- a/package.json +++ b/package.json @@ -104,13 +104,17 @@ "target": [ "nsis", "7z", - "appx" + "appx", + "portable" ], "asarUnpack": [ "node_modules/windows-notification-state/**", "node_modules/macos-notification-state/**" ] }, + "portable": { + "artifactName": "${productName} Portable ${version}.${ext}" + }, "nsis": { "oneClick": false, "allowToChangeInstallationDirectory": true