electron-screenshots 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -111,10 +111,10 @@ export interface ScreenshotsOpts {
111
111
 
112
112
  | 名称 | 说明 | 返回值 |
113
113
  | ------------------------------------ | ---------------- | ------ |
114
- | `constructor(opts: ScreenshotsOpts)` | 调用截图方法截图 | - |
115
- | `startCapture()` | 调用截图方法截图 | - |
116
- | `endCapture() ` | 手动结束截图 | - |
117
- | `setLang(lang: Lang)` | 修改语言 | - |
114
+ | `constructor(opts: ScreenshotsOpts): Screenshots` | 调用截图方法截图 | - |
115
+ | `startCapture(): Promise<void>` | 调用截图方法截图 | - |
116
+ | `endCapture(): Promise<void>` | 手动结束截图 | - |
117
+ | `setLang(lang: Lang): void` | 修改语言 | - |
118
118
 
119
119
  ## Events
120
120
 
package/lib/index.js CHANGED
@@ -3,8 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- var electron_debug_1 = __importDefault(require("electron-debug"));
7
6
  var electron_1 = require("electron");
7
+ var electron_debug_1 = __importDefault(require("electron-debug"));
8
8
  var screenshots_1 = __importDefault(require("./screenshots"));
9
9
  electron_1.app.whenReady().then(function () {
10
10
  var screenshots = new screenshots_1.default({
package/lib/preload.js CHANGED
@@ -1,4 +1,13 @@
1
1
  "use strict";
2
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
+ if (ar || !(i in from)) {
5
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
+ ar[i] = from[i];
7
+ }
8
+ }
9
+ return to.concat(ar || Array.prototype.slice.call(from));
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  var electron_1 = require("electron");
4
13
  var map = new Map();
@@ -7,6 +16,10 @@ electron_1.contextBridge.exposeInMainWorld('screenshots', {
7
16
  console.log('contextBridge ready');
8
17
  electron_1.ipcRenderer.send('SCREENSHOTS:ready');
9
18
  },
19
+ reset: function () {
20
+ console.log('contextBridge reset');
21
+ electron_1.ipcRenderer.send('SCREENSHOTS:reset');
22
+ },
10
23
  save: function (arrayBuffer, data) {
11
24
  console.log('contextBridge save', arrayBuffer, data);
12
25
  electron_1.ipcRenderer.send('SCREENSHOTS:save', Buffer.from(arrayBuffer), data);
@@ -27,7 +40,8 @@ electron_1.contextBridge.exposeInMainWorld('screenshots', {
27
40
  for (var _i = 1; _i < arguments.length; _i++) {
28
41
  args[_i - 1] = arguments[_i];
29
42
  }
30
- return fn.apply(void 0, args);
43
+ console.log.apply(console, __spreadArray(['contextBridge on', channel, fn], args, false));
44
+ fn.apply(void 0, args);
31
45
  };
32
46
  var listeners = (_a = map.get(fn)) !== null && _a !== void 0 ? _a : {};
33
47
  listeners[channel] = listener;
@@ -33,15 +33,16 @@ export default class Screenshots extends Events {
33
33
  /**
34
34
  * 开始截图
35
35
  */
36
- startCapture(): void;
36
+ startCapture(): Promise<void>;
37
37
  /**
38
38
  * 结束截图
39
39
  */
40
- endCapture(): void;
40
+ endCapture(): Promise<void>;
41
41
  /**
42
42
  * 设置语言
43
43
  */
44
44
  setLang(lang: Partial<Lang>): void;
45
+ private reset;
45
46
  /**
46
47
  * 初始化窗口
47
48
  */
@@ -112,23 +112,25 @@ var Screenshots = /** @class */ (function (_super) {
112
112
  * 开始截图
113
113
  */
114
114
  Screenshots.prototype.startCapture = function () {
115
- var _this = this;
116
- this.logger('startCapture');
117
- this.isReady.then(function () {
118
- if (_this.$win && !_this.$win.isDestroyed()) {
119
- _this.$win.close();
120
- }
121
- var boundAndDisplay = (0, getBoundAndDisplay_1.default)();
122
- _this.createWindow(boundAndDisplay);
123
- // 捕捉桌面之后显示窗口
124
- // 避免截图窗口自己被截图
125
- _this.capture(boundAndDisplay).then(function () {
126
- if (!_this.$win)
127
- return;
128
- // linux截图存在黑屏,这里设置为false就不会出现这个问题
129
- _this.$win.setFullScreen(true);
130
- _this.$win.show();
131
- _this.$win.focus();
115
+ var _a, _b;
116
+ return __awaiter(this, void 0, void 0, function () {
117
+ var _c, bound, display, imageUrl;
118
+ return __generator(this, function (_d) {
119
+ switch (_d.label) {
120
+ case 0:
121
+ this.logger('startCapture');
122
+ _c = (0, getBoundAndDisplay_1.default)(), bound = _c.bound, display = _c.display;
123
+ return [4 /*yield*/, Promise.all([this.capture(display), this.isReady])];
124
+ case 1:
125
+ imageUrl = (_d.sent())[0];
126
+ return [4 /*yield*/, this.createWindow(bound)];
127
+ case 2:
128
+ _d.sent();
129
+ this.$view.webContents.send('SCREENSHOTS:capture', display, imageUrl);
130
+ (_a = this.$win) === null || _a === void 0 ? void 0 : _a.show();
131
+ (_b = this.$win) === null || _b === void 0 ? void 0 : _b.focus();
132
+ return [2 /*return*/];
133
+ }
132
134
  });
133
135
  });
134
136
  };
@@ -136,12 +138,25 @@ var Screenshots = /** @class */ (function (_super) {
136
138
  * 结束截图
137
139
  */
138
140
  Screenshots.prototype.endCapture = function () {
139
- this.logger('endCapture');
140
- if (!this.$win)
141
- return;
142
- this.$win.setSimpleFullScreen(false);
143
- this.$win.close();
144
- this.$win = null;
141
+ return __awaiter(this, void 0, void 0, function () {
142
+ return __generator(this, function (_a) {
143
+ switch (_a.label) {
144
+ case 0:
145
+ this.logger('endCapture');
146
+ return [4 /*yield*/, this.reset()];
147
+ case 1:
148
+ _a.sent();
149
+ if (!this.$win) {
150
+ return [2 /*return*/];
151
+ }
152
+ this.$win.setBrowserView(null);
153
+ this.$win.setSimpleFullScreen(false);
154
+ this.$win.close();
155
+ this.$win = null;
156
+ return [2 /*return*/];
157
+ }
158
+ });
159
+ });
145
160
  };
146
161
  /**
147
162
  * 设置语言
@@ -153,74 +168,121 @@ var Screenshots = /** @class */ (function (_super) {
153
168
  _this.$view.webContents.send('SCREENSHOTS:setLang', lang);
154
169
  });
155
170
  };
171
+ Screenshots.prototype.reset = function () {
172
+ return __awaiter(this, void 0, void 0, function () {
173
+ return __generator(this, function (_a) {
174
+ switch (_a.label) {
175
+ case 0:
176
+ // 重置截图区域
177
+ this.$view.webContents.send('SCREENSHOTS:reset');
178
+ // 保证 UI 有足够的时间渲染
179
+ return [4 /*yield*/, Promise.race([
180
+ new Promise(function (resolve) { return setTimeout(function () { return resolve(); }, 500); }),
181
+ new Promise(function (resolve) { return electron_1.ipcMain.once('SCREENSHOTS:reset', function () { return resolve(); }); })
182
+ ])];
183
+ case 1:
184
+ // 保证 UI 有足够的时间渲染
185
+ _a.sent();
186
+ return [2 /*return*/];
187
+ }
188
+ });
189
+ });
190
+ };
156
191
  /**
157
192
  * 初始化窗口
158
193
  */
159
- Screenshots.prototype.createWindow = function (_a) {
160
- var bound = _a.bound;
161
- this.$win = new electron_1.BrowserWindow({
162
- title: 'screenshots',
163
- x: bound.x,
164
- y: bound.y,
165
- width: bound.width,
166
- height: bound.height,
167
- useContentSize: true,
168
- frame: false,
169
- show: false,
170
- autoHideMenuBar: true,
171
- transparent: true,
172
- resizable: false,
173
- movable: false,
174
- focusable: true,
175
- // 为true,截屏显示为黑屏
176
- // 所以在截屏图像生成后再设置为true
177
- // 参考48-49行
178
- fullscreen: false,
179
- // 设为true mac全屏窗口没有桌面滚动效果
180
- simpleFullscreen: true,
181
- backgroundColor: '#00000000',
182
- titleBarStyle: 'hidden',
183
- alwaysOnTop: true,
184
- enableLargerThanScreen: true,
185
- skipTaskbar: true,
186
- minimizable: false,
187
- maximizable: false,
188
- webPreferences: {
189
- nodeIntegration: false,
190
- contextIsolation: false,
191
- nativeWindowOpen: false
192
- }
194
+ Screenshots.prototype.createWindow = function (bound) {
195
+ var _a, _b;
196
+ return __awaiter(this, void 0, void 0, function () {
197
+ var _this = this;
198
+ return __generator(this, function (_c) {
199
+ switch (_c.label) {
200
+ case 0:
201
+ // 重置截图区域
202
+ return [4 /*yield*/, this.reset()
203
+ // 复用未销毁的窗口
204
+ ];
205
+ case 1:
206
+ // 重置截图区域
207
+ _c.sent();
208
+ // 复用未销毁的窗口
209
+ if (!this.$win || ((_b = (_a = this.$win) === null || _a === void 0 ? void 0 : _a.isDestroyed) === null || _b === void 0 ? void 0 : _b.call(_a))) {
210
+ this.$win = new electron_1.BrowserWindow({
211
+ title: 'screenshots',
212
+ x: bound.x,
213
+ y: bound.y,
214
+ width: bound.width,
215
+ height: bound.height,
216
+ useContentSize: true,
217
+ frame: false,
218
+ show: false,
219
+ autoHideMenuBar: true,
220
+ transparent: true,
221
+ resizable: false,
222
+ movable: false,
223
+ // focusable: true, 否则窗口不能及时响应esc按键,输入框也不能输入
224
+ focusable: true,
225
+ fullscreen: true,
226
+ // 设为true 防止mac新开一个桌面,影响效果
227
+ simpleFullscreen: true,
228
+ backgroundColor: '#00000000',
229
+ titleBarStyle: 'hidden',
230
+ alwaysOnTop: true,
231
+ enableLargerThanScreen: true,
232
+ skipTaskbar: true,
233
+ hasShadow: false,
234
+ minimizable: false,
235
+ maximizable: false,
236
+ paintWhenInitiallyHidden: false
237
+ });
238
+ // 确保获得焦点
239
+ this.$win.on('show', function () {
240
+ var _a;
241
+ (_a = _this.$win) === null || _a === void 0 ? void 0 : _a.focus();
242
+ setImmediate(function () {
243
+ var _a;
244
+ (_a = _this.$win) === null || _a === void 0 ? void 0 : _a.focus();
245
+ });
246
+ });
247
+ }
248
+ this.$win.setBounds(bound);
249
+ this.$win.setBrowserView(this.$view);
250
+ this.$view.setBounds({
251
+ x: 0,
252
+ y: 0,
253
+ width: bound.width,
254
+ height: bound.height
255
+ });
256
+ return [2 /*return*/];
257
+ }
258
+ });
193
259
  });
194
- this.$win.setBrowserView(this.$view);
195
- this.$view.setBounds(bound);
196
260
  };
197
- Screenshots.prototype.capture = function (_a) {
198
- var display = _a.display;
261
+ Screenshots.prototype.capture = function (display) {
199
262
  return __awaiter(this, void 0, void 0, function () {
200
263
  var NodeScreenshots, capturer, image, err_1, sources, source;
201
- return __generator(this, function (_b) {
202
- switch (_b.label) {
264
+ return __generator(this, function (_a) {
265
+ switch (_a.label) {
203
266
  case 0:
204
267
  this.logger('SCREENSHOTS:capture');
205
- _b.label = 1;
268
+ _a.label = 1;
206
269
  case 1:
207
- _b.trys.push([1, 4, , 6]);
270
+ _a.trys.push([1, 4, , 6]);
208
271
  return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('node-screenshots')); })];
209
272
  case 2:
210
- NodeScreenshots = (_b.sent()).Screenshots;
273
+ NodeScreenshots = (_a.sent()).Screenshots;
211
274
  capturer = NodeScreenshots.fromDisplay(display.id);
212
- this.logger('SCREENSHOTS:NodeScreenshots.fromDisplay(%d) %o', display.id, capturer);
275
+ this.logger('SCREENSHOTS:capture NodeScreenshots.fromDisplay(%d) %o', display.id, capturer);
213
276
  if (!capturer) {
214
277
  throw new Error("NodeScreenshots.fromDisplay(".concat(display.id, ") get null"));
215
278
  }
216
279
  return [4 /*yield*/, capturer.capture()];
217
280
  case 3:
218
- image = _b.sent();
219
- this.$view.webContents.send('SCREENSHOTS:capture', display, "data:image/png;base64,".concat(image.toString('base64')));
220
- return [3 /*break*/, 6];
281
+ image = _a.sent();
282
+ return [2 /*return*/, "data:image/png;base64,".concat(image.toString('base64'))];
221
283
  case 4:
222
- err_1 = _b.sent();
223
- this.logger('SCREENSHOTS:capturer.capture() error %o', err_1);
284
+ err_1 = _a.sent();
285
+ this.logger('SCREENSHOTS:capture NodeScreenshots capture() error %o', err_1);
224
286
  return [4 /*yield*/, electron_1.desktopCapturer.getSources({
225
287
  types: ['screen'],
226
288
  thumbnailSize: {
@@ -229,9 +291,10 @@ var Screenshots = /** @class */ (function (_super) {
229
291
  }
230
292
  })];
231
293
  case 5:
232
- sources = _b.sent();
294
+ sources = _a.sent();
233
295
  source = void 0;
234
- // Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id 和 这儿 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
296
+ // Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id
297
+ // 和这里 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
235
298
  // 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
236
299
  if (sources.length === 1) {
237
300
  source = sources[0];
@@ -242,13 +305,10 @@ var Screenshots = /** @class */ (function (_super) {
242
305
  });
243
306
  }
244
307
  if (!source) {
245
- console.error(sources);
246
- console.error(display);
247
- console.error("Can't find screen source");
248
- return [2 /*return*/];
308
+ this.logger("SCREENSHOTS:capture Can't find screen source. sources: %o, display: %o", sources, display);
309
+ throw new Error("Can't find screen source");
249
310
  }
250
- this.$view.webContents.send('SCREENSHOTS:capture', display, source.thumbnail.toDataURL());
251
- return [3 /*break*/, 6];
311
+ return [2 /*return*/, source.thumbnail.toDataURL()];
252
312
  case 6: return [2 /*return*/];
253
313
  }
254
314
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-screenshots",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "description": "electron 截图插件",
5
5
  "types": "lib/screenshots.d.ts",
6
6
  "main": "lib/screenshots.js",
@@ -38,7 +38,7 @@
38
38
  "debug": "^4.3.3",
39
39
  "fs-extra": "^10.1.0",
40
40
  "node-screenshots": "^0.0.3",
41
- "react-screenshots": "^0.4.0"
41
+ "react-screenshots": "^0.4.4"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "electron": ">=11"
@@ -59,5 +59,5 @@
59
59
  "rimraf": "^3.0.2",
60
60
  "typescript": "^4.5.5"
61
61
  },
62
- "gitHead": "a518f3ba2a36ff0e116ebf90d180157b27a39fc3"
62
+ "gitHead": "4731a04ae6ad2afa477b54b472c28711c0c7eb16"
63
63
  }