Skip to content

Commit 3112e7b

Browse files
ulkensindresorhus
authored andcommitted
Add ipc.callFocusedRenderer (#27)
1 parent 60d3d73 commit 3112e7b

File tree

6 files changed

+70
-5
lines changed

6 files changed

+70
-5
lines changed

index.d.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,31 @@ export interface MainProcessIpc extends IpcMain {
3131
data?: T
3232
): Promise<unknown>;
3333

34+
/**
35+
Send a message to the focused window, as determined by `electron.BrowserWindow.getFocusedWindow`.
36+
37+
In the renderer process, use `ipcRenderer.answerMain` to reply to this message.
38+
39+
@param channel - The channel to send the message on.
40+
@param data - The data to send to the receiver.
41+
@returns - The reply from the renderer process.
42+
43+
@example
44+
```
45+
import {ipcMain as ipc} from 'electron-better-ipc';
46+
47+
(async () => {
48+
const emoji = await ipc.callFocusedRenderer('get-emoji', 'unicorn');
49+
console.log(emoji);
50+
//=> '🦄'
51+
})();
52+
```
53+
*/
54+
callFocusedRenderer<T>(
55+
channel: string,
56+
data?: T
57+
): Promise<unknown>;
58+
3459
/**
3560
This method listens for a message from `ipcRenderer.callMain` defined in a renderer process and replies back.
3661

readme.md

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,10 @@ ipc.answerMain('get-emoji', async emojiName => {
8989
###### Main
9090

9191
```js
92-
const electron = require('electron');
9392
const {ipcMain: ipc} = require('electron-better-ipc');
9493

95-
const browserWindow = electron.BrowserWindow.getFocusedWindow();
96-
9794
(async () => {
98-
const emoji = await ipc.callRenderer(browserWindow, 'get-emoji', 'unicorn');
95+
const emoji = await ipc.callFocusedRenderer('get-emoji', 'unicorn');
9996
console.log(emoji);
10097
//=> '🦄'
10198
})();
@@ -114,7 +111,7 @@ Send a message to the given window.
114111

115112
In the renderer process, use `ipcRenderer.answerMain` to reply to this message.
116113

117-
Returns a `Promise<unknown>` with the reply from the renderer process..
114+
Returns a `Promise<unknown>` with the reply from the renderer process.
118115

119116
#### browserWindow
120117

@@ -134,6 +131,26 @@ Type: `unknown`
134131

135132
The data to send to the receiver.
136133

134+
### ipcMain.callFocusedRenderer(channel, [data])
135+
136+
Send a message to the focused window, as determined by `electron.BrowserWindow.getFocusedWindow`.
137+
138+
In the renderer process, use `ipcRenderer.answerMain` to reply to this message.
139+
140+
Returns a `Promise<unknown>` with the reply from the renderer process.
141+
142+
#### channel
143+
144+
Type: `string`
145+
146+
The channel to send the message on.
147+
148+
#### data
149+
150+
Type: `unknown`
151+
152+
The data to send to the receiver.
153+
137154
### ipcMain.answerRenderer(channel, callback)
138155

139156
This method listens for a message from `ipcRenderer.callMain` defined in a renderer process and replies back.

source/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ ipc.callRenderer = (browserWindow, channel, data) => new Promise((resolve, rejec
4343
}
4444
});
4545

46+
ipc.callFocusedRenderer = (...args) => ipc.callRenderer(BrowserWindow.getFocusedWindow(), ...args);
47+
4648
ipc.answerRenderer = (channel, callback) => {
4749
const sendChannel = util.getSendChannel(channel);
4850

test/fixture/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ ipc.answerRenderer('test', async data => {
1010
return 'test:main:answer';
1111
});
1212

13+
ipc.answerRenderer('test-focused', async data => {
14+
console.log('test-focused:main:data-from-renderer:', data);
15+
return 'test-focused:main:answer';
16+
});
17+
1318
ipc.answerRenderer('test-error', async () => {
1419
throw new Error('test-error:main:answer');
1520
});
@@ -30,4 +35,7 @@ let mainWindow;
3035

3136
const answer = await ipc.callRenderer(mainWindow, 'test', 'optional-data');
3237
console.log('test:main:answer-from-renderer:', answer);
38+
39+
const answerFromFocusedRenderer = await ipc.callFocusedRenderer('test-focused', 'optional-data');
40+
console.log('test-focused:main:answer-from-renderer', answerFromFocusedRenderer);
3341
})();

test/fixture/renderer.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,12 @@ ipc.callMain('test-error').catch(error => {
1414
console.log('test-error:renderer:from-main:is-error', error instanceof Error);
1515
console.log('test-error:renderer:from-main:error-message', error.message);
1616
});
17+
18+
ipc.callMain('test-focused', 'optional-data').then(answer => {
19+
console.log('test-focused:renderer:answer-from-main:', answer);
20+
})
21+
22+
ipc.answerMain('test-focused', data => {
23+
console.log('test-focused:renderer:data-from-main:', data);
24+
return 'test-focused:renderer:answer-data';
25+
});

test/fixture/test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,12 @@ test('main', async t => {
4747
// https://github.com/electron/spectron/issues/282
4848
'"test-error:renderer:from-main:error-message" "test-error:main:answer"',
4949
'"test-error:renderer:from-main:is-error" true',
50+
'"test-focused:renderer:answer-from-main:" "test-focused:main:answer"',
51+
'"test-focused:renderer:data-from-main:" "optional-data"',
5052
'"test:renderer:answer-from-main:" "test:main:answer"',
5153
'"test:renderer:data-from-main:" "optional-data"',
54+
'test-focused:main:answer-from-renderer test-focused:renderer:answer-data',
55+
'test-focused:main:data-from-renderer: optional-data',
5256
'test:main:answer-from-renderer: test:renderer:answer-data',
5357
'test:main:data-from-renderer: optional-data'
5458
]);

0 commit comments

Comments
 (0)