-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathindex.ts
More file actions
126 lines (99 loc) · 3.06 KB
/
Copy pathindex.ts
File metadata and controls
126 lines (99 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { Window, windowManager } from 'node-window-manager';
import EventEmitter from 'events';
import {exiftool, Tags} from 'exiftool-vendored';
declare module "node-window-manager" {
interface Window {
getExif(): Promise<Tags> | undefined
}
}
declare module "exiftool-vendored" {
interface Tags {
FileDescription: String | undefined
}
}
Window.prototype.getExif = function () {
return exiftool.read(this.path);
}
export class ProcessListen {
eventEmitter: EventEmitter.EventEmitter;
processArr: string[];
activeWindow?: Window;
openedProcesses: Window[];
stopLoop: boolean;
constructor(processArr: string[]) {
this.eventEmitter = new EventEmitter.EventEmitter();
this.processArr = processArr;
this.activeWindow = undefined;
this.openedProcesses = [];
this.stopLoop = false;
setTimeout(() => {
this.loop(true);
});
}
clearEvent() {
this.eventEmitter.removeAllListeners('changed')
this.stopLoop = true;
}
changed(cb: (name?: Window) => void) {
this.eventEmitter.on("changed", window => {
if (!window) return cb(undefined);
cb(window)
})
}
private async loop(started?: boolean) {
if (this.stopLoop) return;
const activeWindow = windowManager.getActiveWindow();
const processes = windowManager.getWindows();
const newOpenedProcesses = this.processArr.map(pa => {
return processes.find(p => {
return p.path.indexOf(pa, p.path.length - pa.length) != -1;
})
}).filter(pa => pa)
const closedProgramsArr = this.openedProcesses.filter(x => {
return !newOpenedProcesses.find(a => a?.path === x.path)
});
if (!started) {
closedProgramsArr.forEach(cp => {
if (cp.path === this.activeWindow?.path) {
if (newOpenedProcesses.length) {
this.eventEmitter.emit('changed', newOpenedProcesses[0]);
this.activeWindow = newOpenedProcesses[0];
} else {
this.eventEmitter.emit('changed', undefined);
this.activeWindow = undefined
}
}
})
}
if ((!this.activeWindow || this.activeWindow.processId !== activeWindow.processId) && this.processArr.find(pa => activeWindow.path.indexOf(pa, activeWindow.path.length - pa.length) != -1)) {
this.eventEmitter.emit('changed', activeWindow);
this.activeWindow = activeWindow;
} else {
if (started) {
if (newOpenedProcesses.length) {
this.eventEmitter.emit('changed', newOpenedProcesses[0]);
this.activeWindow = newOpenedProcesses[0];
} else {
this.eventEmitter.emit('changed', undefined);
}
}
this.openedProcesses = newOpenedProcesses as Window[];
}
setTimeout(() => this.loop(), 5000);
}
}
export function getWindows() {
const filteredFolder = ["Windows"];
const arr: Window[] = [];
const windowArr = windowManager.getWindows();
for (let index = 0; index < windowArr.length; index++) {
const window = windowArr[index];
if (arr.findIndex(w => w.path === window.path) + 1) continue;
const path = window.path.substring(3);
if (filteredFolder.find(f => path.startsWith(f))) continue;
if (window.getTitle() === "") continue;
if (!window.isWindow()) continue;
arr.push(window);
}
return arr;
}