diff --git a/.gitignore b/.gitignore index 7f3f2a6..3ea165f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ node_modules out -src/renderer/images +src/images .DS_Store diff --git a/package-lock.json b/package-lock.json index 57624b6..c8c52ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "windows95", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1531,6 +1531,11 @@ } } }, + "electron-is-dev": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", + "integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4=" + }, "electron-osx-sign": { "version": "0.4.10", "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz", @@ -2545,6 +2550,14 @@ "assert-plus": "^1.0.0" } }, + "github-url-to-object": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/github-url-to-object/-/github-url-to-object-4.0.4.tgz", + "integrity": "sha512-1Ri1pR8XTfzLpbtPz5MlW/amGNdNReuExPsbF9rxLsBfO1GH9RtDBamhJikd0knMWq3RTTQDbTtw0GGvvEAJEA==", + "requires": { + "is-url": "^1.1.0" + } + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -2901,6 +2914,11 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -4650,6 +4668,24 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "update-electron-app": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/update-electron-app/-/update-electron-app-1.3.0.tgz", + "integrity": "sha512-OXfcmeenpjMyzXmadZ6NqxnrpPpiLji0sLUpXkexfX97XM8Gnk4iLovk4TlK4N8dzlETWdm9klgMmo9HpRbK7Q==", + "requires": { + "electron-is-dev": "^0.3.0", + "github-url-to-object": "^4.0.4", + "is-url": "^1.2.4", + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, "username": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/username/-/username-3.0.0.tgz", diff --git a/package.json b/package.json index d44d5de..0bd57ec 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "package": "electron-forge package", "make": "electron-forge make", "publish": "electron-forge publish", - "lint": "standard \"src/**/*.js\"" + "lint": "standard \"src/**/*.mjs\"" }, "keywords": [], "author": "Felix Rieseberg, felix@felixrieseberg.com", @@ -19,6 +19,7 @@ }, "standard": { "globals": [ + "appState", "V86Starter", "windows95" ], @@ -29,7 +30,8 @@ "dependencies": { "electron-default-menu": "^1.0.1", "electron-squirrel-startup": "^1.0.0", - "fs-extra": "^7.0.0" + "fs-extra": "^7.0.0", + "update-electron-app": "^1.3.0" }, "devDependencies": { "@electron-forge/cli": "^6.0.0-beta.22", diff --git a/src/.github/issue_template.md b/src/.github/issue_template.md deleted file mode 100644 index 0196eb4..0000000 --- a/src/.github/issue_template.md +++ /dev/null @@ -1,3 +0,0 @@ -⚠️ Thank you for reporting an issue! - -Before we go any further, understand that I probably won't fullfil feature requests. I will however _gladly_ help you make a pull request if you're willing to play with Javascript! \ No newline at end of file diff --git a/src/es6.js b/src/es6.js new file mode 100644 index 0000000..9c44429 --- /dev/null +++ b/src/es6.js @@ -0,0 +1,26 @@ +const { protocol } = require('electron') +const fs = require('fs-extra') +const path = require('path') + +const ES6_PATH = path.join(__dirname, 'renderer') + +protocol.registerStandardSchemes(['es6']) + +async function setupProtocol () { + protocol.registerBufferProtocol('es6', async (req, cb) => { + console.log(req) + + try { + const filePath = path.join(ES6_PATH, req.url.replace('es6://', '' )) + const fileContent = await fs.readFile(filePath.replace('.js/', '.js')) + + cb({ mimeType: 'text/javascript', data: fileContent }) + } catch (error) { + console.warn(error) + } + }) +} + +module.exports = { + setupProtocol +} diff --git a/src/index.js b/src/index.js index ad0bb5b..40845e8 100644 --- a/src/index.js +++ b/src/index.js @@ -3,6 +3,7 @@ const path = require('path') const { clearCaches } = require('./cache') const { createMenu } = require('./menu') +const { setupProtocol } = require('./es6') if (require('electron-squirrel-startup')) { // eslint-disable-line global-require app.quit() @@ -16,13 +17,13 @@ const createWindow = () => { width: 1280, height: 800, useContentSize: true, - nodeIntegration: false, webPreferences: { + nodeIntegration: false, preload: path.join(__dirname, 'preload.js') } }) - mainWindow.loadURL(`file://${__dirname}/renderer/index.html?system=win98`) + mainWindow.loadURL(`file://${__dirname}/renderer/index.html`) mainWindow.on('closed', () => { mainWindow = null @@ -30,8 +31,10 @@ const createWindow = () => { } app.on('ready', async () => { + await setupProtocol() await createMenu() await clearCaches() + createWindow() }) diff --git a/src/preload.js b/src/preload.js index 2136803..6118b97 100644 --- a/src/preload.js +++ b/src/preload.js @@ -1,43 +1,13 @@ const { remote } = require('electron') const fs = require('fs-extra') -const { STATE_PATH, getState, resetState } = require('./state') +const { STATE_PATH, resetState, restoreState, saveState } = require('./state') window.windows95 = { STATE_PATH, - + restoreState, resetState, + saveState, - async saveState () { - return new Promise((resolve) => { - if (!window.emulator || !window.emulator.save_state) { - return resolve() - } - - window.emulator.save_state(async (error, newState) => { - if (error) { - console.log(error) - return - } - - await fs.outputFile(STATE_PATH, Buffer.from(newState)) - - console.log(`Saved state to ${STATE_PATH}`) - - resolve() - }) - }) - }, - - async restoreState () { - try { - window.emulator.restore_state(getState()) - } catch (error) { - console.log(`Could not read state file. Maybe none exists?`, error) - } - }, - - quit () { - remote.app.quit() - } + quit: () => remote.app.quit() } diff --git a/src/renderer/app-state.js b/src/renderer/app-state.js new file mode 100644 index 0000000..9047cc1 --- /dev/null +++ b/src/renderer/app-state.js @@ -0,0 +1,7 @@ +export function setupState () { + window.appState = { + cursorCaptured: false, + floppyFile: null, + bootFresh: false + } +} diff --git a/src/renderer/buttons.js b/src/renderer/buttons.js new file mode 100644 index 0000000..e9fa035 --- /dev/null +++ b/src/renderer/buttons.js @@ -0,0 +1,41 @@ +const $ = document.querySelector.bind(document) + +export function setupButtons (start) { + // Start + $('.btn-start').addEventListener('click', () => start()) + + // Reset + $('#reset').addEventListener('click', () => windows95.resetState()) + + $('#discard-state').addEventListener('click', () => { + window.appState.bootFresh = true + + start('win95') + }) + + // Floppy + $('#floppy').addEventListener('click', () => { + $('#file-input').click() + }) + + // Floppy (Hidden Input) + $('#file-input').addEventListener('change', (event) => { + window.appState.floppyFile = event.target.files && event.target.files.length > 0 + ? event.target.files[0] + : null + + if (window.appState.floppyFile) { + $('#floppy-path').innerHTML = `Inserted Floppy Disk: ${window.appState.floppyFile.path}` + } + }) +} + +export function toggleButtons (forceTo) { + const buttonElements = $('#buttons') + + if (buttonElements.style.display !== 'none' || forceTo === false) { + buttonElements.style.display = 'none' + } else { + buttonElements.style.display = undefined + } +} diff --git a/src/renderer/index.html b/src/renderer/index.html index a5db04c..7ace776 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -11,6 +11,7 @@
+