electron-screenshots 0.4.3 → 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/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;
@@ -42,6 +42,7 @@ export default class Screenshots extends Events {
42
42
  * 设置语言
43
43
  */
44
44
  setLang(lang: Partial<Lang>): void;
45
+ private reset;
45
46
  /**
46
47
  * 初始化窗口
47
48
  */
@@ -112,39 +112,23 @@ var Screenshots = /** @class */ (function (_super) {
112
112
  * 开始截图
113
113
  */
114
114
  Screenshots.prototype.startCapture = function () {
115
+ var _a, _b;
115
116
  return __awaiter(this, void 0, void 0, function () {
116
- var boundAndDisplay;
117
- return __generator(this, function (_a) {
118
- switch (_a.label) {
117
+ var _c, bound, display, imageUrl;
118
+ return __generator(this, function (_d) {
119
+ switch (_d.label) {
119
120
  case 0:
120
121
  this.logger('startCapture');
121
- return [4 /*yield*/, this.isReady
122
- // 先关闭上一次的窗口
123
- // 防止用户连续截图
124
- ];
122
+ _c = (0, getBoundAndDisplay_1.default)(), bound = _c.bound, display = _c.display;
123
+ return [4 /*yield*/, Promise.all([this.capture(display), this.isReady])];
125
124
  case 1:
126
- _a.sent();
127
- // 先关闭上一次的窗口
128
- // 防止用户连续截图
129
- return [4 /*yield*/, this.endCapture()];
125
+ imageUrl = (_d.sent())[0];
126
+ return [4 /*yield*/, this.createWindow(bound)];
130
127
  case 2:
131
- // 先关闭上一次的窗口
132
- // 防止用户连续截图
133
- _a.sent();
134
- boundAndDisplay = (0, getBoundAndDisplay_1.default)();
135
- this.createWindow(boundAndDisplay);
136
- // 捕捉桌面之后显示窗口
137
- // 避免截图窗口自己被截图
138
- return [4 /*yield*/, this.capture(boundAndDisplay)];
139
- case 3:
140
- // 捕捉桌面之后显示窗口
141
- // 避免截图窗口自己被截图
142
- _a.sent();
143
- if (!this.$win) {
144
- return [2 /*return*/];
145
- }
146
- this.$win.show();
147
- this.$win.focus();
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();
148
132
  return [2 /*return*/];
149
133
  }
150
134
  });
@@ -159,11 +143,8 @@ var Screenshots = /** @class */ (function (_super) {
159
143
  switch (_a.label) {
160
144
  case 0:
161
145
  this.logger('endCapture');
162
- this.$view.webContents.send('SCREENSHOTS:reset');
163
- // 保证 UI 有足够的时间渲染
164
- return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(function () { return resolve(); }, 77); })];
146
+ return [4 /*yield*/, this.reset()];
165
147
  case 1:
166
- // 保证 UI 有足够的时间渲染
167
148
  _a.sent();
168
149
  if (!this.$win) {
169
150
  return [2 /*return*/];
@@ -187,74 +168,121 @@ var Screenshots = /** @class */ (function (_super) {
187
168
  _this.$view.webContents.send('SCREENSHOTS:setLang', lang);
188
169
  });
189
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
+ };
190
191
  /**
191
192
  * 初始化窗口
192
193
  */
193
- Screenshots.prototype.createWindow = function (_a) {
194
- var bound = _a.bound;
195
- this.$win = new electron_1.BrowserWindow({
196
- title: 'screenshots',
197
- x: bound.x,
198
- y: bound.y,
199
- width: bound.width,
200
- height: bound.height,
201
- useContentSize: true,
202
- frame: false,
203
- show: false,
204
- autoHideMenuBar: true,
205
- transparent: true,
206
- resizable: false,
207
- movable: false,
208
- focusable: false,
209
- fullscreen: true,
210
- // 设为true 防止mac新开一个桌面,影响效果
211
- simpleFullscreen: true,
212
- backgroundColor: '#00000000',
213
- titleBarStyle: 'hidden',
214
- alwaysOnTop: true,
215
- enableLargerThanScreen: true,
216
- skipTaskbar: true,
217
- hasShadow: false,
218
- minimizable: false,
219
- maximizable: false,
220
- webPreferences: {
221
- nodeIntegration: false,
222
- contextIsolation: false,
223
- nativeWindowOpen: false
224
- }
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
+ });
225
259
  });
226
- this.$win.setBrowserView(this.$view);
227
- this.$view.setBounds(bound);
228
- // 重置截图区域
229
- this.$view.webContents.send('SCREENSHOTS:reset');
230
260
  };
231
- Screenshots.prototype.capture = function (_a) {
232
- var display = _a.display;
261
+ Screenshots.prototype.capture = function (display) {
233
262
  return __awaiter(this, void 0, void 0, function () {
234
263
  var NodeScreenshots, capturer, image, err_1, sources, source;
235
- return __generator(this, function (_b) {
236
- switch (_b.label) {
264
+ return __generator(this, function (_a) {
265
+ switch (_a.label) {
237
266
  case 0:
238
267
  this.logger('SCREENSHOTS:capture');
239
- _b.label = 1;
268
+ _a.label = 1;
240
269
  case 1:
241
- _b.trys.push([1, 4, , 6]);
270
+ _a.trys.push([1, 4, , 6]);
242
271
  return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('node-screenshots')); })];
243
272
  case 2:
244
- NodeScreenshots = (_b.sent()).Screenshots;
273
+ NodeScreenshots = (_a.sent()).Screenshots;
245
274
  capturer = NodeScreenshots.fromDisplay(display.id);
246
- this.logger('SCREENSHOTS:NodeScreenshots.fromDisplay(%d) %o', display.id, capturer);
275
+ this.logger('SCREENSHOTS:capture NodeScreenshots.fromDisplay(%d) %o', display.id, capturer);
247
276
  if (!capturer) {
248
277
  throw new Error("NodeScreenshots.fromDisplay(".concat(display.id, ") get null"));
249
278
  }
250
279
  return [4 /*yield*/, capturer.capture()];
251
280
  case 3:
252
- image = _b.sent();
253
- this.$view.webContents.send('SCREENSHOTS:capture', display, "data:image/png;base64,".concat(image.toString('base64')));
254
- return [3 /*break*/, 6];
281
+ image = _a.sent();
282
+ return [2 /*return*/, "data:image/png;base64,".concat(image.toString('base64'))];
255
283
  case 4:
256
- err_1 = _b.sent();
257
- 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);
258
286
  return [4 /*yield*/, electron_1.desktopCapturer.getSources({
259
287
  types: ['screen'],
260
288
  thumbnailSize: {
@@ -263,9 +291,10 @@ var Screenshots = /** @class */ (function (_super) {
263
291
  }
264
292
  })];
265
293
  case 5:
266
- sources = _b.sent();
294
+ sources = _a.sent();
267
295
  source = void 0;
268
- // Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id 和 这儿 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
296
+ // Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id
297
+ // 和这里 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
269
298
  // 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
270
299
  if (sources.length === 1) {
271
300
  source = sources[0];
@@ -276,13 +305,10 @@ var Screenshots = /** @class */ (function (_super) {
276
305
  });
277
306
  }
278
307
  if (!source) {
279
- console.error(sources);
280
- console.error(display);
281
- console.error("Can't find screen source");
282
- 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");
283
310
  }
284
- this.$view.webContents.send('SCREENSHOTS:capture', display, source.thumbnail.toDataURL());
285
- return [3 /*break*/, 6];
311
+ return [2 /*return*/, source.thumbnail.toDataURL()];
286
312
  case 6: return [2 /*return*/];
287
313
  }
288
314
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-screenshots",
3
- "version": "0.4.3",
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.3"
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": "3e638210e66eb121fee66fa5dd3263cfd5245a9b"
62
+ "gitHead": "4731a04ae6ad2afa477b54b472c28711c0c7eb16"
63
63
  }