Add "Boot from scratch" to the Machine menu (#357)

* Add "Boot from scratch" to the Machine menu

Wires a new MACHINE_BOOT_FROM_SCRATCH IPC command from the app menu to the existing Emulator.bootFromScratch() handler, so users can start a fresh boot without going through the settings card. Enabled only while the machine is stopped, matching Start.

* Rename menu item to "Start without state"

* Move "Send key" items below power management in Machine menu
This commit is contained in:
Felix Rieseberg
2026-04-11 15:27:22 -07:00
committed by GitHub
parent 27b9e0eb7a
commit ccd2b28169
3 changed files with 38 additions and 25 deletions

View File

@@ -18,6 +18,7 @@ export const IPC_COMMANDS = {
ZOOM_RESET: "ZOOM_RESET",
// Machine instructions
MACHINE_START: "MACHINE_START",
MACHINE_BOOT_FROM_SCRATCH: "MACHINE_BOOT_FROM_SCRATCH",
MACHINE_RESTART: "MACHINE_RESTART",
MACHINE_STOP: "MACHINE_STOP",
MACHINE_RESET: "MACHINE_RESET",

View File

@@ -125,29 +125,6 @@ async function createMenu({ isRunning } = { isRunning: false }) {
{
label: "Machine",
submenu: [
{
label: "Send Ctrl+Alt+Del",
click: () => send(IPC_COMMANDS.MACHINE_CTRL_ALT_DEL),
enabled: isRunning,
},
{
label: "Send Alt+F4",
click: () => send(IPC_COMMANDS.MACHINE_ALT_F4),
enabled: isRunning,
},
{
label: "Send Alt+Enter",
click: () => send(IPC_COMMANDS.MACHINE_ALT_ENTER),
enabled: isRunning,
},
{
label: "Send Esc",
click: () => send(IPC_COMMANDS.MACHINE_ESC),
enabled: isRunning,
},
{
type: "separator",
},
isRunning
? {
label: "Stop",
@@ -157,6 +134,11 @@ async function createMenu({ isRunning } = { isRunning: false }) {
label: "Start",
click: () => send(IPC_COMMANDS.MACHINE_START),
},
{
label: "Start without state",
click: () => send(IPC_COMMANDS.MACHINE_BOOT_FROM_SCRATCH),
enabled: !isRunning,
},
{
label: "Restart",
click: () => send(IPC_COMMANDS.MACHINE_RESTART),
@@ -184,6 +166,29 @@ async function createMenu({ isRunning } = { isRunning: false }) {
{
type: "separator",
},
{
label: "Send Ctrl+Alt+Del",
click: () => send(IPC_COMMANDS.MACHINE_CTRL_ALT_DEL),
enabled: isRunning,
},
{
label: "Send Alt+F4",
click: () => send(IPC_COMMANDS.MACHINE_ALT_F4),
enabled: isRunning,
},
{
label: "Send Alt+Enter",
click: () => send(IPC_COMMANDS.MACHINE_ALT_ENTER),
enabled: isRunning,
},
{
label: "Send Esc",
click: () => send(IPC_COMMANDS.MACHINE_ESC),
enabled: isRunning,
},
{
type: "separator",
},
{
label: "Go to Disk Image",
click: () => send(IPC_COMMANDS.SHOW_DISK_IMAGE),

View File

@@ -21,8 +21,11 @@ import { startProbe } from "./debug-harness";
const PROBE = process.env.WIN95_PROBE === "1";
const PROBE_OPTS: Record<string, unknown> = (() => {
try { return JSON.parse(process.env.WIN95_PROBE_OPTS || "{}"); }
catch { return {}; }
try {
return JSON.parse(process.env.WIN95_PROBE_OPTS || "{}");
} catch {
return {};
}
})();
declare let window: Win95Window;
@@ -196,6 +199,10 @@ export class Emulator extends React.Component<{}, EmulatorState> {
ipcRenderer.on(IPC_COMMANDS.MACHINE_STOP, this.stopEmulator);
ipcRenderer.on(IPC_COMMANDS.MACHINE_RESET, this.resetEmulator);
ipcRenderer.on(IPC_COMMANDS.MACHINE_START, this.startEmulator);
ipcRenderer.on(
IPC_COMMANDS.MACHINE_BOOT_FROM_SCRATCH,
this.bootFromScratch,
);
ipcRenderer.on(IPC_COMMANDS.MACHINE_RESTART, this.restartEmulator);
ipcRenderer.on(IPC_COMMANDS.TOGGLE_INFO, () => {