electron-screenshots 0.5.28 → 0.6.0
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/LICENSE +21 -0
- package/lib/demo.d.ts +1 -0
- package/lib/demo.d.ts.map +1 -0
- package/lib/demo.js +16 -15
- package/lib/demo.js.map +1 -0
- package/lib/event.d.ts +1 -0
- package/lib/event.d.ts.map +1 -0
- package/lib/event.js +6 -6
- package/lib/event.js.map +1 -0
- package/lib/getDisplay.d.ts +2 -1
- package/lib/getDisplay.d.ts.map +1 -0
- package/lib/getDisplay.js +8 -7
- package/lib/getDisplay.js.map +1 -0
- package/lib/index.cjs.d.ts +2 -0
- package/lib/index.cjs.d.ts.map +1 -0
- package/lib/index.cjs.js +2 -0
- package/lib/index.cjs.js.map +1 -0
- package/lib/index.d.ts +6 -5
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +259 -411
- package/lib/index.js.map +1 -0
- package/lib/padStart.d.ts +1 -0
- package/lib/padStart.d.ts.map +1 -0
- package/lib/padStart.js +4 -5
- package/lib/padStart.js.map +1 -0
- package/lib/preload.d.ts +2 -1
- package/lib/preload.d.ts.map +1 -0
- package/lib/preload.js +18 -30
- package/lib/preload.js.map +1 -0
- package/package.json +55 -62
package/lib/index.js
CHANGED
|
@@ -1,52 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
-
if (k2 === undefined) k2 = k;
|
|
19
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
-
}
|
|
23
|
-
Object.defineProperty(o, k2, desc);
|
|
24
|
-
}) : (function(o, m, k, k2) {
|
|
25
|
-
if (k2 === undefined) k2 = k;
|
|
26
|
-
o[k2] = m[k];
|
|
27
|
-
}));
|
|
28
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
-
}) : function(o, v) {
|
|
31
|
-
o["default"] = v;
|
|
32
|
-
});
|
|
33
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
-
var ownKeys = function(o) {
|
|
35
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
-
var ar = [];
|
|
37
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
-
return ar;
|
|
39
|
-
};
|
|
40
|
-
return ownKeys(o);
|
|
41
|
-
};
|
|
42
|
-
return function (mod) {
|
|
43
|
-
if (mod && mod.__esModule) return mod;
|
|
44
|
-
var result = {};
|
|
45
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
-
__setModuleDefault(result, mod);
|
|
47
|
-
return result;
|
|
48
|
-
};
|
|
49
|
-
})();
|
|
50
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
51
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
52
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -56,426 +8,322 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
56
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
57
9
|
});
|
|
58
10
|
};
|
|
59
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
60
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
61
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
62
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
63
|
-
function step(op) {
|
|
64
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
65
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
66
|
-
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;
|
|
67
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
68
|
-
switch (op[0]) {
|
|
69
|
-
case 0: case 1: t = op; break;
|
|
70
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
71
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
72
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
73
|
-
default:
|
|
74
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
75
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
76
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
77
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
78
|
-
if (t[2]) _.ops.pop();
|
|
79
|
-
_.trys.pop(); continue;
|
|
80
|
-
}
|
|
81
|
-
op = body.call(thisArg, _);
|
|
82
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
83
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
87
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
88
13
|
};
|
|
89
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
var _this = _super.call(this) || this;
|
|
15
|
+
const debug_1 = __importDefault(require("debug"));
|
|
16
|
+
const electron_1 = require("electron");
|
|
17
|
+
const events_1 = __importDefault(require("events"));
|
|
18
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
19
|
+
const event_js_1 = __importDefault(require("./event.js"));
|
|
20
|
+
const getDisplay_js_1 = __importDefault(require("./getDisplay.js"));
|
|
21
|
+
const padStart_js_1 = __importDefault(require("./padStart.js"));
|
|
22
|
+
class Screenshots extends events_1.default {
|
|
23
|
+
constructor(opts) {
|
|
24
|
+
super();
|
|
101
25
|
// 截图窗口对象
|
|
102
|
-
|
|
103
|
-
|
|
26
|
+
this.$win = null;
|
|
27
|
+
this.$view = new electron_1.BrowserView({
|
|
104
28
|
webPreferences: {
|
|
105
|
-
preload: require.resolve(
|
|
29
|
+
preload: require.resolve("./preload.js"),
|
|
106
30
|
nodeIntegration: false,
|
|
107
31
|
contextIsolation: true,
|
|
108
32
|
},
|
|
109
33
|
});
|
|
110
|
-
|
|
111
|
-
electron_1.ipcMain.once(
|
|
112
|
-
|
|
34
|
+
this.isReady = new Promise((resolve) => {
|
|
35
|
+
electron_1.ipcMain.once("SCREENSHOTS:ready", () => {
|
|
36
|
+
this.logger("SCREENSHOTS:ready");
|
|
113
37
|
resolve();
|
|
114
38
|
});
|
|
115
39
|
});
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
40
|
+
this.logger = (opts === null || opts === void 0 ? void 0 : opts.logger) || (0, debug_1.default)("electron-screenshots");
|
|
41
|
+
this.singleWindow = (opts === null || opts === void 0 ? void 0 : opts.singleWindow) || false;
|
|
42
|
+
this.listenIpc();
|
|
43
|
+
this.$view.webContents.loadURL(`file://${require.resolve("react-screenshots/dist/electron.html")}`);
|
|
120
44
|
if (opts === null || opts === void 0 ? void 0 : opts.lang) {
|
|
121
|
-
|
|
45
|
+
this.setLang(opts.lang);
|
|
122
46
|
}
|
|
123
|
-
return _this;
|
|
124
47
|
}
|
|
125
48
|
/**
|
|
126
49
|
* 开始截图
|
|
127
50
|
*/
|
|
128
|
-
|
|
129
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
display = (0, getDisplay_1.default)();
|
|
136
|
-
return [4 /*yield*/, Promise.all([this.capture(display), this.isReady])];
|
|
137
|
-
case 1:
|
|
138
|
-
imageUrl = (_a.sent())[0];
|
|
139
|
-
return [4 /*yield*/, this.createWindow(display)];
|
|
140
|
-
case 2:
|
|
141
|
-
_a.sent();
|
|
142
|
-
this.$view.webContents.send('SCREENSHOTS:capture', display, imageUrl);
|
|
143
|
-
return [2 /*return*/];
|
|
144
|
-
}
|
|
145
|
-
});
|
|
51
|
+
startCapture() {
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
this.logger("startCapture");
|
|
54
|
+
const display = (0, getDisplay_js_1.default)();
|
|
55
|
+
const [imageUrl] = yield Promise.all([this.capture(display), this.isReady]);
|
|
56
|
+
yield this.createWindow(display);
|
|
57
|
+
this.$view.webContents.send("SCREENSHOTS:capture", display, imageUrl);
|
|
146
58
|
});
|
|
147
|
-
}
|
|
59
|
+
}
|
|
148
60
|
/**
|
|
149
61
|
* 结束截图
|
|
150
62
|
*/
|
|
151
|
-
|
|
152
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
this.$win.hide();
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
this.$win.destroy();
|
|
174
|
-
}
|
|
175
|
-
return [2 /*return*/];
|
|
176
|
-
}
|
|
177
|
-
});
|
|
63
|
+
endCapture() {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
this.logger("endCapture");
|
|
66
|
+
yield this.reset();
|
|
67
|
+
if (!this.$win) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// 先清除 Kiosk 模式,然后取消全屏才有效
|
|
71
|
+
this.$win.setKiosk(false);
|
|
72
|
+
this.$win.blur();
|
|
73
|
+
this.$win.blurWebView();
|
|
74
|
+
this.$win.unmaximize();
|
|
75
|
+
this.$win.removeBrowserView(this.$view);
|
|
76
|
+
if (this.singleWindow) {
|
|
77
|
+
this.$win.hide();
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this.$win.destroy();
|
|
81
|
+
}
|
|
178
82
|
});
|
|
179
|
-
}
|
|
83
|
+
}
|
|
180
84
|
/**
|
|
181
85
|
* 设置语言
|
|
182
86
|
*/
|
|
183
|
-
|
|
184
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
this.logger('setLang', lang);
|
|
189
|
-
return [4 /*yield*/, this.isReady];
|
|
190
|
-
case 1:
|
|
191
|
-
_a.sent();
|
|
192
|
-
this.$view.webContents.send('SCREENSHOTS:setLang', lang);
|
|
193
|
-
return [2 /*return*/];
|
|
194
|
-
}
|
|
195
|
-
});
|
|
87
|
+
setLang(lang) {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
this.logger("setLang", lang);
|
|
90
|
+
yield this.isReady;
|
|
91
|
+
this.$view.webContents.send("SCREENSHOTS:setLang", lang);
|
|
196
92
|
});
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
electron_1.ipcMain.once('SCREENSHOTS:reset', function () { return resolve(); });
|
|
212
|
-
}),
|
|
213
|
-
])];
|
|
214
|
-
case 1:
|
|
215
|
-
// 保证 UI 有足够的时间渲染
|
|
216
|
-
_a.sent();
|
|
217
|
-
return [2 /*return*/];
|
|
218
|
-
}
|
|
219
|
-
});
|
|
93
|
+
}
|
|
94
|
+
reset() {
|
|
95
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
96
|
+
// 重置截图区域
|
|
97
|
+
this.$view.webContents.send("SCREENSHOTS:reset");
|
|
98
|
+
// 保证 UI 有足够的时间渲染
|
|
99
|
+
yield Promise.race([
|
|
100
|
+
new Promise((resolve) => {
|
|
101
|
+
setTimeout(() => resolve(), 500);
|
|
102
|
+
}),
|
|
103
|
+
new Promise((resolve) => {
|
|
104
|
+
electron_1.ipcMain.once("SCREENSHOTS:reset", () => resolve());
|
|
105
|
+
}),
|
|
106
|
+
]);
|
|
220
107
|
});
|
|
221
|
-
}
|
|
108
|
+
}
|
|
222
109
|
/**
|
|
223
110
|
* 初始化窗口
|
|
224
111
|
*/
|
|
225
|
-
|
|
226
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
227
|
-
var windowTypes;
|
|
228
|
-
var _this = this;
|
|
112
|
+
createWindow(display) {
|
|
113
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
229
114
|
var _a, _b;
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
this.$win.setBounds(display);
|
|
308
|
-
this.$view.setBounds({
|
|
309
|
-
x: 0,
|
|
310
|
-
y: 0,
|
|
311
|
-
width: display.width,
|
|
312
|
-
height: display.height,
|
|
313
|
-
});
|
|
314
|
-
this.$win.setAlwaysOnTop(true);
|
|
315
|
-
this.$win.show();
|
|
316
|
-
return [2 /*return*/];
|
|
317
|
-
}
|
|
115
|
+
// 重置截图区域
|
|
116
|
+
yield this.reset();
|
|
117
|
+
// 复用未销毁的窗口
|
|
118
|
+
if (!this.$win || ((_b = (_a = this.$win) === null || _a === void 0 ? void 0 : _a.isDestroyed) === null || _b === void 0 ? void 0 : _b.call(_a))) {
|
|
119
|
+
const windowTypes = {
|
|
120
|
+
darwin: "panel",
|
|
121
|
+
// linux 必须设置为 undefined,否则会在部分系统上不能触发focus 事件
|
|
122
|
+
// https://github.com/nashaofu/screenshots/issues/203#issuecomment-1518923486
|
|
123
|
+
linux: undefined,
|
|
124
|
+
win32: "toolbar",
|
|
125
|
+
};
|
|
126
|
+
this.$win = new electron_1.BrowserWindow({
|
|
127
|
+
title: "screenshots",
|
|
128
|
+
x: display.x,
|
|
129
|
+
y: display.y,
|
|
130
|
+
width: display.width,
|
|
131
|
+
height: display.height,
|
|
132
|
+
useContentSize: true,
|
|
133
|
+
type: windowTypes[process.platform],
|
|
134
|
+
frame: false,
|
|
135
|
+
show: false,
|
|
136
|
+
autoHideMenuBar: true,
|
|
137
|
+
transparent: true,
|
|
138
|
+
resizable: false,
|
|
139
|
+
movable: false,
|
|
140
|
+
minimizable: false,
|
|
141
|
+
maximizable: false,
|
|
142
|
+
// focusable 必须设置为 true, 否则窗口不能及时响应esc按键,输入框也不能输入
|
|
143
|
+
focusable: true,
|
|
144
|
+
skipTaskbar: true,
|
|
145
|
+
alwaysOnTop: true,
|
|
146
|
+
/**
|
|
147
|
+
* linux 下必须设置为false,否则不能全屏显示在最上层
|
|
148
|
+
* mac 下设置为false,否则可能会导致程序坞不恢复问题,且与 kiosk 模式冲突
|
|
149
|
+
*/
|
|
150
|
+
fullscreen: false,
|
|
151
|
+
// mac fullscreenable 设置为 true 会导致应用崩溃
|
|
152
|
+
fullscreenable: false,
|
|
153
|
+
kiosk: true,
|
|
154
|
+
backgroundColor: "#00000000",
|
|
155
|
+
titleBarStyle: "hidden",
|
|
156
|
+
hasShadow: false,
|
|
157
|
+
paintWhenInitiallyHidden: false,
|
|
158
|
+
// mac 特有的属性
|
|
159
|
+
roundedCorners: false,
|
|
160
|
+
enableLargerThanScreen: false,
|
|
161
|
+
acceptFirstMouse: true,
|
|
162
|
+
});
|
|
163
|
+
this.emit("windowCreated", this.$win);
|
|
164
|
+
this.$win.on("show", () => {
|
|
165
|
+
var _a, _b;
|
|
166
|
+
(_a = this.$win) === null || _a === void 0 ? void 0 : _a.focus();
|
|
167
|
+
(_b = this.$win) === null || _b === void 0 ? void 0 : _b.setKiosk(true);
|
|
168
|
+
});
|
|
169
|
+
this.$win.on("closed", () => {
|
|
170
|
+
this.emit("windowClosed", this.$win);
|
|
171
|
+
this.$win = null;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
this.$win.setBrowserView(this.$view);
|
|
175
|
+
// 适定平台
|
|
176
|
+
if (process.platform === "darwin") {
|
|
177
|
+
this.$win.setWindowButtonVisibility(false);
|
|
178
|
+
}
|
|
179
|
+
if (process.platform !== "win32") {
|
|
180
|
+
this.$win.setVisibleOnAllWorkspaces(true, {
|
|
181
|
+
visibleOnFullScreen: true,
|
|
182
|
+
skipTransformProcessType: true,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
this.$win.blur();
|
|
186
|
+
this.$win.setBounds(display);
|
|
187
|
+
this.$view.setBounds({
|
|
188
|
+
x: 0,
|
|
189
|
+
y: 0,
|
|
190
|
+
width: display.width,
|
|
191
|
+
height: display.height,
|
|
318
192
|
});
|
|
193
|
+
this.$win.setAlwaysOnTop(true);
|
|
194
|
+
this.$win.show();
|
|
319
195
|
});
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
case 2:
|
|
333
|
-
Monitor = (_a.sent()).Monitor;
|
|
334
|
-
point = {
|
|
335
|
-
x: display.x + display.width / 2,
|
|
336
|
-
y: display.y + display.height / 2,
|
|
337
|
-
};
|
|
338
|
-
if (process.platform === 'win32') {
|
|
339
|
-
point = electron_1.screen.screenToDipPoint(point);
|
|
340
|
-
}
|
|
341
|
-
monitor = Monitor.fromPoint(point.x, point.y);
|
|
342
|
-
this.logger('SCREENSHOTS:capture Monitor.fromPoint arguments %o', display);
|
|
343
|
-
this.logger('SCREENSHOTS:capture Monitor.fromPoint return %o', {
|
|
344
|
-
id: monitor === null || monitor === void 0 ? void 0 : monitor.id,
|
|
345
|
-
name: monitor === null || monitor === void 0 ? void 0 : monitor.name,
|
|
346
|
-
x: monitor === null || monitor === void 0 ? void 0 : monitor.x,
|
|
347
|
-
y: monitor === null || monitor === void 0 ? void 0 : monitor.y,
|
|
348
|
-
width: monitor === null || monitor === void 0 ? void 0 : monitor.width,
|
|
349
|
-
height: monitor === null || monitor === void 0 ? void 0 : monitor.height,
|
|
350
|
-
rotation: monitor === null || monitor === void 0 ? void 0 : monitor.rotation,
|
|
351
|
-
scaleFactor: monitor === null || monitor === void 0 ? void 0 : monitor.scaleFactor,
|
|
352
|
-
frequency: monitor === null || monitor === void 0 ? void 0 : monitor.frequency,
|
|
353
|
-
isPrimary: monitor === null || monitor === void 0 ? void 0 : monitor.isPrimary,
|
|
354
|
-
});
|
|
355
|
-
if (!monitor) {
|
|
356
|
-
throw new Error("Monitor.fromDisplay(".concat(display.id, ") get null"));
|
|
357
|
-
}
|
|
358
|
-
return [4 /*yield*/, monitor.captureImage()];
|
|
359
|
-
case 3:
|
|
360
|
-
image = _a.sent();
|
|
361
|
-
return [4 /*yield*/, image.toPng(true)];
|
|
362
|
-
case 4:
|
|
363
|
-
buffer = _a.sent();
|
|
364
|
-
return [2 /*return*/, "data:image/png;base64,".concat(buffer.toString('base64'))];
|
|
365
|
-
case 5:
|
|
366
|
-
err_1 = _a.sent();
|
|
367
|
-
this.logger('SCREENSHOTS:capture Monitor capture() error %o', err_1);
|
|
368
|
-
return [4 /*yield*/, electron_1.desktopCapturer.getSources({
|
|
369
|
-
types: ['screen'],
|
|
370
|
-
thumbnailSize: {
|
|
371
|
-
width: display.width * display.scaleFactor,
|
|
372
|
-
height: display.height * display.scaleFactor,
|
|
373
|
-
},
|
|
374
|
-
})];
|
|
375
|
-
case 6:
|
|
376
|
-
sources = _a.sent();
|
|
377
|
-
source = void 0;
|
|
378
|
-
// Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id
|
|
379
|
-
// 和这里 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
|
|
380
|
-
// 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
|
|
381
|
-
if (sources.length === 1) {
|
|
382
|
-
source = sources[0];
|
|
383
|
-
}
|
|
384
|
-
else {
|
|
385
|
-
source = sources.find(function (item) { return item.display_id === display.id.toString()
|
|
386
|
-
|| item.id.startsWith("screen:".concat(display.id, ":")); });
|
|
387
|
-
}
|
|
388
|
-
if (!source) {
|
|
389
|
-
this.logger("SCREENSHOTS:capture Can't find screen source. sources: %o, display: %o", sources, display);
|
|
390
|
-
throw new Error("Can't find screen source");
|
|
391
|
-
}
|
|
392
|
-
return [2 /*return*/, source.thumbnail.toDataURL()];
|
|
393
|
-
case 7: return [2 /*return*/];
|
|
196
|
+
}
|
|
197
|
+
capture(display) {
|
|
198
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
199
|
+
this.logger("SCREENSHOTS:capture");
|
|
200
|
+
try {
|
|
201
|
+
const { Monitor } = yield import("node-screenshots");
|
|
202
|
+
let point = {
|
|
203
|
+
x: display.x + display.width / 2,
|
|
204
|
+
y: display.y + display.height / 2,
|
|
205
|
+
};
|
|
206
|
+
if (process.platform === "win32") {
|
|
207
|
+
point = electron_1.screen.screenToDipPoint(point);
|
|
394
208
|
}
|
|
395
|
-
|
|
209
|
+
const monitor = Monitor.fromPoint(point.x, point.y);
|
|
210
|
+
this.logger("SCREENSHOTS:capture Monitor.fromPoint arguments %o", display);
|
|
211
|
+
this.logger("SCREENSHOTS:capture Monitor.fromPoint return %o", {
|
|
212
|
+
id: monitor === null || monitor === void 0 ? void 0 : monitor.id,
|
|
213
|
+
name: monitor === null || monitor === void 0 ? void 0 : monitor.name,
|
|
214
|
+
x: monitor === null || monitor === void 0 ? void 0 : monitor.x,
|
|
215
|
+
y: monitor === null || monitor === void 0 ? void 0 : monitor.y,
|
|
216
|
+
width: monitor === null || monitor === void 0 ? void 0 : monitor.width,
|
|
217
|
+
height: monitor === null || monitor === void 0 ? void 0 : monitor.height,
|
|
218
|
+
rotation: monitor === null || monitor === void 0 ? void 0 : monitor.rotation,
|
|
219
|
+
scaleFactor: monitor === null || monitor === void 0 ? void 0 : monitor.scaleFactor,
|
|
220
|
+
frequency: monitor === null || monitor === void 0 ? void 0 : monitor.frequency,
|
|
221
|
+
isPrimary: monitor === null || monitor === void 0 ? void 0 : monitor.isPrimary,
|
|
222
|
+
});
|
|
223
|
+
if (!monitor) {
|
|
224
|
+
throw new Error(`Monitor.fromDisplay(${display.id}) get null`);
|
|
225
|
+
}
|
|
226
|
+
const image = yield monitor.captureImage();
|
|
227
|
+
const buffer = yield image.toPng(true);
|
|
228
|
+
return `data:image/png;base64,${buffer.toString("base64")}`;
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
this.logger("SCREENSHOTS:capture Monitor capture() error %o", err);
|
|
232
|
+
const sources = yield electron_1.desktopCapturer.getSources({
|
|
233
|
+
types: ["screen"],
|
|
234
|
+
thumbnailSize: {
|
|
235
|
+
width: display.width * display.scaleFactor,
|
|
236
|
+
height: display.height * display.scaleFactor,
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
let source;
|
|
240
|
+
// Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id
|
|
241
|
+
// 和这里 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
|
|
242
|
+
// 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
|
|
243
|
+
if (sources.length === 1) {
|
|
244
|
+
[source] = sources;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
source = sources.find((item) => item.display_id === display.id.toString() ||
|
|
248
|
+
item.id.startsWith(`screen:${display.id}:`));
|
|
249
|
+
}
|
|
250
|
+
if (!source) {
|
|
251
|
+
this.logger("SCREENSHOTS:capture Can't find screen source. sources: %o, display: %o", sources, display);
|
|
252
|
+
throw new Error("Can't find screen source");
|
|
253
|
+
}
|
|
254
|
+
return source.thumbnail.toDataURL();
|
|
255
|
+
}
|
|
396
256
|
});
|
|
397
|
-
}
|
|
257
|
+
}
|
|
398
258
|
/**
|
|
399
259
|
* 绑定ipc时间处理
|
|
400
260
|
*/
|
|
401
|
-
|
|
402
|
-
var _this = this;
|
|
261
|
+
listenIpc() {
|
|
403
262
|
/**
|
|
404
263
|
* OK事件
|
|
405
264
|
*/
|
|
406
|
-
electron_1.ipcMain.on(
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
265
|
+
electron_1.ipcMain.on("SCREENSHOTS:ok", (e, buffer, data) => {
|
|
266
|
+
this.logger("SCREENSHOTS:ok buffer.length %d, data: %o", buffer.length, data);
|
|
267
|
+
const event = new event_js_1.default();
|
|
268
|
+
this.emit("ok", event, buffer, data);
|
|
410
269
|
if (event.defaultPrevented) {
|
|
411
270
|
return;
|
|
412
271
|
}
|
|
413
272
|
electron_1.clipboard.writeImage(electron_1.nativeImage.createFromBuffer(buffer));
|
|
414
|
-
|
|
273
|
+
this.endCapture();
|
|
415
274
|
});
|
|
416
275
|
/**
|
|
417
276
|
* CANCEL事件
|
|
418
277
|
*/
|
|
419
|
-
electron_1.ipcMain.on(
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
278
|
+
electron_1.ipcMain.on("SCREENSHOTS:cancel", () => {
|
|
279
|
+
this.logger("SCREENSHOTS:cancel");
|
|
280
|
+
const event = new event_js_1.default();
|
|
281
|
+
this.emit("cancel", event);
|
|
423
282
|
if (event.defaultPrevented) {
|
|
424
283
|
return;
|
|
425
284
|
}
|
|
426
|
-
|
|
285
|
+
this.endCapture();
|
|
427
286
|
});
|
|
428
287
|
/**
|
|
429
288
|
* SAVE事件
|
|
430
289
|
*/
|
|
431
|
-
electron_1.ipcMain.on(
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
filters: [
|
|
454
|
-
{ name: 'Image (png)', extensions: ['png'] },
|
|
455
|
-
{ name: 'All Files', extensions: ['*'] },
|
|
456
|
-
],
|
|
457
|
-
})];
|
|
458
|
-
case 1:
|
|
459
|
-
_a = _b.sent(), canceled = _a.canceled, filePath = _a.filePath;
|
|
460
|
-
if (!this.$win) {
|
|
461
|
-
this.emit('afterSave', new event_1.default(), buffer, data, false); // isSaved = false
|
|
462
|
-
return [2 /*return*/];
|
|
463
|
-
}
|
|
464
|
-
this.$win.setAlwaysOnTop(true);
|
|
465
|
-
if (canceled || !filePath) {
|
|
466
|
-
this.emit('afterSave', new event_1.default(), buffer, data, false); // isSaved = false
|
|
467
|
-
return [2 /*return*/];
|
|
468
|
-
}
|
|
469
|
-
return [4 /*yield*/, fs_extra_1.default.writeFile(filePath, buffer)];
|
|
470
|
-
case 2:
|
|
471
|
-
_b.sent();
|
|
472
|
-
this.emit('afterSave', new event_1.default(), buffer, data, true); // isSaved = true
|
|
473
|
-
this.endCapture();
|
|
474
|
-
return [2 /*return*/];
|
|
475
|
-
}
|
|
290
|
+
electron_1.ipcMain.on("SCREENSHOTS:save", (e, buffer, data) => __awaiter(this, void 0, void 0, function* () {
|
|
291
|
+
this.logger("SCREENSHOTS:save buffer.length %d, data: %o", buffer.length, data);
|
|
292
|
+
const event = new event_js_1.default();
|
|
293
|
+
this.emit("save", event, buffer, data);
|
|
294
|
+
if (event.defaultPrevented || !this.$win) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const time = new Date();
|
|
298
|
+
const year = time.getFullYear();
|
|
299
|
+
const month = (0, padStart_js_1.default)(time.getMonth() + 1, 2, "0");
|
|
300
|
+
const date = (0, padStart_js_1.default)(time.getDate(), 2, "0");
|
|
301
|
+
const hours = (0, padStart_js_1.default)(time.getHours(), 2, "0");
|
|
302
|
+
const minutes = (0, padStart_js_1.default)(time.getMinutes(), 2, "0");
|
|
303
|
+
const seconds = (0, padStart_js_1.default)(time.getSeconds(), 2, "0");
|
|
304
|
+
const milliseconds = (0, padStart_js_1.default)(time.getMilliseconds(), 3, "0");
|
|
305
|
+
this.$win.setAlwaysOnTop(false);
|
|
306
|
+
const { canceled, filePath } = yield electron_1.dialog.showSaveDialog(this.$win, {
|
|
307
|
+
defaultPath: `${year}${month}${date}${hours}${minutes}${seconds}${milliseconds}.png`,
|
|
308
|
+
filters: [
|
|
309
|
+
{ name: "Image (png)", extensions: ["png"] },
|
|
310
|
+
{ name: "All Files", extensions: ["*"] },
|
|
311
|
+
],
|
|
476
312
|
});
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
}
|
|
313
|
+
if (!this.$win) {
|
|
314
|
+
this.emit("afterSave", new event_js_1.default(), buffer, data, false); // isSaved = false
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
this.$win.setAlwaysOnTop(true);
|
|
318
|
+
if (canceled || !filePath) {
|
|
319
|
+
this.emit("afterSave", new event_js_1.default(), buffer, data, false); // isSaved = false
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
yield fs_extra_1.default.writeFile(filePath, buffer);
|
|
323
|
+
this.emit("afterSave", new event_js_1.default(), buffer, data, true); // isSaved = true
|
|
324
|
+
this.endCapture();
|
|
325
|
+
}));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
481
328
|
exports.default = Screenshots;
|
|
329
|
+
//# sourceMappingURL=index.js.map
|