feat: new makeSingleInstance API (#12782)
* Refactor app.makeSingleInstance * new API `app.isPrimaryInstance()` * new API `app.isSingleInstance()` * new event `app.on('second-instance')` * deprecated old syntax `app.makeSingleInstance(cb)` * deprecated old syntax of `app.makeSingleInstance() --> bool` in favor of `app.isPrimaryInstance()` * Fix spec, we don't need process.nextTick hacks any more * Make deprecation TODO for the return value of makeSingleInstance * Refactor makeSingleInstance to requestSingleInstanceLock and add appropriate deprecation comments * I swear this isn't tricking the linter * Make const * Add deprecation warnings for release, and add to planned-breaking-changes BREAKING CHANGE
This commit is contained in:
parent
9c8952aef0
commit
5b5c161601
9 changed files with 176 additions and 52 deletions
|
@ -373,6 +373,22 @@ app.on('session-created', (event, session) => {
|
|||
})
|
||||
```
|
||||
|
||||
### Event: 'second-instance'
|
||||
|
||||
Returns:
|
||||
|
||||
* `argv` String[] - An array of the second instance's command line arguments
|
||||
* `workingDirectory` String - The second instance's working directory
|
||||
|
||||
This event will be emitted inside the primary instance of your application
|
||||
when a second instance has been executed. `argv` is an Array of the second instance's
|
||||
command line arguments, and `workingDirectory` is its current working directory. Usually
|
||||
applications respond to this by making their primary window focused and
|
||||
non-minimized.
|
||||
|
||||
This event is guaranteed to be emitted after the `ready` event of `app`
|
||||
gets emitted.
|
||||
|
||||
## Methods
|
||||
|
||||
The `app` object has the following methods:
|
||||
|
@ -742,32 +758,24 @@ app.setJumpList([
|
|||
])
|
||||
```
|
||||
|
||||
### `app.makeSingleInstance(callback)`
|
||||
### `app.requestSingleInstanceLock()`
|
||||
|
||||
* `callback` Function
|
||||
* `argv` String[] - An array of the second instance's command line arguments
|
||||
* `workingDirectory` String - The second instance's working directory
|
||||
|
||||
Returns `Boolean`.
|
||||
Returns `Boolean`
|
||||
|
||||
This method makes your application a Single Instance Application - instead of
|
||||
allowing multiple instances of your app to run, this will ensure that only a
|
||||
single instance of your app is running, and other instances signal this
|
||||
instance and exit.
|
||||
|
||||
`callback` will be called by the first instance with `callback(argv, workingDirectory)`
|
||||
when a second instance has been executed. `argv` is an Array of the second instance's
|
||||
command line arguments, and `workingDirectory` is its current working directory. Usually
|
||||
applications respond to this by making their primary window focused and
|
||||
non-minimized.
|
||||
The return value of this method indicates whether or not this instance of your
|
||||
application successfully obtained the lock. If it failed to obtain the lock
|
||||
you can assume that another instance of your application is already running with
|
||||
the lock and exit immediately.
|
||||
|
||||
The `callback` is guaranteed to be executed after the `ready` event of `app`
|
||||
gets emitted.
|
||||
|
||||
This method returns `false` if your process is the primary instance of the
|
||||
application and your app should continue loading. And returns `true` if your
|
||||
process has sent its parameters to another instance, and you should immediately
|
||||
quit.
|
||||
I.e. This method returns `true` if your process is the primary instance of your
|
||||
application and your app should continue loading. It returns `false` if your
|
||||
process should immediately quit as it has sent its parameters to another
|
||||
instance that has already acquired the lock.
|
||||
|
||||
On macOS the system enforces single instance automatically when users try to open
|
||||
a second instance of your app in Finder, and the `open-file` and `open-url`
|
||||
|
@ -782,27 +790,38 @@ starts:
|
|||
const {app} = require('electron')
|
||||
let myWindow = null
|
||||
|
||||
const isSecondInstance = app.makeSingleInstance((commandLine, workingDirectory) => {
|
||||
// Someone tried to run a second instance, we should focus our window.
|
||||
if (myWindow) {
|
||||
if (myWindow.isMinimized()) myWindow.restore()
|
||||
myWindow.focus()
|
||||
}
|
||||
})
|
||||
const gotTheLock = app.requestSingleInstanceLock()
|
||||
|
||||
if (isSecondInstance) {
|
||||
if (!gotTheLock) {
|
||||
app.quit()
|
||||
}
|
||||
} else {
|
||||
app.on('second-instance', (commandLine, workingDirectory) => {
|
||||
// Someone tried to run a second instance, we should focus our window.
|
||||
if (myWindow) {
|
||||
if (myWindow.isMinimized()) myWindow.restore()
|
||||
myWindow.focus()
|
||||
}
|
||||
})
|
||||
|
||||
// Create myWindow, load the rest of the app, etc...
|
||||
app.on('ready', () => {
|
||||
})
|
||||
// Create myWindow, load the rest of the app, etc...
|
||||
app.on('ready', () => {
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### `app.releaseSingleInstance()`
|
||||
### `app.hasSingleInstanceLock()`
|
||||
|
||||
Releases all locks that were created by `makeSingleInstance`. This will allow
|
||||
multiple instances of the application to once again run side by side.
|
||||
Returns `Boolean`
|
||||
|
||||
This method returns whether or not this instance of your app is currently
|
||||
holding the single instance lock. You can request the lock with
|
||||
`app.requestSingleInstanceLock()` and release with
|
||||
`app.releaseSingleInstanceLock()`
|
||||
|
||||
### `app.releaseSingleInstanceLock()`
|
||||
|
||||
Releases all locks that were created by `requestSingleInstanceLock`. This will
|
||||
allow multiple instances of the application to once again run side by side.
|
||||
|
||||
### `app.setUserActivity(type, userInfo[, webpageURL])` _macOS_
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue