PLWL/src/preload.js

81 lines
3.9 KiB
JavaScript

'use strict'
const { contextBridge, ipcRenderer } = require('electron')
const { DIRS } = require('./paths')
// single-slot progress: every import modal used to register ANOTHER listener
// and old ones never unregistered, so the file counter sped up per import
let importProgressCb = null
ipcRenderer.on('import:progress', (e, data) => {
if (importProgressCb) importProgressCb(data)
})
// "Open with PLWL": single-slot callback for files handed over via --open
// (Exec %f) - the renderer shows the wine/prefix picker popup for it.
let openWithCb = null
ipcRenderer.on('openwith:file', (e, openPath) => {
if (openWithCb) openWithCb(openPath)
})
const fs = require('fs')
const path = require('path')
contextBridge.exposeInMainWorld('plwl', {
FILES_DIR: DIRS.FILES,
i18nList: () => ipcRenderer.invoke('i18n:list'),
i18nGet: code => ipcRenderer.invoke('i18n:get', code),
settingsGet: () => ipcRenderer.invoke('settings:get'),
settingsSet: patch => ipcRenderer.invoke('settings:set', patch),
winesList: () => ipcRenderer.invoke('wines:list'),
winesRefresh: () => ipcRenderer.invoke('wines:refresh'),
winesSetDisabled: (id, disabled) => ipcRenderer.invoke('wines:setDisabled', id, disabled),
winesSetDefault: id => ipcRenderer.invoke('wines:setDefault', id),
winesDelete: id => ipcRenderer.invoke('wines:delete', id),
winesImport: srcDir => ipcRenderer.invoke('wines:import', srcDir),
prefixesList: () => ipcRenderer.invoke('prefixes:list'),
prefixesCreate: name => ipcRenderer.invoke('prefixes:create', name),
prefixesDelete: name => ipcRenderer.invoke('prefixes:delete', name),
prefixesSetDefault: name => ipcRenderer.invoke('prefixes:setDefault', name),
openwithTake: () => ipcRenderer.invoke('openwith:take'),
openwithRun: payload => ipcRenderer.invoke('openwith:run', payload),
openwithTexts: lang => ipcRenderer.invoke('openwith:texts', lang),
onOpenWith: cb => {
openWithCb = cb
},
basename: p => (p ? path.basename(p) : ''),
fileExists: p => {
try {
return !!p && fs.existsSync(p)
} catch {
return false
}
},
gamesList: () => ipcRenderer.invoke('games:list'),
gamesGet: id => ipcRenderer.invoke('games:get', id),
gamesUpdate: (id, patch) => ipcRenderer.invoke('games:update', id, patch),
gamesClearPlaytime: id => ipcRenderer.invoke('games:clearPlaytime', id),
gamesSetIconFile: (id, p) => ipcRenderer.invoke('games:setIconFile', id, p),
gamesExtractIcon: id => ipcRenderer.invoke('games:extractIcon', id),
gamesAutoIcon: id => ipcRenderer.invoke('games:autoIcon', id),
gamesIconPath: id => ipcRenderer.invoke('games:iconPath', id),
gamesResetIcon: id => ipcRenderer.invoke('games:resetIcon', id),
gamesRemove: id => ipcRenderer.invoke('games:remove', id),
gamesCreateShortcut: id => ipcRenderer.invoke('games:createShortcut', id),
gamesShortcutPaths: id => ipcRenderer.invoke('games:shortcutPaths', id),
gamesPickFolder: () => ipcRenderer.invoke('games:pickFolder'),
gamesPickPrefixFolder: prefix => ipcRenderer.invoke('games:pickPrefixFolder', prefix),
gamesImport: (src, mode) => ipcRenderer.invoke('games:import', src, mode),
gamesImportFromPrefix: (prefix, src) => ipcRenderer.invoke('games:importFromPrefix', prefix, src),
gamesRun: id => ipcRenderer.invoke('games:run', id),
gamesRunTool: (id, tool, args) => ipcRenderer.invoke('games:runTool', id, tool, args),
gamesGetLogs: id => ipcRenderer.invoke('games:getLogs', id),
gamesKill: id => ipcRenderer.invoke('games:kill', id),
gamesIsRunning: id => ipcRenderer.invoke('games:isRunning', id),
gamesListRunning: () => ipcRenderer.invoke('games:listRunning'),
dialogPickFile: opts => ipcRenderer.invoke('dialog:pickFile', opts),
shellOpenPath: p => ipcRenderer.invoke('shell:openPath', p),
shellShowItemInFolder: p => ipcRenderer.invoke('shell:showItemInFolder', p),
onImportProgress: cb => {
importProgressCb = cb
},
onGamesChanged: cb => ipcRenderer.on('games:changed', () => cb())
})