diff --git a/src-electron/main.js b/src-electron/main.js index 421f1c25..07181568 100644 --- a/src-electron/main.js +++ b/src-electron/main.js @@ -14,19 +14,8 @@ const { spawn, spawnSync } = require('child_process'); const fs = require('fs'); const https = require('https'); -const VRCX_URI_PREFIX = "vrcx" - //app.disableHardwareAcceleration(); -if (process.defaultApp) { - if (process.argv.length >= 2) { - app.setAsDefaultProtocolClient(VRCX_URI_PREFIX, process.execPath, [path.resolve(process.argv[1])]) - } else { - app.setAsDefaultProtocolClient(VRCX_URI_PREFIX) - } -} - - if (process.platform === 'linux') { // Include bundled .NET runtime const bundledDotNetPath = path.join( @@ -59,6 +48,7 @@ if (!isDotNetInstalled()) { }); } +const VRCX_URI_PREFIX = 'vrcx'; let isOverlayActive = false; let appIsQuitting = false; @@ -69,6 +59,15 @@ const noInstall = args.includes('--no-install'); const x11 = args.includes('--x11'); const noDesktop = args.includes('--no-desktop'); const startup = args.includes('--startup'); +if (process.defaultApp) { + if (process.argv.length >= 2) { + app.setAsDefaultProtocolClient(VRCX_URI_PREFIX, process.execPath, [ + path.resolve(process.argv[1]) + ]); + } else { + app.setAsDefaultProtocolClient(VRCX_URI_PREFIX); + } +} const homePath = getHomePath(); tryRelaunchWithArgs(args); @@ -108,7 +107,6 @@ interopApi.getDotNetObject('Discord').Init(); interopApi.getDotNetObject('WebApi').Init(); interopApi.getDotNetObject('LogWatcher').Init(); -interopApi.getDotNetObject('IPCServer').Init(); interopApi.getDotNetObject('SystemMonitorElectron').Init(); interopApi.getDotNetObject('AppApiVrElectron').Init(); @@ -124,26 +122,31 @@ const hasAskedToMoveAppImage = VRCXStorage.Get('VRCX_HasAskedToMoveAppImage') === 'true'; let isCloseToTray = VRCXStorage.Get('VRCX_CloseToTray') === 'true'; -const gotTheLock = app.requestSingleInstanceLock() -const strip_vrcx_prefix_regex = new RegExp("^" + VRCX_URI_PREFIX + ":\/\/") +const gotTheLock = app.requestSingleInstanceLock(); +const strip_vrcx_prefix_regex = new RegExp('^' + VRCX_URI_PREFIX + '://'); if (!gotTheLock) { - app.quit() + app.quit(); } else { app.on('second-instance', (event, commandLine, workingDirectory) => { if (mainWindow && commandLine.length >= 2) { - mainWindow.webContents.send('launch-command', commandLine.pop().trim().replace(strip_vrcx_prefix_regex, "")) + mainWindow.webContents.send( + 'launch-command', + commandLine.pop().trim().replace(strip_vrcx_prefix_regex, '') + ); } - }) + }); app.on('open-url', (event, url) => { if (mainWindow && url) { - mainWindow.webContents.send('launch-command', url.replace(strip_vrcx_prefix_regex, "")) + mainWindow.webContents.send( + 'launch-command', + url.replace(strip_vrcx_prefix_regex, '') + ); } - }) + }); } - ipcMain.handle('applyWindowSettings', (event, position, size, state) => { if (position) { mainWindow.setPosition(parseInt(position.x), parseInt(position.y)); @@ -302,7 +305,7 @@ function createWindow() { icon: path.join(rootDir, 'VRCX.png'), autoHideMenuBar: true, webPreferences: { - preload: path.join(__dirname, 'preload.js'), + preload: path.join(__dirname, 'preload.js') } }); applyWindowState(); diff --git a/src-electron/preload.js b/src-electron/preload.js index 6207fc68..279c3d88 100644 --- a/src-electron/preload.js +++ b/src-electron/preload.js @@ -19,9 +19,7 @@ contextBridge.exposeInMainWorld('interopApi', { } }); - -const validChannels = ['launch-command'] - +const validChannels = ['launch-command']; contextBridge.exposeInMainWorld('electron', { openFileDialog: () => ipcRenderer.invoke('dialog:openFile'), @@ -35,17 +33,24 @@ contextBridge.exposeInMainWorld('electron', { desktopNotification: (title, body, icon) => ipcRenderer.invoke('notification:showNotification', title, body, icon), restartApp: () => ipcRenderer.invoke('app:restart'), - getWristOverlayWindow: () => ipcRenderer.invoke('app:getWristOverlayWindow'), + getWristOverlayWindow: () => + ipcRenderer.invoke('app:getWristOverlayWindow'), getHmdOverlayWindow: () => ipcRenderer.invoke('app:getHmdOverlayWindow'), updateVr: (active, hmdOverlay, wristOverlay, menuButton, overlayHand) => - ipcRenderer.invoke('app:updateVr', active, hmdOverlay, wristOverlay, menuButton, overlayHand), - + ipcRenderer.invoke( + 'app:updateVr', + active, + hmdOverlay, + wristOverlay, + menuButton, + overlayHand + ), ipcRenderer: { on(channel, func) { if (validChannels.includes(channel)) { - console.log("contextBridge", channel, func) + console.log('contextBridge', channel, func); ipcRenderer.on(channel, (event, ...args) => func(...args)); } - }, + } } -}); \ No newline at end of file +}); diff --git a/src/stores/vrcx.js b/src/stores/vrcx.js index 573680f9..3240fd01 100644 --- a/src/stores/vrcx.js +++ b/src/stores/vrcx.js @@ -65,6 +65,12 @@ export const useVrcxStore = defineStore('Vrcx', () => { async function init() { if (LINUX) { + window.electron.ipcRenderer.on('launch-command', (command) => { + if (command) { + eventLaunchCommand(command); + } + }); + window.electron.onWindowPositionChanged((event, position) => { state.locationX = position.x; state.locationY = position.y; @@ -516,6 +522,12 @@ export const useVrcxStore = defineStore('Vrcx', () => { case 'MsgPing': state.externalNotifierVersion = data.version; break; + case 'LaunchCommand': + eventLaunchCommand(data.command); + break; + case 'VRCXLaunch': + console.log('VRCXLaunch:', data); + break; default: console.log('IPC:', data); } @@ -532,17 +544,22 @@ export const useVrcxStore = defineStore('Vrcx', () => { watch( () => watchState.isLoggedIn, - (_isLoggedIn) => { + (isLoggedIn) => { state.isRegistryBackupDialogVisible = false; + if (isLoggedIn) { + startupLaunchCommand(); + } }, { flush: 'sync' } ); - window.electron.ipcRenderer.on('launch-command', (command) => { + async function startupLaunchCommand() { + const command = await AppApi.GetLaunchCommand(); if (command) { - eventLaunchCommand(command) + eventLaunchCommand(command); } - }) + } + function eventLaunchCommand(input) { if (!watchState.isLoggedIn) { return;