fix launching shortcuts
This commit is contained in:
parent
1097a1f441
commit
4fd5dbe695
1 changed files with 29 additions and 2 deletions
31
src/main.js
31
src/main.js
|
|
@ -1,7 +1,7 @@
|
||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const { app } = require('electron')
|
const { app } = require('electron')
|
||||||
const { ensureDirs } = require('./paths')
|
const { ensureDirs, DIRS } = require('./paths')
|
||||||
const i18n = require('./i18n')
|
const i18n = require('./i18n')
|
||||||
const wines = require('./wines')
|
const wines = require('./wines')
|
||||||
const { registerIpc } = require('./ipc')
|
const { registerIpc } = require('./ipc')
|
||||||
|
|
@ -27,13 +27,29 @@ let autoQuitWhenDone = false // headless boot: quit after that game exits
|
||||||
const getWindow = () => win
|
const getWindow = () => win
|
||||||
|
|
||||||
// --- single instance ---------------------------------------------------------
|
// --- single instance ---------------------------------------------------------
|
||||||
|
// Diagnostics: the shortcut handoff path is invisible otherwise (a failing
|
||||||
|
// handoff just "does nothing" for the user). Everything lands in a small
|
||||||
|
// trace file next to the launcher data so problems are reproducible.
|
||||||
|
function trace(msg) {
|
||||||
|
try {
|
||||||
|
const file = path.join(DIRS.DATA, 'instance-trace.log')
|
||||||
|
// keep the trace tiny: drop it once it grows past ~64 KiB
|
||||||
|
try {
|
||||||
|
if (fs.existsSync(file) && fs.statSync(file).size > 64 * 1024) fs.rmSync(file, { force: true })
|
||||||
|
} catch {}
|
||||||
|
fs.appendFileSync(file, `${new Date().toISOString()} ${msg}\n`)
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
// A second launcher invocation (e.g. a desktop shortcut with --launch <id>)
|
// A second launcher invocation (e.g. a desktop shortcut with --launch <id>)
|
||||||
// hands its arguments to the running instance and exits immediately.
|
// hands its arguments to the running instance and exits immediately.
|
||||||
const gotLock = app.requestSingleInstanceLock()
|
const gotLock = app.requestSingleInstanceLock()
|
||||||
|
trace(`boot argv=${process.argv.slice(1).join(' ')} gotLock=${gotLock}`)
|
||||||
if (!gotLock) {
|
if (!gotLock) {
|
||||||
app.quit()
|
app.quit()
|
||||||
} else {
|
} else {
|
||||||
app.on('second-instance', (e, argv) => {
|
app.on('second-instance', (e, argv) => {
|
||||||
|
trace(`second-instance argv=${argv.join(' ')}`)
|
||||||
const id = parseLaunchId(argv)
|
const id = parseLaunchId(argv)
|
||||||
lastHandoffAt = Date.now()
|
lastHandoffAt = Date.now()
|
||||||
if (id) launchGame(id)
|
if (id) launchGame(id)
|
||||||
|
|
@ -49,7 +65,16 @@ let lastHandoffAt = 0
|
||||||
function parseLaunchId(argv) {
|
function parseLaunchId(argv) {
|
||||||
const args = Array.isArray(argv) ? argv : process.argv
|
const args = Array.isArray(argv) ? argv : process.argv
|
||||||
const i = args.indexOf('--launch')
|
const i = args.indexOf('--launch')
|
||||||
if (i !== -1 && args[i + 1]) return args[i + 1]
|
if (i !== -1) {
|
||||||
|
// Chromium injects its own flags into the second instance's argv and they
|
||||||
|
// can land BETWEEN --launch and the value (e.g. `--launch
|
||||||
|
// --allow-file-access-from-files 1790414564627`), so skip anything that
|
||||||
|
// looks like a flag and take the first non-flag token.
|
||||||
|
for (let j = i + 1; j < args.length; j++) {
|
||||||
|
if (!args[j].startsWith('--')) return args[j]
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
const eq = args.find(a => a.startsWith('--launch='))
|
const eq = args.find(a => a.startsWith('--launch='))
|
||||||
return eq ? eq.slice('--launch='.length) : null
|
return eq ? eq.slice('--launch='.length) : null
|
||||||
}
|
}
|
||||||
|
|
@ -169,8 +194,10 @@ function wireWindow(w) {
|
||||||
let gamesService = null
|
let gamesService = null
|
||||||
|
|
||||||
async function launchGame(id) {
|
async function launchGame(id) {
|
||||||
|
trace(`launchGame ${id} serviceReady=${!!gamesService}`)
|
||||||
if (!gamesService) return
|
if (!gamesService) return
|
||||||
const res = await gamesService.start(getWindow(), id)
|
const res = await gamesService.start(getWindow(), id)
|
||||||
|
trace(`launchGame ${id} result=${JSON.stringify(res).slice(0, 200)}`)
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
rebuildTrayMenu()
|
rebuildTrayMenu()
|
||||||
// headless boot: when the auto-started game finishes and nothing else is
|
// headless boot: when the auto-started game finishes and nothing else is
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue