🔧 Add some features

This commit is contained in:
Felix Rieseberg 2018-08-24 23:01:33 -07:00
parent 5c1af3ae86
commit 3189f3a8a2
8 changed files with 135 additions and 10 deletions

View file

@ -9,7 +9,7 @@
"package": "electron-forge package",
"make": "electron-forge make",
"publish": "electron-forge publish",
"lint": "standard \"src/**/*.mjs\""
"lint": "standard \"src/**/*.js\""
},
"keywords": [],
"author": "Felix Rieseberg, felix@felixrieseberg.com",

View file

@ -11,10 +11,10 @@ async function setupProtocol () {
console.log(req)
try {
const filePath = path.join(ES6_PATH, req.url.replace('es6://', '' ))
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 })
cb({ mimeType: 'text/javascript', data: fileContent }) // eslint-disable-line
} catch (error) {
console.warn(error)
}

View file

@ -1,8 +1,49 @@
const { app, shell, Menu } = require('electron')
const { app, shell, Menu, BrowserWindow } = require('electron')
const defaultMenu = require('electron-default-menu')
function send (cmd) {
const windows = BrowserWindow.getAllWindows()
if (windows[0]) {
windows[0].webContents.send(cmd)
}
}
async function createMenu () {
const menu = defaultMenu(app, shell)
.map((item) => {
if (item.label === 'View') {
item.submenu = item.submenu.filter((subItem) => {
return subItem.label !== 'Reload'
})
}
return item
})
.filter((item) => {
return item.label !== 'Edit'
})
menu.splice(1, 0, {
label: 'Machine',
submenu: [
{
label: 'Send Ctrl+Alt+Del',
click: () => send('ctrlaltdel')
},
{
label: 'Restart',
click: () => send('restart')
},
{
type: 'separator'
},
{
label: 'Go to Disk Image',
click: () => send('disk-image')
}
]
})
Menu.setApplicationMenu(Menu.buildFromTemplate(menu))
}

View file

@ -1,4 +1,4 @@
const { remote, shell } = require('electron')
const { remote, shell, ipcRenderer } = require('electron')
const path = require('path')
const { STATE_PATH, resetState, restoreState, saveState } = require('./state')
@ -9,7 +9,7 @@ window.windows95 = {
resetState,
saveState,
showDiskImage() {
showDiskImage () {
const imagePath = path.join(__dirname, 'images/windows95.img')
.replace('app.asar', 'app.asar.unpacked')
@ -18,3 +18,28 @@ window.windows95 = {
quit: () => remote.app.quit()
}
ipcRenderer.on('ctrlaltdel', () => {
if (!window.emulator || !window.emulator.is_running) return
window.emulator.keyboard_send_scancodes([
0x1D, // ctrl
0x38, // alt
0x53, // delete
// break codes
0x1D | 0x80,
0x38 | 0x80,
0x53 | 0x80
])
})
ipcRenderer.on('restart', () => {
if (!window.emulator || !window.emulator.is_running) return
window.emulator.restart()
})
ipcRenderer.on('disk-image', () => {
windows95.showDiskImage()
})

View file

@ -11,7 +11,10 @@
</head>
<body class="paused">
<div id="computer-info"></div>
<div id="status">
Disk: <span id="disk-status">Idle</span>
| CPU Speed: <span id="cpu-status">0</span>
</div>
<div id="buttons">
<div id="start-buttons">
<!-- <div class="btn" id="win98">Windows 98</div> -->

View file

@ -1,5 +1,36 @@
export function setupInfo() {
window.appState.infoInterval = setInterval(() => {
if (window.emulator && window.emulator.get_statistics) {}
const $ = document.querySelector.bind(document)
export function setupInfo () {
const diskStatus = $('#disk-status')
const cpuStatus = $('#cpu-status')
let lastCounter = 0
let lastTick = 0
window.emulator.add_listener('ide-read-start', () => {
diskStatus.innerHTML = 'Read'
})
window.emulator.add_listener('ide-read-end', () => {
diskStatus.innerHTML = 'Idle'
})
window.emulator.add_listener('ide-write-end', () => {
diskStatus.innerHTML = 'Idle'
})
window.emulator.add_listener('screen-set-size-graphical', (...args) => {
console.log(...args)
})
setInterval(() => {
const now = Date.now()
const instructionCounter = window.emulator.get_instruction_counter()
const ips = instructionCounter - lastCounter
const deltaTime = now - lastTick
lastTick = now
lastCounter = instructionCounter
cpuStatus.innerHTML = Math.round(ips / deltaTime)
}, 500)
}

View file

@ -1,6 +1,7 @@
import { setupState } from 'es6://app-state.js'
import { setupClickListener, setupEscListener, setupCloseListener } from 'es6://listeners.js'
import { toggleButtons, setupButtons } from 'es6://buttons.js'
import { setupInfo } from 'es6://info.js'
setupState()
@ -44,6 +45,8 @@ async function main () {
windows95.restoreState()
}
setupInfo()
window.appState.cursorCaptured = true
window.emulator.lock_mouse()
window.emulator.run()

View file

@ -16,6 +16,28 @@ body.paused {
font-family: Courier;
}
#buttons {
user-select: none;
}
#status {
user-select: none;
position: absolute;
z-index: 100;
left: calc(50vw - 110px);
background: white;
text-align: center;
font-family: Courier;
font-size: 10px;
padding-bottom: 3px;
border-bottom-left-radius: 15px;
border-bottom-right-radius: 15px;
overflow: hidden;
padding-left: 10px;
padding-right: 10px;
max-height: 18px;
}
#floppy-path {
background: beige;
padding: 5px;