🐛 多个桌面端快捷方式指定不同的 --workspace 参数后无法启动多个工作空间 https://github.com/siyuan-note/siyuan/issues/7059

This commit is contained in:
Liang Ding 2023-01-13 23:01:16 +08:00
parent f674f249a3
commit dc34967e88
No known key found for this signature in database
GPG key ID: 136F30F901A2231D

View file

@ -52,10 +52,8 @@ try {
}
} catch (e) {
console.error(e)
require('electron').
dialog.
showErrorBox('创建配置目录失败 Failed to create config directory',
'思源需要在用户家目录下创建配置文件夹(~/.config/siyuan请确保该路径具有写入权限。\n\nSiYuan needs to create a configuration folder (~/.config/siyuan) in the user\'s home directory. Please make sure that the path has write permissions.')
require('electron').dialog.showErrorBox('创建配置目录失败 Failed to create config directory',
'思源需要在用户家目录下创建配置文件夹(~/.config/siyuan请确保该路径具有写入权限。\n\nSiYuan needs to create a configuration folder (~/.config/siyuan) in the user\'s home directory. Please make sure that the path has write permissions.')
app.exit()
}
@ -352,6 +350,20 @@ const boot = () => {
})
}
const showWindow = (wnd) => {
if (!wnd || wnd.isDestroyed()) {
return
}
if (wnd.isMinimized()) {
wnd.restore()
}
if (!wnd.isVisible()) {
wnd.show()
}
wnd.focus()
}
const initKernel = (workspace, lang) => {
return new Promise(async (resolve) => {
bootWindow = new BrowserWindow({
@ -428,8 +440,7 @@ const initKernel = (workspace, lang) => {
kernelPort + ']')
kernelProcess.on('close', (code) => {
writeLog(
`kernel [pid=${kernelProcessPid}] exited with code [${code}]`)
writeLog(`kernel [pid=${kernelProcessPid}] exited with code [${code}]`)
if (0 !== code) {
switch (code) {
case 20:
@ -454,7 +465,12 @@ const initKernel = (workspace, lang) => {
'⚠️ 无法读写块树文件 Failed to access blocktree file',
`<div>块树文件正在被其他程序锁定或者已经损坏,请删除 工作空间/temp/ 文件夹后重启</div><div>The block tree file is being locked by another program or is corrupted, please delete the workspace/temp/ folder and restart.</div>`)
break
case 24:
case 24: // 工作空间已被锁定,尝试切换到第一个打开的工作空间
if (workspaces && 0 < workspaces.length) {
showWindow(workspaces[0].browserWindow)
return
}
showErrorWindow(
'⚠️ 工作空间已被锁定 The workspace is locked',
`<div>该工作空间正在被使用。</div><div>The workspace is in use.</div>`)
@ -567,7 +583,7 @@ app.whenReady().then(() => {
? lang.hideWindow
: lang.showWindow,
click: () => {
showHideWnd(tray, lang, mainWindow)
showHideWindow(tray, lang, mainWindow)
},
},
{
@ -617,7 +633,8 @@ app.whenReady().then(() => {
const contextMenu = Menu.buildFromTemplate(trayMenuTemplate)
tray.setContextMenu(contextMenu)
}
const showHideWnd = (tray, lang, mainWindow) => {
const showHideWindow = (tray, lang, mainWindow) => {
if (!mainWindow.isVisible()) {
if (mainWindow.isMinimized()) {
mainWindow.restore()
@ -634,14 +651,7 @@ app.whenReady().then(() => {
app.exit()
})
ipcMain.on('siyuan-show', (event, id) => {
const mainWindow = BrowserWindow.fromId(id)
if (mainWindow.isMinimized()) {
mainWindow.restore()
}
if (!mainWindow.isVisible()) {
mainWindow.show()
}
mainWindow.focus()
showWindow(BrowserWindow.fromId(id))
})
ipcMain.on('siyuan-config-tray', (event, data) => {
workspaces.find(item => {
@ -712,20 +722,13 @@ app.whenReady().then(() => {
}
})
ipcMain.on('siyuan-open-workspace', (event, data) => {
const exitWorkspace = workspaces.find((item, index) => {
const foundWorkspace = workspaces.find((item, index) => {
if (item.workspaceDir === data.workspace) {
const mainWindow = item.browserWindow
if (mainWindow.isMinimized()) {
mainWindow.restore()
}
if (!mainWindow.isVisible()) {
mainWindow.show()
}
mainWindow.focus()
showWindow(item.browserWindow)
return true
}
})
if (!exitWorkspace) {
if (!foundWorkspace) {
initKernel(data.workspace, data.lang).then((isSucc) => {
if (isSucc) {
boot()
@ -750,7 +753,7 @@ app.whenReady().then(() => {
const mainWindow = BrowserWindow.fromId(data.id)
resetTrayMenu(tray, data.languages, mainWindow)
tray.on('click', () => {
showHideWnd(tray, data.languages, mainWindow)
showHideWindow(tray, data.languages, mainWindow)
})
}
workspaces.find(item => {
@ -843,8 +846,8 @@ app.whenReady().then(() => {
} else {
const getArg = (name) => {
for (let i = 0; i < process.argv.length; i++) {
if (process.argv[i] === name) {
return process.argv[i + 1]
if (process.argv[i].startsWith(name)) {
return process.argv[i].split('=')[1]
}
}
}
@ -871,13 +874,36 @@ app.on('open-url', (event, url) => { // for macOS
}
})
app.on('second-instance', (event, commandLine) => {
app.on('second-instance', (event, argv) => {
writeLog('second-instance [' + argv + ']')
const siyuanURL = argv.find((arg) => arg.startsWith('siyuan://'))
let workspace = argv.find((arg) => arg.startsWith('--workspace='))
if (workspace) {
workspace = workspace.split('=')[1]
writeLog('got second-instance arg [--workspace=' + workspace + ']')
}
let foundWorkspace = false
workspaces.forEach(item => {
if (item.browserWindow && !item.browserWindow.isDestroyed()) {
item.browserWindow.webContents.send('siyuan-openurl',
commandLine.find((arg) => arg.startsWith('siyuan://')))
if (siyuanURL) {
item.browserWindow.webContents.send('siyuan-openurl', siyuanURL)
return
}
if (workspace && workspace === item.workspaceDir) {
showWindow(item.browserWindow)
foundWorkspace = true
}
}
})
if (!foundWorkspace) {
initKernel(workspace).then((isSucc) => {
if (isSucc) {
boot()
}
})
}
})
app.on('activate', () => {