add support for directly launching windows exes from file exporer using .desktop shortcut
This commit is contained in:
parent
66f42f30cc
commit
5e217472aa
15 changed files with 440 additions and 28 deletions
|
|
@ -87,9 +87,11 @@ const GRACE_MS = 60000
|
|||
// (a number of seconds) every 30s - apps.json is left untouched to spare the
|
||||
// disk. lastPlayed is stamped once at start, final totals are mirrored into
|
||||
// the registry once on exit.
|
||||
function startPlaytimeTicker({ game, startedAt }) {
|
||||
// `base` is the seconds total this run adds up to. It is resolved by the
|
||||
// CALLER from the live playtime file (not the registry) so ad-hoc runs that
|
||||
// share one id (see runAdHoc) never mix two apps' playtime.
|
||||
function startPlaytimeTicker({ game, startedAt, base }) {
|
||||
const library = require('./library')
|
||||
const base = game.playSeconds || 0
|
||||
const timer = setInterval(() => {
|
||||
const counted = Math.max(0, Math.round((Date.now() - startedAt - GRACE_MS) / 1000))
|
||||
library.writePlaySeconds(game.id, base + counted)
|
||||
|
|
@ -145,7 +147,10 @@ function runGame({ game, wine, systemWine, onExit }) {
|
|||
child.on('error', reject)
|
||||
child.unref()
|
||||
const startedAt = Date.now()
|
||||
const stopTicker = startPlaytimeTicker({ game, startedAt })
|
||||
// read the LIVE playtime file, not the (possibly shared/stale) registry
|
||||
// value - ad-hoc "open with" runs share one id and must not mix playtime
|
||||
const basePlaySeconds = require('./library').readPlaySeconds(game.id) ?? (game.playSeconds || 0)
|
||||
const stopTicker = startPlaytimeTicker({ game, startedAt, base: basePlaySeconds })
|
||||
// stamp "last played" once at start so it is correct even if we crash later
|
||||
require('./library').updateGame(game.id, { lastPlayed: startedAt })
|
||||
child.on('exit', (code, signal) => {
|
||||
|
|
@ -154,7 +159,7 @@ function runGame({ game, wine, systemWine, onExit }) {
|
|||
const counted = Math.max(0, Math.round((Date.now() - startedAt - GRACE_MS) / 1000))
|
||||
require('./library').updateGame(game.id, {
|
||||
lastPlayed: startedAt,
|
||||
playSeconds: (game.playSeconds || 0) + counted
|
||||
playSeconds: basePlaySeconds + counted
|
||||
})
|
||||
if (onExit) onExit(code, signal)
|
||||
})
|
||||
|
|
@ -189,4 +194,14 @@ function runTool({ game, wine, tool, args, systemWine }) {
|
|||
})
|
||||
}
|
||||
|
||||
module.exports = { buildEnv, runGame, runTool, parseArgs, latestLogPath }
|
||||
// Ad-hoc launch ("Open with PLWL"): the exact runGame pipeline, but with a
|
||||
// synthetic target under the shared `openwith` id - log and playtime files
|
||||
// live in files/data/appdata/openwith/ and no library entry is created.
|
||||
// `prefix` carries the picker's choice ('' = launcher default, resolved by
|
||||
// buildEnv); wine/systemWine are the already-resolved build objects.
|
||||
function runAdHoc({ openPath, wine, systemWine, prefix, onExit }) {
|
||||
const game = require('./openwith').makeTarget(openPath, 'default', prefix || '')
|
||||
return runGame({ game, wine, systemWine, onExit })
|
||||
}
|
||||
|
||||
module.exports = { buildEnv, runGame, runTool, runAdHoc, parseArgs, latestLogPath }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue