@lynker-desktop/electron-window-manager 0.0.4-alpha.4 → 0.0.4-alpha.40
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/common/index.d.ts +7 -1
- package/common/index.d.ts.map +1 -1
- package/esm/common/index.d.ts +7 -1
- package/esm/common/index.d.ts.map +1 -1
- package/esm/main/index.d.ts +8 -8
- package/esm/main/index.d.ts.map +1 -1
- package/esm/main/index.js +102 -56
- package/esm/main/index.js.map +1 -1
- package/esm/renderer/index.d.ts +32 -6
- package/esm/renderer/index.d.ts.map +1 -1
- package/esm/renderer/index.js +47 -28
- package/esm/renderer/index.js.map +1 -1
- package/main/index.d.ts +8 -8
- package/main/index.d.ts.map +1 -1
- package/main/index.js +102 -56
- package/main/index.js.map +1 -1
- package/package.json +2 -2
- package/renderer/index.d.ts +32 -6
- package/renderer/index.d.ts.map +1 -1
- package/renderer/index.js +48 -29
- package/renderer/index.js.map +1 -1
package/renderer/index.d.ts
CHANGED
|
@@ -1,12 +1,38 @@
|
|
|
1
1
|
/** Used in Renderer process */
|
|
2
2
|
import type { BrowserWindow } from 'electron';
|
|
3
3
|
import { ElectronWindowsManagerOptions } from '../common';
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
export interface BrowserWindowType extends BrowserWindow {
|
|
5
|
+
_name: string;
|
|
6
|
+
_extraData: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 创建窗口
|
|
10
|
+
* @param options
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
export declare const create: (options: ElectronWindowsManagerOptions) => Promise<BrowserWindowType>;
|
|
14
|
+
/**
|
|
15
|
+
* 获取当前窗口实例
|
|
16
|
+
*/
|
|
17
|
+
export declare const getCurrentWindow: () => Promise<BrowserWindowType | undefined>;
|
|
18
|
+
/**
|
|
19
|
+
* 获取窗口
|
|
20
|
+
* @param idOrName id或者名字
|
|
21
|
+
* @returns
|
|
22
|
+
*/
|
|
23
|
+
export declare const get: (idOrName: string | number) => Promise<BrowserWindowType | undefined>;
|
|
24
|
+
/**
|
|
25
|
+
* 获取所有窗口
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
28
|
+
export declare const getAll: () => Promise<Map<number, BrowserWindowType>>;
|
|
29
|
+
/**
|
|
30
|
+
* 关闭窗口
|
|
31
|
+
* @param name
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
export declare const close: (idOrName: string | number) => Promise<boolean>;
|
|
35
|
+
export declare const closeAll: () => Promise<boolean>;
|
|
10
36
|
/**
|
|
11
37
|
* 获取 preload
|
|
12
38
|
* @returns
|
package/renderer/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/renderer/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,KAAK,EAAC,aAAa,EAAc,MAAM,UAAU,CAAA;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/renderer/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,KAAK,EAAC,aAAa,EAAc,MAAM,UAAU,CAAA;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAsBD;;;;GAIG;AACH,eAAO,MAAM,MAAM,YAAmB,6BAA6B,KAAG,OAAO,CAAC,iBAAiB,CAW9F,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,8CAI5B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,GAAG,aAAoB,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAW1F,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAmBrE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,KAAK,aAAoB,MAAM,GAAG,MAAM,KAAG,OAAO,CAAC,OAAO,CAGtE,CAAA;AAED,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,OAAO,CAGhD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,QAEH,OAAO,CAAC,MAAM,GAAG,SAAS,CAc1C,CAAA"}
|
package/renderer/index.js
CHANGED
|
@@ -6,7 +6,7 @@ const getIpc = () => {
|
|
|
6
6
|
return window?.__ELECTRON_WINDOW_MANAGER__?.ipcRenderer || window?.require('electron').ipcRenderer;
|
|
7
7
|
}
|
|
8
8
|
catch (error) {
|
|
9
|
-
console.error('
|
|
9
|
+
console.error('当前非桌面端环境, 请在桌面端中调用');
|
|
10
10
|
return {};
|
|
11
11
|
}
|
|
12
12
|
};
|
|
@@ -20,40 +20,52 @@ const getRemote = () => {
|
|
|
20
20
|
return {};
|
|
21
21
|
}
|
|
22
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* 创建窗口
|
|
25
|
+
* @param options
|
|
26
|
+
* @returns
|
|
27
|
+
*/
|
|
23
28
|
const create = async (options) => {
|
|
24
29
|
const remote = getRemote();
|
|
25
30
|
const data = await eIpc.RendererIPC.invokeMain('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'create', data: options });
|
|
26
|
-
const
|
|
27
|
-
const win = allW.find(i => i.id === data.winId);
|
|
31
|
+
const win = remote.BrowserWindow.fromId(data.winId);
|
|
28
32
|
if (win) {
|
|
29
33
|
// @ts-ignore
|
|
30
|
-
win && (win['_name'] = data.winName);
|
|
34
|
+
win && (win['_name'] = `${data.winName}`);
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
win && (win['_extraData'] = `${data.winExtraData || ''}`);
|
|
31
37
|
}
|
|
32
38
|
return win;
|
|
33
39
|
};
|
|
34
|
-
|
|
40
|
+
/**
|
|
41
|
+
* 获取当前窗口实例
|
|
42
|
+
*/
|
|
43
|
+
const getCurrentWindow = async () => {
|
|
35
44
|
const remote = getRemote();
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
const win = allW.find(i => i.id === data.winId);
|
|
39
|
-
console.error(allW, data, win);
|
|
40
|
-
if (win) {
|
|
41
|
-
// @ts-ignore
|
|
42
|
-
win && (win['_name'] = data.winName);
|
|
43
|
-
}
|
|
44
|
-
return win;
|
|
45
|
+
const winId = remote.getCurrentWindow().id;
|
|
46
|
+
return get(winId);
|
|
45
47
|
};
|
|
46
|
-
|
|
48
|
+
/**
|
|
49
|
+
* 获取窗口
|
|
50
|
+
* @param idOrName id或者名字
|
|
51
|
+
* @returns
|
|
52
|
+
*/
|
|
53
|
+
const get = async (idOrName) => {
|
|
47
54
|
const remote = getRemote();
|
|
48
|
-
const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: '
|
|
49
|
-
const
|
|
50
|
-
const win = allW.find(i => i.id === data.winId);
|
|
55
|
+
const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'get', data: idOrName });
|
|
56
|
+
const win = remote.BrowserWindow.fromId(data.winId);
|
|
51
57
|
if (win) {
|
|
52
58
|
// @ts-ignore
|
|
53
|
-
win && (win['_name'] = data.winName);
|
|
59
|
+
win && (win['_name'] = `${data.winName || ''}`);
|
|
60
|
+
// @ts-ignore
|
|
61
|
+
win && (win['_extraData'] = `${data.winExtraData || ''}`);
|
|
54
62
|
}
|
|
55
63
|
return win;
|
|
56
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* 获取所有窗口
|
|
67
|
+
* @returns
|
|
68
|
+
*/
|
|
57
69
|
const getAll = async () => {
|
|
58
70
|
const remote = getRemote();
|
|
59
71
|
const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'getAll', data: undefined });
|
|
@@ -62,23 +74,30 @@ const getAll = async () => {
|
|
|
62
74
|
for (const key in data) {
|
|
63
75
|
const element = data[key];
|
|
64
76
|
const win = allW.find(i => {
|
|
65
|
-
return `${i.id}` === `${element
|
|
77
|
+
return `${i.id}` === `${element?.winId}`;
|
|
66
78
|
});
|
|
67
79
|
if (win) {
|
|
68
80
|
// @ts-ignore
|
|
69
|
-
win && (win['_name'] = element
|
|
81
|
+
win && (win['_name'] = `${element?.winName || ''}`);
|
|
82
|
+
// @ts-ignore
|
|
83
|
+
win && (win['_extraData'] = `${element?.winExtraData || ''}`);
|
|
70
84
|
wins.set(key, win);
|
|
71
85
|
}
|
|
72
86
|
}
|
|
73
87
|
return wins;
|
|
74
88
|
};
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
89
|
+
/**
|
|
90
|
+
* 关闭窗口
|
|
91
|
+
* @param name
|
|
92
|
+
* @returns
|
|
93
|
+
*/
|
|
94
|
+
const close = async (idOrName) => {
|
|
95
|
+
await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'close', data: idOrName });
|
|
96
|
+
return true;
|
|
78
97
|
};
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
return
|
|
98
|
+
const closeAll = async () => {
|
|
99
|
+
await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', { type: 'closeAll', data: undefined });
|
|
100
|
+
return true;
|
|
82
101
|
};
|
|
83
102
|
/**
|
|
84
103
|
* 获取 preload
|
|
@@ -113,10 +132,10 @@ getPreload();
|
|
|
113
132
|
// }
|
|
114
133
|
|
|
115
134
|
exports.close = close;
|
|
116
|
-
exports.
|
|
135
|
+
exports.closeAll = closeAll;
|
|
117
136
|
exports.create = create;
|
|
118
137
|
exports.get = get;
|
|
119
138
|
exports.getAll = getAll;
|
|
120
|
-
exports.
|
|
139
|
+
exports.getCurrentWindow = getCurrentWindow;
|
|
121
140
|
exports.getPreload = getPreload;
|
|
122
141
|
//# sourceMappingURL=index.js.map
|
package/renderer/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/src/renderer/index.ts"],"sourcesContent":["/** Used in Renderer process */\nimport type {BrowserWindow, IpcRenderer} from 'electron'\nimport { ElectronWindowsManagerOptions } from '../common';\nimport type RemoteType from '@electron/remote'\nimport
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/src/renderer/index.ts"],"sourcesContent":["/** Used in Renderer process */\nimport type {BrowserWindow, IpcRenderer} from 'electron'\nimport { ElectronWindowsManagerOptions } from '../common';\nimport type RemoteType from '@electron/remote'\nimport eIpc from '@lynker-desktop/electron-ipc/renderer'\n\nexport interface BrowserWindowType extends BrowserWindow {\n _name: string;\n _extraData: string;\n}\n\nconst getIpc = (): IpcRenderer => {\n try {\n // @ts-ignore\n return window?.__ELECTRON_WINDOW_MANAGER__?.ipcRenderer || window?.require('electron').ipcRenderer\n } catch (error) {\n console.error('当前非桌面端环境, 请在桌面端中调用');\n return {} as IpcRenderer;\n }\n}\n\nconst getRemote = (): typeof RemoteType => {\n try {\n // @ts-ignore\n return window?.__ELECTRON_WINDOW_MANAGER__?.remote || window?.require('@electron/remote')\n } catch (error) {\n console.error('getIpc error: ', error)\n return {} as typeof RemoteType;\n }\n}\n\n/**\n * 创建窗口\n * @param options\n * @returns\n */\nexport const create = async (options: ElectronWindowsManagerOptions): Promise<BrowserWindowType> => {\n const remote = getRemote()\n const data: {winId: number; winName: string} = await eIpc.RendererIPC.invokeMain('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'create', data: options})\n const win = remote.BrowserWindow.fromId(data.winId)! as BrowserWindowType;\n if (win) {\n // @ts-ignore\n win && (win['_name'] = `${data.winName}`);\n // @ts-ignore\n win && (win['_extraData'] = `${data.winExtraData || ''}`);\n }\n return win;\n}\n\n/**\n * 获取当前窗口实例\n */\nexport const getCurrentWindow = async () => {\n const remote = getRemote();\n const winId = remote.getCurrentWindow().id;\n return get(winId);\n}\n\n/**\n * 获取窗口\n * @param idOrName id或者名字\n * @returns\n */\nexport const get = async (idOrName: string | number): Promise<BrowserWindowType | undefined> => {\n const remote = getRemote()\n const data: {winId: number; winName: string, winExtraData: string} = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'get', data: idOrName})\n const win = remote.BrowserWindow.fromId(data.winId)! as BrowserWindowType;\n if (win) {\n // @ts-ignore\n win && (win['_name'] = `${data.winName || ''}`);\n // @ts-ignore\n win && (win['_extraData'] = `${data.winExtraData|| ''}`);\n }\n return win;\n}\n\n/**\n * 获取所有窗口\n * @returns\n */\nexport const getAll = async (): Promise<Map<number, BrowserWindowType>> => {\n const remote = getRemote()\n const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'getAll', data: undefined})\n const wins = new Map();\n const allW = remote.BrowserWindow.getAllWindows()\n for (const key in data) {\n const element = data[key];\n const win = allW.find(i => {\n return `${i.id}` === `${element?.winId}`\n })\n if (win) {\n // @ts-ignore\n win && (win['_name'] = `${element?.winName || ''}`);\n // @ts-ignore\n win && (win['_extraData'] = `${element?.winExtraData|| ''}`);\n wins.set(key, win)\n }\n }\n return wins;\n}\n\n/**\n * 关闭窗口\n * @param name\n * @returns\n */\nexport const close = async (idOrName: string | number): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'close', data: idOrName})\n return true;\n}\n\nexport const closeAll = async (): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {type: 'closeAll', data: undefined})\n return true;\n}\n\n/**\n * 获取 preload\n * @returns\n */\nexport const getPreload = (() => {\n let cachePreload: undefined | string = undefined;\n return async (): Promise<string | undefined> => {\n if (cachePreload) {\n return cachePreload;\n }\n const data: string | undefined = await getIpc().invoke(\n '__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__',\n {\n type: 'getPreload',\n data: undefined,\n }\n )\n cachePreload = data;\n return data;\n }\n})()\n\ngetPreload();\n\n// const handleOpenDevTools = (e: HTMLElement, ev: KeyboardEvent): any => {\n// const remote = getRemote()\n// const webContents = remote.getCurrentWebContents()\n// webContents.openDevTools({\n// mode: 'detach'\n// })\n// return '';\n// }\n\n// export const registerDevTools = () => {\n// document.body.removeEventListener('keydown', handleOpenDevTools)\n// document.body.addEventListener('keydown', handleOpenDevTools)\n// }\n"],"names":[],"mappings":"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"}
|