electron-screenshots 0.2.0 → 0.3.2
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 +0 -74
- package/lib/screenshots.d.ts +1 -0
- package/lib/screenshots.js +84 -7
- package/package.json +6 -4
package/lib/preload.js
CHANGED
|
@@ -1,40 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
3
|
var electron_1 = require("electron");
|
|
40
4
|
var map = new Map();
|
|
@@ -43,44 +7,6 @@ electron_1.contextBridge.exposeInMainWorld('screenshots', {
|
|
|
43
7
|
console.log('contextBridge ready');
|
|
44
8
|
electron_1.ipcRenderer.send('SCREENSHOTS:ready');
|
|
45
9
|
},
|
|
46
|
-
capture: function (display) { return __awaiter(void 0, void 0, void 0, function () {
|
|
47
|
-
var sources, source;
|
|
48
|
-
return __generator(this, function (_a) {
|
|
49
|
-
switch (_a.label) {
|
|
50
|
-
case 0:
|
|
51
|
-
console.log('contextBridge capture', display);
|
|
52
|
-
return [4 /*yield*/, electron_1.desktopCapturer.getSources({
|
|
53
|
-
types: ['screen'],
|
|
54
|
-
thumbnailSize: {
|
|
55
|
-
width: display.width,
|
|
56
|
-
height: display.height
|
|
57
|
-
}
|
|
58
|
-
})];
|
|
59
|
-
case 1:
|
|
60
|
-
sources = _a.sent();
|
|
61
|
-
// Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id 和 这儿 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
|
|
62
|
-
// 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
|
|
63
|
-
if (sources.length === 1) {
|
|
64
|
-
source = sources[0];
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
source = sources.find(function (source) {
|
|
68
|
-
return source.display_id === display.id.toString() || source.id.startsWith("screen:".concat(display.id, ":"));
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
if (!source) {
|
|
72
|
-
console.error(sources);
|
|
73
|
-
console.error(display);
|
|
74
|
-
throw new Error('没有获取到截图数据');
|
|
75
|
-
}
|
|
76
|
-
return [2 /*return*/, source.thumbnail.toDataURL()];
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}); },
|
|
80
|
-
captured: function () {
|
|
81
|
-
console.log('contextBridge captured');
|
|
82
|
-
electron_1.ipcRenderer.send('SCREENSHOTS:captured');
|
|
83
|
-
},
|
|
84
10
|
save: function (arrayBuffer, data) {
|
|
85
11
|
console.log('contextBridge save', arrayBuffer, data);
|
|
86
12
|
electron_1.ipcRenderer.send('SCREENSHOTS:save', Buffer.from(arrayBuffer), data);
|
package/lib/screenshots.d.ts
CHANGED
package/lib/screenshots.js
CHANGED
|
@@ -14,6 +14,25 @@ var __extends = (this && this.__extends) || (function () {
|
|
|
14
14
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
15
|
};
|
|
16
16
|
})();
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
17
36
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
37
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
38
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -98,11 +117,11 @@ var Screenshots = /** @class */ (function (_super) {
|
|
|
98
117
|
if (_this.$win && !_this.$win.isDestroyed()) {
|
|
99
118
|
_this.$win.close();
|
|
100
119
|
}
|
|
101
|
-
|
|
120
|
+
var boundAndDisplay = (0, getBoundAndDisplay_1.default)();
|
|
121
|
+
_this.createWindow(boundAndDisplay);
|
|
102
122
|
// 捕捉桌面之后显示窗口
|
|
103
123
|
// 避免截图窗口自己被截图
|
|
104
|
-
|
|
105
|
-
(0, logger_1.default)('SCREENSHOTS:captured');
|
|
124
|
+
_this.capture(boundAndDisplay).then(function () {
|
|
106
125
|
if (!_this.$win)
|
|
107
126
|
return;
|
|
108
127
|
// linux截图存在黑屏,这里设置为false就不会出现这个问题
|
|
@@ -136,8 +155,8 @@ var Screenshots = /** @class */ (function (_super) {
|
|
|
136
155
|
/**
|
|
137
156
|
* 初始化窗口
|
|
138
157
|
*/
|
|
139
|
-
Screenshots.prototype.createWindow = function () {
|
|
140
|
-
var
|
|
158
|
+
Screenshots.prototype.createWindow = function (_a) {
|
|
159
|
+
var bound = _a.bound;
|
|
141
160
|
this.$win = new electron_1.BrowserWindow({
|
|
142
161
|
title: 'screenshots',
|
|
143
162
|
x: bound.x,
|
|
@@ -173,8 +192,66 @@ var Screenshots = /** @class */ (function (_super) {
|
|
|
173
192
|
});
|
|
174
193
|
this.$win.setBrowserView(this.$view);
|
|
175
194
|
this.$view.setBounds(bound);
|
|
176
|
-
|
|
177
|
-
|
|
195
|
+
};
|
|
196
|
+
Screenshots.prototype.capture = function (_a) {
|
|
197
|
+
var display = _a.display;
|
|
198
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
199
|
+
var NodeScreenshots, capturer, image, err_1, sources, source;
|
|
200
|
+
return __generator(this, function (_b) {
|
|
201
|
+
switch (_b.label) {
|
|
202
|
+
case 0:
|
|
203
|
+
(0, logger_1.default)('SCREENSHOTS:capture');
|
|
204
|
+
_b.label = 1;
|
|
205
|
+
case 1:
|
|
206
|
+
_b.trys.push([1, 4, , 6]);
|
|
207
|
+
return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('node-screenshots')); })];
|
|
208
|
+
case 2:
|
|
209
|
+
NodeScreenshots = (_b.sent()).Screenshots;
|
|
210
|
+
capturer = NodeScreenshots.fromDisplay(display.id);
|
|
211
|
+
(0, logger_1.default)('SCREENSHOTS:NodeScreenshots.fromDisplay(%d) %o', display.id, capturer);
|
|
212
|
+
if (!capturer) {
|
|
213
|
+
throw new Error("NodeScreenshots.fromDisplay(".concat(display.id, ") get null"));
|
|
214
|
+
}
|
|
215
|
+
return [4 /*yield*/, capturer.capture()];
|
|
216
|
+
case 3:
|
|
217
|
+
image = _b.sent();
|
|
218
|
+
this.$view.webContents.send('SCREENSHOTS:capture', display, "data:image/png;base64,".concat(image.toString('base64')));
|
|
219
|
+
return [3 /*break*/, 6];
|
|
220
|
+
case 4:
|
|
221
|
+
err_1 = _b.sent();
|
|
222
|
+
(0, logger_1.default)('SCREENSHOTS:capturer.capture() error %o', err_1);
|
|
223
|
+
return [4 /*yield*/, electron_1.desktopCapturer.getSources({
|
|
224
|
+
types: ['screen'],
|
|
225
|
+
thumbnailSize: {
|
|
226
|
+
width: display.width,
|
|
227
|
+
height: display.height
|
|
228
|
+
}
|
|
229
|
+
})];
|
|
230
|
+
case 5:
|
|
231
|
+
sources = _b.sent();
|
|
232
|
+
source = void 0;
|
|
233
|
+
// Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id 和 这儿 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
|
|
234
|
+
// 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
|
|
235
|
+
if (sources.length === 1) {
|
|
236
|
+
source = sources[0];
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
source = sources.find(function (source) {
|
|
240
|
+
return source.display_id === display.id.toString() || source.id.startsWith("screen:".concat(display.id, ":"));
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
if (!source) {
|
|
244
|
+
console.error(sources);
|
|
245
|
+
console.error(display);
|
|
246
|
+
console.error("Can't find screen source");
|
|
247
|
+
return [2 /*return*/];
|
|
248
|
+
}
|
|
249
|
+
this.$view.webContents.send('SCREENSHOTS:capture', display, source.thumbnail.toDataURL());
|
|
250
|
+
return [3 /*break*/, 6];
|
|
251
|
+
case 6: return [2 /*return*/];
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
});
|
|
178
255
|
};
|
|
179
256
|
/**
|
|
180
257
|
* 绑定ipc时间处理
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "electron-screenshots",
|
|
3
|
-
"version": "0.2
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "electron 截图插件",
|
|
5
5
|
"types": "lib/screenshots.d.ts",
|
|
6
6
|
"main": "lib/screenshots.js",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
],
|
|
10
10
|
"scripts": {
|
|
11
11
|
"prepublishOnly": "npm run build",
|
|
12
|
-
"start": "DEBUG=screenshots electron lib/index.js",
|
|
12
|
+
"start": "cross-env DEBUG=screenshots electron lib/index.js",
|
|
13
13
|
"dev": "tsc --sourceMap --watch",
|
|
14
14
|
"build": "npm run lint && npm run clean && tsc",
|
|
15
15
|
"lint": "eslint . --ext .js,.ts --fix",
|
|
@@ -36,7 +36,8 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"debug": "^4.3.3",
|
|
39
|
-
"
|
|
39
|
+
"node-screenshots": "^0.0.2",
|
|
40
|
+
"react-screenshots": "^0.3.1"
|
|
40
41
|
},
|
|
41
42
|
"peerDependencies": {
|
|
42
43
|
"electron": ">=11"
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
"@types/debug": "^4.1.7",
|
|
46
47
|
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
|
47
48
|
"@typescript-eslint/parser": "^5.10.0",
|
|
49
|
+
"cross-env": "^7.0.3",
|
|
48
50
|
"electron": "^16.0.7",
|
|
49
51
|
"electron-debug": "^3.2.0",
|
|
50
52
|
"eslint": "^8.7.0",
|
|
@@ -55,5 +57,5 @@
|
|
|
55
57
|
"rimraf": "^3.0.2",
|
|
56
58
|
"typescript": "^4.5.5"
|
|
57
59
|
},
|
|
58
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "600c72efd111a7077640611c32f01c06443c7b8c"
|
|
59
61
|
}
|