@lynker-desktop/electron-window-manager 0.0.9-alpha.23 → 0.0.9-alpha.24
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/README.md +53 -2
- package/common/index.d.ts +8 -0
- package/common/index.d.ts.map +1 -1
- package/esm/common/index.d.ts +8 -0
- package/esm/common/index.d.ts.map +1 -1
- package/esm/main/index.d.ts +15 -0
- package/esm/main/index.d.ts.map +1 -1
- package/esm/main/index.js +121 -6
- package/esm/main/index.js.map +1 -1
- package/esm/renderer/index.d.ts.map +1 -1
- package/esm/renderer/index.js +3 -1
- package/esm/renderer/index.js.map +1 -1
- package/main/index.d.ts +15 -0
- package/main/index.d.ts.map +1 -1
- package/main/index.js +121 -6
- package/main/index.js.map +1 -1
- package/package.json +2 -2
- package/renderer/index.d.ts.map +1 -1
- package/renderer/index.js +3 -1
- package/renderer/index.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/renderer/index.ts"],"sourcesContent":["/**\n * Electron 窗口管理器 - 渲染进程模块\n * 提供窗口创建、管理、查询等功能\n *\n * @author Lynker Desktop Team\n * @version 1.0.0\n */\n\nimport type { BrowserView, IpcRenderer, WebContents } from 'electron'\nimport type RemoteType from '@electron/remote'\nimport eIpc from '@lynker-desktop/electron-ipc/renderer'\nimport { BVItem, BWItem, ElectronWindowsManagerOptions, PreloadWebContentsConfig } from '../common';\n\n// ==================== 工具函数 ====================\n\n/**\n * 获取 IPC 渲染器实例\n * 优先从全局变量获取,回退到 require 方式\n *\n * @returns IpcRenderer 实例或空对象\n */\nconst getIpc = (): IpcRenderer => {\n try {\n // 优先从全局变量获取(预加载脚本注入)\n const globalIpc = window?.__ELECTRON_WINDOW_MANAGER__?.ipcRenderer;\n if (globalIpc) {\n return globalIpc;\n }\n\n // 回退到 require 方式\n return window?.require('electron').ipcRenderer;\n } catch (error) {\n console.error('当前非桌面端环境, 请在桌面端中调用');\n return {} as IpcRenderer;\n }\n}\n\n/**\n * 获取 Electron Remote 模块\n * 优先从全局变量获取,回退到 require 方式\n *\n * @returns RemoteType 实例或空对象\n */\nconst getRemote = (): typeof RemoteType => {\n try {\n // 优先从全局变量获取(预加载脚本注入)\n const globalRemote = window?.__ELECTRON_WINDOW_MANAGER__?.remote;\n if (globalRemote) {\n return globalRemote;\n }\n\n // 回退到 require 方式\n return window?.require('@electron/remote');\n } catch (error) {\n console.error('获取 Remote 模块失败: ', error);\n return {} as typeof RemoteType;\n }\n}\n\n/**\n * 获取所有窗口的 BrowserView 列表\n * 遍历所有窗口并收集其 BrowserView\n *\n * @returns BrowserView 数组\n */\nconst getAllBrowserViews = (): BrowserView[] => {\n const remote = getRemote();\n const allWindows = remote.BrowserWindow.getAllWindows();\n const allBrowserViews: BrowserView[] = [];\n\n allWindows.forEach(window => {\n const views = window.getBrowserViews();\n allBrowserViews.push(...views);\n });\n\n return allBrowserViews;\n}\n\n/**\n * 通过 WebContents 查找对应的 BrowserView\n * 如果找不到已挂载的 BrowserView,则创建虚拟的 BrowserView 对象\n *\n * @param webContent - WebContents 实例\n * @returns BVItem 实例\n */\nconst getBrowserViewByWebContent = (webContent: WebContents): BVItem => {\n const allBrowserViews = getAllBrowserViews();\n const existingView = allBrowserViews.find(view => view.webContents === webContent) as BVItem;\n\n // 如果找到已挂载的 BrowserView,直接返回\n if (existingView) {\n return existingView;\n }\n\n // 如果 WebContents 存在但未挂载到窗口,创建虚拟 BrowserView\n if (webContent && !webContent.isDestroyed?.()) {\n return createVirtualBrowserView(webContent);\n }\n\n return existingView;\n}\n\n/**\n * 创建虚拟的 BrowserView 对象\n * 用于处理未挂载到窗口的 WebContents\n *\n * @param webContent - WebContents 实例\n * @returns 虚拟的 BVItem 对象\n */\nconst createVirtualBrowserView = (webContent: WebContents): BVItem => {\n const virtualView = {\n id: webContent.id,\n _id: webContent.id,\n _type: 'BV' as const,\n _name: '',\n _extraData: '',\n webContents: webContent,\n\n // 代理方法,通过 IPC 调用主进程\n getBounds: async () => {\n const result = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'borrowView_getBounds',\n data: { webContentId: webContent.id, options: {} }\n });\n return result;\n },\n\n setBounds: async (bounds: any) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'borrowView_setBounds',\n data: { webContentId: webContent.id, options: bounds }\n });\n },\n\n setAutoResize: async (autoResize: boolean) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'borrowView_setAutoResize',\n data: { webContentId: webContent.id, options: autoResize }\n });\n },\n\n setBackgroundColor: async (color: string) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'borrowView_setBackgroundColor',\n data: { webContentId: webContent.id, options: color }\n });\n },\n } as unknown as BVItem;\n\n return virtualView;\n}\n\n/**\n * 为窗口对象设置扩展属性\n *\n * @param window - 窗口对象\n * @param data - 窗口数据\n */\nconst setWindowProperties = (\n window: BWItem | BVItem,\n data: { winId: number; winName: string; winType?: string; winExtraData?: string; winInitUrl?: string }\n): void => {\n if (!window) return;\n\n window._name = data.winName || '';\n window._type = data.winType as 'BW' | 'BV' || '';\n window._extraData = data.winExtraData || '';\n window._initUrl = data.winInitUrl || '';\n}\n\n// ==================== 核心 API ====================\n\n/**\n * 创建窗口\n * 支持创建 BrowserWindow 和 BrowserView\n *\n * @param options - 窗口创建选项\n * @returns Promise<BWItem | BVItem> 创建的窗口实例\n *\n * @example\n * ```typescript\n * // 创建 BrowserWindow\n * const window = await create({\n * type: 'BW',\n * name: 'main-window',\n * url: 'https://example.com'\n * });\n *\n * // 创建 BrowserView\n * const view = await create({\n * type: 'BV',\n * name: 'sidebar-view',\n * url: 'https://example.com/sidebar'\n * });\n * ```\n */\nexport function create(options: Omit<ElectronWindowsManagerOptions, 'type'> & { type?: 'BW' }): Promise<BWItem>;\nexport function create(options: ElectronWindowsManagerOptions & { type: 'BV' }): Promise<BVItem>;\nexport function create(options: ElectronWindowsManagerOptions): Promise<BWItem | BVItem>;\n\nexport async function create(options: ElectronWindowsManagerOptions): Promise<BWItem | BVItem> {\n const remote = getRemote();\n\n // 通过 IPC 调用主进程创建窗口\n const data: { winId: number; winName: string; winType?: string; winExtraData?: string; winInitUrl?: string } =\n await eIpc.RendererIPC.invokeMain('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'create',\n data: options\n });\n\n // 尝试通过 ID 获取窗口\n let window = remote.BrowserWindow.fromId(data.winId) as BWItem | BVItem;\n\n // 如果不是 BrowserWindow,尝试获取 BrowserView\n if (!window) {\n const webContent = remote.webContents.fromId(data.winId);\n if (webContent) {\n window = getBrowserViewByWebContent(webContent);\n }\n }\n\n // 设置窗口属性\n if (window) {\n setWindowProperties(window, data);\n }\n\n return window;\n}\n\n/**\n * 获取当前窗口实例\n *\n * @returns Promise<BWItem | BVItem | undefined> 当前窗口实例\n */\nexport const getCurrentWindow = async (): Promise<BWItem | BVItem | undefined> => {\n const remote = getRemote();\n const currentWindow = remote.getCurrentWindow();\n return await get(currentWindow.id);\n}\n\n/**\n * 根据 ID 或名称获取窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @returns Promise<BWItem | BVItem | undefined> 窗口实例\n *\n * @example\n * ```typescript\n * // 通过 ID 获取\n * const window = await get(1);\n *\n * // 通过名称获取\n * const window = await get('main-window');\n * ```\n */\nexport const get = async (idOrName: string | number): Promise<BWItem | BVItem | undefined> => {\n const remote = getRemote();\n\n // 通过 IPC 获取窗口信息\n const data: { winId: number; winName: string; winType?: string; winExtraData: string; winInitUrl?: string } =\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'get',\n data: idOrName\n });\n\n // 尝试通过 ID 获取窗口\n let window = remote.BrowserWindow.fromId(data.winId) as BWItem | BVItem;\n\n // 如果不是 BrowserWindow,尝试获取 BrowserView\n if (!window) {\n const webContent = remote.webContents.fromId(data.winId);\n if (webContent) {\n window = getBrowserViewByWebContent(webContent);\n }\n }\n\n // 设置窗口属性\n if (window) {\n setWindowProperties(window, data);\n }\n\n return window;\n}\n\n/**\n * 获取所有窗口\n * 支持按类型过滤\n *\n * @param type - 窗口类型过滤 ('BW' | 'BV')\n * @returns Promise<Map<number, BWItem | BVItem>> 窗口映射表\n *\n * @example\n * ```typescript\n * // 获取所有窗口\n * const allWindows = await getAll();\n *\n * // 只获取 BrowserWindow\n * const browserWindows = await getAll('BW');\n *\n * // 只获取 BrowserView\n * const browserViews = await getAll('BV');\n * ```\n */\nexport function getAll(type: 'BW'): Promise<Map<number, BWItem>>;\nexport function getAll(type: 'BV'): Promise<Map<number, BVItem>>;\nexport function getAll(): Promise<Map<number, BWItem | BVItem>>;\n\nexport async function getAll(type?: 'BW' | 'BV'): Promise<Map<number, BWItem | BVItem>> {\n const remote = getRemote();\n\n // 通过 IPC 获取所有窗口信息\n const windowData = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'getAll',\n data: undefined\n });\n\n const allWindows = new Map<number, BWItem | BVItem>();\n const browserWindows = new Map<number, BWItem>();\n const browserViews = new Map<number, BVItem>();\n\n const allBrowserWindows = remote.BrowserWindow.getAllWindows();\n\n // 遍历窗口数据\n for (const key in windowData) {\n const element = windowData[key];\n let window: BWItem | BVItem | undefined;\n\n // 尝试在 BrowserWindow 中查找\n window = allBrowserWindows.find(win => `${win.id}` === `${element?.winId}`) as BWItem;\n\n // 如果不是 BrowserWindow,尝试获取 BrowserView\n if (!window) {\n const webContent = remote.webContents.fromId(element.winId);\n if (webContent) {\n window = getBrowserViewByWebContent(webContent);\n }\n }\n\n if (window) {\n // 设置窗口属性\n try {\n (window as any).id = Number(element?.winId);\n } catch (error) {\n // 忽略设置 ID 失败的情况\n }\n\n setWindowProperties(window, {\n winId: element.winId,\n winName: element.winName,\n winType: element.winType,\n winExtraData: element.winExtraData,\n winInitUrl: element.winInitUrl\n });\n\n const windowId = window.id || window._id;\n allWindows.set(windowId, window);\n\n // 按类型分类\n if (window._type === 'BW') {\n browserWindows.set(windowId, window as BWItem);\n } else if (window._type === 'BV') {\n browserViews.set(windowId, window as BVItem);\n }\n }\n }\n\n // 根据类型返回对应的映射表\n if (type === 'BW') {\n return browserWindows;\n }\n if (type === 'BV') {\n return browserViews;\n }\n\n return allWindows;\n}\n\n/**\n * 关闭指定窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @returns Promise<boolean> 操作是否成功\n */\nexport const close = async (idOrName: string | number): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'close',\n data: idOrName\n });\n return true;\n}\n\n/**\n * 关闭所有窗口\n *\n * @returns Promise<boolean> 操作是否成功\n */\nexport const closeAll = async (): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'closeAll',\n data: undefined\n });\n return true;\n}\n\n/**\n * 根据 WebContents ID 查找对应的窗口\n *\n * @param webContentId - WebContents ID\n * @returns Promise<BWItem | BVItem | undefined> 窗口实例\n */\nexport const getWindowForWebContentsId = async (webContentId: number): Promise<BWItem | BVItem | undefined> => {\n const winId = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'getWindowForWebContentsId',\n data: webContentId\n });\n return get(winId);\n}\n\n/**\n * 重命名窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @param newName - 新名称\n * @returns Promise<BWItem | BVItem | undefined> 重命名后的窗口实例\n */\nexport const rename = async (idOrName: string | number, newName: string): Promise<BWItem | BVItem | undefined> => {\n const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'rename',\n data: { idOrName, newName }\n });\n return get(data.winId);\n}\n\n/**\n * 重置窗口初始化URL\n *\n * @param idOrName - 窗口 ID 或名称\n * @param url - 新URL\n * @returns Promise<BWItem | BVItem | undefined> 重置后的窗口实例\n */\nexport const reInitUrl = async (idOrName: string | number, url: string): Promise<BWItem | BVItem | undefined> => {\n const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'reInitUrl',\n data: { idOrName, url }\n });\n return get(data.winId);\n}\n\n/**\n * 设置预加载 WebContents 配置\n *\n * @param preloadWebContentsConfig - 预加载配置\n */\nexport const setPreloadWebContentsConfig = async (preloadWebContentsConfig: PreloadWebContentsConfig): Promise<void> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'setPreloadWebContentsConfig',\n data: preloadWebContentsConfig\n });\n}\n\n/**\n * 获取预加载脚本路径\n * 使用缓存机制避免重复请求\n *\n * @returns Promise<string | undefined> 预加载脚本路径\n */\nexport const getPreload = (() => {\n let cachedPreload: string | undefined = undefined;\n\n return async (): Promise<string | undefined> => {\n // 如果已有缓存,直接返回\n if (cachedPreload !== undefined) {\n return cachedPreload;\n }\n\n // 通过 IPC 获取预加载脚本路径\n const data: string | undefined = await getIpc().invoke(\n '__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__',\n {\n type: 'getPreload',\n data: undefined,\n }\n );\n\n // 缓存结果\n cachedPreload = data;\n return data;\n };\n})();\n\n// 初始化时获取预加载脚本\ngetPreload();\n\n// ==================== 开发工具相关(已注释) ====================\n\n/*\n * 开发工具相关功能(已注释,可根据需要启用)\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 */\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/renderer/index.ts"],"sourcesContent":["/**\n * Electron 窗口管理器 - 渲染进程模块\n * 提供窗口创建、管理、查询等功能\n *\n * @author Lynker Desktop Team\n * @version 1.0.0\n */\n\nimport type { BrowserView, IpcRenderer, WebContents } from 'electron'\nimport type RemoteType from '@electron/remote'\nimport eIpc from '@lynker-desktop/electron-ipc/renderer'\nimport { BVItem, BWItem, ElectronWindowsManagerOptions, PreloadWebContentsConfig } from '../common';\n\n// ==================== 工具函数 ====================\n\n/**\n * 获取 IPC 渲染器实例\n * 优先从全局变量获取,回退到 require 方式\n *\n * @returns IpcRenderer 实例或空对象\n */\nconst getIpc = (): IpcRenderer => {\n try {\n // 优先从全局变量获取(预加载脚本注入)\n const globalIpc = window?.__ELECTRON_WINDOW_MANAGER__?.ipcRenderer;\n if (globalIpc) {\n return globalIpc;\n }\n\n // 回退到 require 方式\n return window?.require('electron').ipcRenderer;\n } catch (error) {\n console.error('当前非桌面端环境, 请在桌面端中调用');\n return {} as IpcRenderer;\n }\n}\n\n/**\n * 获取 Electron Remote 模块\n * 优先从全局变量获取,回退到 require 方式\n *\n * @returns RemoteType 实例或空对象\n */\nconst getRemote = (): typeof RemoteType => {\n try {\n // 优先从全局变量获取(预加载脚本注入)\n const globalRemote = window?.__ELECTRON_WINDOW_MANAGER__?.remote;\n if (globalRemote) {\n return globalRemote;\n }\n\n // 回退到 require 方式\n return window?.require('@electron/remote');\n } catch (error) {\n console.error('获取 Remote 模块失败: ', error);\n return {} as typeof RemoteType;\n }\n}\n\n/**\n * 获取所有窗口的 BrowserView 列表\n * 遍历所有窗口并收集其 BrowserView\n *\n * @returns BrowserView 数组\n */\nconst getAllBrowserViews = (): BrowserView[] => {\n const remote = getRemote();\n const allWindows = remote.BrowserWindow.getAllWindows();\n const allBrowserViews: BrowserView[] = [];\n\n allWindows.forEach(window => {\n const views = window.getBrowserViews();\n allBrowserViews.push(...views);\n });\n\n return allBrowserViews;\n}\n\n/**\n * 通过 WebContents 查找对应的 BrowserView\n * 如果找不到已挂载的 BrowserView,则创建虚拟的 BrowserView 对象\n *\n * @param webContent - WebContents 实例\n * @returns BVItem 实例\n */\nconst getBrowserViewByWebContent = (webContent: WebContents): BVItem => {\n const allBrowserViews = getAllBrowserViews();\n const existingView = allBrowserViews.find(view => view.webContents === webContent) as BVItem;\n\n // 如果找到已挂载的 BrowserView,直接返回\n if (existingView) {\n return existingView;\n }\n\n // 如果 WebContents 存在但未挂载到窗口,创建虚拟 BrowserView\n if (webContent && !webContent.isDestroyed?.()) {\n return createVirtualBrowserView(webContent);\n }\n\n return existingView;\n}\n\n/**\n * 创建虚拟的 BrowserView 对象\n * 用于处理未挂载到窗口的 WebContents\n *\n * @param webContent - WebContents 实例\n * @returns 虚拟的 BVItem 对象\n */\nconst createVirtualBrowserView = (webContent: WebContents): BVItem => {\n const virtualView = {\n id: webContent.id,\n _id: webContent.id,\n _type: 'BV' as const,\n _name: '',\n _extraData: '',\n webContents: webContent,\n\n // 代理方法,通过 IPC 调用主进程\n getBounds: async () => {\n const result = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'borrowView_getBounds',\n data: { webContentId: webContent.id, options: {} }\n });\n return result;\n },\n\n setBounds: async (bounds: any) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'borrowView_setBounds',\n data: { webContentId: webContent.id, options: bounds }\n });\n },\n\n setAutoResize: async (autoResize: boolean) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'borrowView_setAutoResize',\n data: { webContentId: webContent.id, options: autoResize }\n });\n },\n\n setBackgroundColor: async (color: string) => {\n return await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'borrowView_setBackgroundColor',\n data: { webContentId: webContent.id, options: color }\n });\n },\n } as unknown as BVItem;\n\n return virtualView;\n}\n\n/**\n * 为窗口对象设置扩展属性\n *\n * @param window - 窗口对象\n * @param data - 窗口数据\n */\nconst setWindowProperties = (\n window: BWItem | BVItem,\n data: { winId: number; winName: string; winType?: string; winExtraData?: string; winInitUrl?: string; winZIndex?: number }\n): void => {\n if (!window) return;\n\n window._name = data.winName || '';\n window._type = data.winType as 'BW' | 'BV' || '';\n window._extraData = data.winExtraData || '';\n window._initUrl = data.winInitUrl || '';\n window._zIndex = data.winZIndex || 0;\n}\n\n// ==================== 核心 API ====================\n\n/**\n * 创建窗口\n * 支持创建 BrowserWindow 和 BrowserView\n *\n * @param options - 窗口创建选项\n * @returns Promise<BWItem | BVItem> 创建的窗口实例\n *\n * @example\n * ```typescript\n * // 创建 BrowserWindow\n * const window = await create({\n * type: 'BW',\n * name: 'main-window',\n * url: 'https://example.com'\n * });\n *\n * // 创建 BrowserView\n * const view = await create({\n * type: 'BV',\n * name: 'sidebar-view',\n * url: 'https://example.com/sidebar'\n * });\n * ```\n */\nexport function create(options: Omit<ElectronWindowsManagerOptions, 'type'> & { type?: 'BW' }): Promise<BWItem>;\nexport function create(options: ElectronWindowsManagerOptions & { type: 'BV' }): Promise<BVItem>;\nexport function create(options: ElectronWindowsManagerOptions): Promise<BWItem | BVItem>;\n\nexport async function create(options: ElectronWindowsManagerOptions): Promise<BWItem | BVItem> {\n const remote = getRemote();\n\n // 通过 IPC 调用主进程创建窗口\n const data: { winId: number; winName: string; winType?: string; winExtraData?: string; winInitUrl?: string } =\n await eIpc.RendererIPC.invokeMain('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'create',\n data: options\n });\n\n // 尝试通过 ID 获取窗口\n let window = remote.BrowserWindow.fromId(data.winId) as BWItem | BVItem;\n\n // 如果不是 BrowserWindow,尝试获取 BrowserView\n if (!window) {\n const webContent = remote.webContents.fromId(data.winId);\n if (webContent) {\n window = getBrowserViewByWebContent(webContent);\n }\n }\n\n // 设置窗口属性\n if (window) {\n setWindowProperties(window, data);\n }\n\n return window;\n}\n\n/**\n * 获取当前窗口实例\n *\n * @returns Promise<BWItem | BVItem | undefined> 当前窗口实例\n */\nexport const getCurrentWindow = async (): Promise<BWItem | BVItem | undefined> => {\n const remote = getRemote();\n const currentWindow = remote.getCurrentWindow();\n return await get(currentWindow.id);\n}\n\n/**\n * 根据 ID 或名称获取窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @returns Promise<BWItem | BVItem | undefined> 窗口实例\n *\n * @example\n * ```typescript\n * // 通过 ID 获取\n * const window = await get(1);\n *\n * // 通过名称获取\n * const window = await get('main-window');\n * ```\n */\nexport const get = async (idOrName: string | number): Promise<BWItem | BVItem | undefined> => {\n const remote = getRemote();\n\n // 通过 IPC 获取窗口信息\n const data: { winId: number; winName: string; winType?: string; winExtraData: string; winInitUrl?: string } =\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'get',\n data: idOrName\n });\n\n // 尝试通过 ID 获取窗口\n let window = remote.BrowserWindow.fromId(data.winId) as BWItem | BVItem;\n\n // 如果不是 BrowserWindow,尝试获取 BrowserView\n if (!window) {\n const webContent = remote.webContents.fromId(data.winId);\n if (webContent) {\n window = getBrowserViewByWebContent(webContent);\n }\n }\n\n // 设置窗口属性\n if (window) {\n setWindowProperties(window, data);\n }\n\n return window;\n}\n\n/**\n * 获取所有窗口\n * 支持按类型过滤\n *\n * @param type - 窗口类型过滤 ('BW' | 'BV')\n * @returns Promise<Map<number, BWItem | BVItem>> 窗口映射表\n *\n * @example\n * ```typescript\n * // 获取所有窗口\n * const allWindows = await getAll();\n *\n * // 只获取 BrowserWindow\n * const browserWindows = await getAll('BW');\n *\n * // 只获取 BrowserView\n * const browserViews = await getAll('BV');\n * ```\n */\nexport function getAll(type: 'BW'): Promise<Map<number, BWItem>>;\nexport function getAll(type: 'BV'): Promise<Map<number, BVItem>>;\nexport function getAll(): Promise<Map<number, BWItem | BVItem>>;\n\nexport async function getAll(type?: 'BW' | 'BV'): Promise<Map<number, BWItem | BVItem>> {\n const remote = getRemote();\n\n // 通过 IPC 获取所有窗口信息\n const windowData = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'getAll',\n data: undefined\n });\n\n const allWindows = new Map<number, BWItem | BVItem>();\n const browserWindows = new Map<number, BWItem>();\n const browserViews = new Map<number, BVItem>();\n\n const allBrowserWindows = remote.BrowserWindow.getAllWindows();\n\n // 遍历窗口数据\n for (const key in windowData) {\n const element = windowData[key];\n let window: BWItem | BVItem | undefined;\n\n // 尝试在 BrowserWindow 中查找\n window = allBrowserWindows.find(win => `${win.id}` === `${element?.winId}`) as BWItem;\n\n // 如果不是 BrowserWindow,尝试获取 BrowserView\n if (!window) {\n const webContent = remote.webContents.fromId(element.winId);\n if (webContent) {\n window = getBrowserViewByWebContent(webContent);\n }\n }\n\n if (window) {\n // 设置窗口属性\n try {\n (window as any).id = Number(element?.winId);\n } catch (error) {\n // 忽略设置 ID 失败的情况\n }\n\n setWindowProperties(window, {\n winId: element.winId,\n winName: element.winName,\n winType: element.winType,\n winExtraData: element.winExtraData,\n winInitUrl: element.winInitUrl,\n winZIndex: element.winZIndex\n });\n\n const windowId = window.id || window._id;\n allWindows.set(windowId, window);\n\n // 按类型分类\n if (window._type === 'BW') {\n browserWindows.set(windowId, window as BWItem);\n } else if (window._type === 'BV') {\n browserViews.set(windowId, window as BVItem);\n }\n }\n }\n\n // 根据类型返回对应的映射表\n if (type === 'BW') {\n return browserWindows;\n }\n if (type === 'BV') {\n return browserViews;\n }\n\n return allWindows;\n}\n\n/**\n * 关闭指定窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @returns Promise<boolean> 操作是否成功\n */\nexport const close = async (idOrName: string | number): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'close',\n data: idOrName\n });\n return true;\n}\n\n/**\n * 关闭所有窗口\n *\n * @returns Promise<boolean> 操作是否成功\n */\nexport const closeAll = async (): Promise<boolean> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'closeAll',\n data: undefined\n });\n return true;\n}\n\n/**\n * 根据 WebContents ID 查找对应的窗口\n *\n * @param webContentId - WebContents ID\n * @returns Promise<BWItem | BVItem | undefined> 窗口实例\n */\nexport const getWindowForWebContentsId = async (webContentId: number): Promise<BWItem | BVItem | undefined> => {\n const winId = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'getWindowForWebContentsId',\n data: webContentId\n });\n return get(winId);\n}\n\n/**\n * 重命名窗口\n *\n * @param idOrName - 窗口 ID 或名称\n * @param newName - 新名称\n * @returns Promise<BWItem | BVItem | undefined> 重命名后的窗口实例\n */\nexport const rename = async (idOrName: string | number, newName: string): Promise<BWItem | BVItem | undefined> => {\n const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'rename',\n data: { idOrName, newName }\n });\n return get(data.winId);\n}\n\n/**\n * 重置窗口初始化URL\n *\n * @param idOrName - 窗口 ID 或名称\n * @param url - 新URL\n * @returns Promise<BWItem | BVItem | undefined> 重置后的窗口实例\n */\nexport const reInitUrl = async (idOrName: string | number, url: string): Promise<BWItem | BVItem | undefined> => {\n const data = await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'reInitUrl',\n data: { idOrName, url }\n });\n return get(data.winId);\n}\n\n/**\n * 设置预加载 WebContents 配置\n *\n * @param preloadWebContentsConfig - 预加载配置\n */\nexport const setPreloadWebContentsConfig = async (preloadWebContentsConfig: PreloadWebContentsConfig): Promise<void> => {\n await getIpc().invoke('__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__', {\n type: 'setPreloadWebContentsConfig',\n data: preloadWebContentsConfig\n });\n}\n\n/**\n * 获取预加载脚本路径\n * 使用缓存机制避免重复请求\n *\n * @returns Promise<string | undefined> 预加载脚本路径\n */\nexport const getPreload = (() => {\n let cachedPreload: string | undefined = undefined;\n\n return async (): Promise<string | undefined> => {\n // 如果已有缓存,直接返回\n if (cachedPreload !== undefined) {\n return cachedPreload;\n }\n\n // 通过 IPC 获取预加载脚本路径\n const data: string | undefined = await getIpc().invoke(\n '__ELECTRON_WINDOW_MANAGER_IPC_CHANNEL__',\n {\n type: 'getPreload',\n data: undefined,\n }\n );\n\n // 缓存结果\n cachedPreload = data;\n return data;\n };\n})();\n\n// 初始化时获取预加载脚本\ngetPreload();\n\n// ==================== 开发工具相关(已注释) ====================\n\n/*\n * 开发工具相关功能(已注释,可根据需要启用)\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 */\n"],"names":[],"mappings":"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"}
|
package/main/index.d.ts
CHANGED
|
@@ -82,6 +82,21 @@ export declare class WindowsManager {
|
|
|
82
82
|
private _applyBrowserViewOptions;
|
|
83
83
|
createPreloadWebContents(url: string): Promise<unknown>;
|
|
84
84
|
getWindowForWebContentsId(wcId: number): Promise<BWItem | undefined>;
|
|
85
|
+
/**
|
|
86
|
+
* 手动对BrowserView进行排序
|
|
87
|
+
* @param windowId 窗口ID或名称
|
|
88
|
+
*/
|
|
89
|
+
sortBrowserViews(windowId: string | number): void;
|
|
90
|
+
/**
|
|
91
|
+
* 防抖的排序方法
|
|
92
|
+
* @param window 目标窗口
|
|
93
|
+
*/
|
|
94
|
+
private sortBrowserViewsDebounced;
|
|
95
|
+
/**
|
|
96
|
+
* 对BrowserView进行排序
|
|
97
|
+
* @param window 目标窗口
|
|
98
|
+
*/
|
|
99
|
+
private _sortBrowserViews;
|
|
85
100
|
}
|
|
86
101
|
export declare let isInitialized: boolean;
|
|
87
102
|
export declare const initialize: (preload?: string, loadingViewUrl?: string, errorViewUrl?: string, preloadWebContentsConfig?: PreloadWebContentsConfig, webviewDomainWhiteList?: string[]) => WindowsManager;
|
package/main/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,WAAW,EAAiG,MAAM,UAAU,CAAA;AAItK,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAEzG,eAAO,MAAM,gBAAgB,wBAQzB,CAAC;AAUL,eAAO,MAAM,MAAM,QAAS,WAAW,SAEtC,CAAA;AAoBD,qBAAa,cAAc;IACzB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,wBAAwB,CAAC,EAAE,wBAAwB,CAAC;IACpD,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IAEtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAElC,gCAAgC,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEvD,8BAA8B,EAAE,MAAM,GAAG,IAAI,CAAQ;IAErD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,UAAU,EAAE,OAAO,CAAS;IAC5B,sBAAsB,EAAE,MAAM,EAAE,CAAM;IAEtC,OAAO,CAAC,WAAW,CAIX;IACR,OAAO,CAAC,UAAU,CAAkB;IACpC;;;;;;;;;;;;;;;OAeG;gBACS,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,wBAAwB,CAAC,EAAE,wBAAwB,EAAE,sBAAsB,CAAC,EAAE,MAAM,EAAE;IAiBpK;;;OAGG;IACH,2BAA2B,CAAC,wBAAwB,EAAE,wBAAwB;IAgB9E;;OAEG;YACW,iBAAiB;IA2D/B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAiDxB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/main/index.ts"],"names":[],"mappings":"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"}
|
package/main/index.js
CHANGED
|
@@ -83,6 +83,13 @@ class WindowsManager {
|
|
|
83
83
|
// 创建队列相关属性
|
|
84
84
|
this.createQueue = [];
|
|
85
85
|
this.isCreating = false;
|
|
86
|
+
/**
|
|
87
|
+
* 防抖的排序方法
|
|
88
|
+
* @param window 目标窗口
|
|
89
|
+
*/
|
|
90
|
+
this.sortBrowserViewsDebounced = lodash.debounce((window) => {
|
|
91
|
+
this._sortBrowserViews(window);
|
|
92
|
+
}, 50);
|
|
86
93
|
this.preload = preload;
|
|
87
94
|
this.windows = new Map();
|
|
88
95
|
this.loadingViewUrl = `${loadingViewUrl ?? ''}`;
|
|
@@ -269,6 +276,8 @@ class WindowsManager {
|
|
|
269
276
|
try {
|
|
270
277
|
// @ts-ignore
|
|
271
278
|
instance._id = instance.webContents.id;
|
|
279
|
+
// 设置默认zIndex层级
|
|
280
|
+
instance._zIndex = 0;
|
|
272
281
|
}
|
|
273
282
|
catch (error) {
|
|
274
283
|
log('error', '预加载 BV 设置 _id 失败', error);
|
|
@@ -325,7 +334,7 @@ class WindowsManager {
|
|
|
325
334
|
*/
|
|
326
335
|
async _createWindow(options) {
|
|
327
336
|
let window;
|
|
328
|
-
const { usePreload = true, type = 'BW', name = 'anonymous', url, loadingView = { url: undefined }, errorView = { url: undefined }, browserWindow: browserWindowOptions, openDevTools = false, preventOriginClose = false, } = options;
|
|
337
|
+
const { usePreload = true, type = 'BW', name = 'anonymous', url, loadingView = { url: undefined }, errorView = { url: undefined }, browserWindow: browserWindowOptions, openDevTools = false, preventOriginClose = false, zIndex = 0, } = options;
|
|
329
338
|
options.type = type;
|
|
330
339
|
// 优先复用预创建实例
|
|
331
340
|
let preloadWin = null;
|
|
@@ -544,6 +553,8 @@ class WindowsManager {
|
|
|
544
553
|
window._name = name;
|
|
545
554
|
window._extraData = `${options?.extraData || ''}`;
|
|
546
555
|
window._initUrl = `${options?.url || ''}`;
|
|
556
|
+
// 设置zIndex层级
|
|
557
|
+
window._zIndex = options.zIndex ?? 0;
|
|
547
558
|
log('log', 'create 5: ', window.id, window._id, window._name);
|
|
548
559
|
if (loadingView?.url) {
|
|
549
560
|
if (type === 'BW') {
|
|
@@ -749,23 +760,44 @@ class WindowsManager {
|
|
|
749
760
|
});
|
|
750
761
|
try {
|
|
751
762
|
const _addBrowserView = window.addBrowserView;
|
|
752
|
-
window.addBrowserView = (view) => {
|
|
763
|
+
window.addBrowserView = (view, notSort = false) => {
|
|
753
764
|
_addBrowserView.call(window, view);
|
|
765
|
+
if (notSort) {
|
|
766
|
+
return;
|
|
767
|
+
}
|
|
754
768
|
handleBrowserViewFocus(view);
|
|
769
|
+
// 添加BrowserView后重新排序(如果未禁用自动排序)
|
|
770
|
+
if (!options.disableAutoSort) {
|
|
771
|
+
this.sortBrowserViewsDebounced(window);
|
|
772
|
+
}
|
|
755
773
|
};
|
|
756
774
|
const _removeBrowserView = window.removeBrowserView;
|
|
757
|
-
window.removeBrowserView = (view) => {
|
|
775
|
+
window.removeBrowserView = (view, notSort = false) => {
|
|
758
776
|
_removeBrowserView.call(window, view);
|
|
777
|
+
if (notSort) {
|
|
778
|
+
return;
|
|
779
|
+
}
|
|
759
780
|
handleBrowserViewBlur(view);
|
|
781
|
+
// 移除BrowserView后重新排序(如果未禁用自动排序)
|
|
782
|
+
if (!options.disableAutoSort) {
|
|
783
|
+
this.sortBrowserViewsDebounced(window);
|
|
784
|
+
}
|
|
760
785
|
};
|
|
761
786
|
const _setBrowserView = window.setBrowserView;
|
|
762
|
-
window.setBrowserView = (view) => {
|
|
787
|
+
window.setBrowserView = (view, notSort = false) => {
|
|
763
788
|
const views = window.getBrowserViews() || [];
|
|
764
789
|
for (const view of views) {
|
|
765
790
|
handleBrowserViewBlur(view);
|
|
766
791
|
}
|
|
767
792
|
_setBrowserView.call(window, view);
|
|
793
|
+
if (notSort) {
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
768
796
|
handleBrowserViewFocus(view);
|
|
797
|
+
// 设置BrowserView后重新排序(如果未禁用自动排序)
|
|
798
|
+
if (!options.disableAutoSort) {
|
|
799
|
+
this.sortBrowserViewsDebounced(window);
|
|
800
|
+
}
|
|
769
801
|
};
|
|
770
802
|
}
|
|
771
803
|
catch (error) {
|
|
@@ -803,7 +835,7 @@ class WindowsManager {
|
|
|
803
835
|
}
|
|
804
836
|
const loadLoadingView = () => {
|
|
805
837
|
const [viewWidth, viewHeight] = window.getSize();
|
|
806
|
-
window.
|
|
838
|
+
window.addBrowserView(_loadingView);
|
|
807
839
|
_loadingView.setBounds({
|
|
808
840
|
x: 0,
|
|
809
841
|
y: 0,
|
|
@@ -843,7 +875,7 @@ class WindowsManager {
|
|
|
843
875
|
return;
|
|
844
876
|
}
|
|
845
877
|
if (_loadingView.webContents && !_loadingView.webContents.isDestroyed()) {
|
|
846
|
-
window.
|
|
878
|
+
window.addBrowserView(_loadingView);
|
|
847
879
|
}
|
|
848
880
|
else {
|
|
849
881
|
// if loadingView has been destroyed
|
|
@@ -1199,6 +1231,75 @@ class WindowsManager {
|
|
|
1199
1231
|
return win;
|
|
1200
1232
|
return undefined;
|
|
1201
1233
|
}
|
|
1234
|
+
/**
|
|
1235
|
+
* 手动对BrowserView进行排序
|
|
1236
|
+
* @param windowId 窗口ID或名称
|
|
1237
|
+
*/
|
|
1238
|
+
sortBrowserViews(windowId) {
|
|
1239
|
+
const window = this.get(windowId);
|
|
1240
|
+
if (window && window._type === 'BW') {
|
|
1241
|
+
this._sortBrowserViews(window);
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
/**
|
|
1245
|
+
* 对BrowserView进行排序
|
|
1246
|
+
* @param window 目标窗口
|
|
1247
|
+
*/
|
|
1248
|
+
_sortBrowserViews(window) {
|
|
1249
|
+
try {
|
|
1250
|
+
const views = window.getBrowserViews() || [];
|
|
1251
|
+
if (views.length <= 1)
|
|
1252
|
+
return;
|
|
1253
|
+
// 按zIndex层级排序,数值小的在前
|
|
1254
|
+
const sortedViews = views.sort((a, b) => {
|
|
1255
|
+
const zIndexA = a._zIndex ?? 0;
|
|
1256
|
+
const zIndexB = b._zIndex ?? 0;
|
|
1257
|
+
return zIndexA - zIndexB;
|
|
1258
|
+
});
|
|
1259
|
+
// 检查是否已经按正确顺序排列
|
|
1260
|
+
let needsReorder = false;
|
|
1261
|
+
for (let i = 0; i < views.length; i++) {
|
|
1262
|
+
if (views[i] !== sortedViews[i]) {
|
|
1263
|
+
needsReorder = true;
|
|
1264
|
+
break;
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
// 如果已经按正确顺序排列,则不需要重新排序
|
|
1268
|
+
if (!needsReorder)
|
|
1269
|
+
return;
|
|
1270
|
+
// 使用批量操作来减少闪烁
|
|
1271
|
+
// 临时隐藏窗口内容
|
|
1272
|
+
const wasVisible = window.isVisible();
|
|
1273
|
+
if (wasVisible) {
|
|
1274
|
+
// window.hide();
|
|
1275
|
+
}
|
|
1276
|
+
// 移除所有BrowserView
|
|
1277
|
+
views.forEach(view => {
|
|
1278
|
+
// @ts-ignore
|
|
1279
|
+
window.removeBrowserView(view, true);
|
|
1280
|
+
});
|
|
1281
|
+
// 按正确顺序重新添加
|
|
1282
|
+
sortedViews.forEach((view, index) => {
|
|
1283
|
+
if (index === 0) {
|
|
1284
|
+
// 第一个设置为当前视图
|
|
1285
|
+
// @ts-ignore
|
|
1286
|
+
window.setBrowserView(view, true);
|
|
1287
|
+
}
|
|
1288
|
+
else {
|
|
1289
|
+
// 其他视图添加到后面
|
|
1290
|
+
// @ts-ignore
|
|
1291
|
+
window.addBrowserView(view, true);
|
|
1292
|
+
}
|
|
1293
|
+
});
|
|
1294
|
+
// 恢复窗口显示
|
|
1295
|
+
if (wasVisible) {
|
|
1296
|
+
// window.show();
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
catch (error) {
|
|
1300
|
+
log('error', 'sortBrowserViews error:', error);
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1202
1303
|
}
|
|
1203
1304
|
// @ts-ignore
|
|
1204
1305
|
global['__ELECTRON_WINDOWS_MANAGER__'] = undefined;
|
|
@@ -1240,12 +1341,16 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsCon
|
|
|
1240
1341
|
log('error', 'setParentWindow error:', error);
|
|
1241
1342
|
}
|
|
1242
1343
|
}
|
|
1344
|
+
if (findWin?._type === 'BV' && opt.data.zIndex) {
|
|
1345
|
+
findWin._zIndex = opt.data.zIndex;
|
|
1346
|
+
}
|
|
1243
1347
|
return {
|
|
1244
1348
|
winId: Number(`${findWin?.id || findWin?._id || -1}`),
|
|
1245
1349
|
winName: `${findWin?._name || ''}`,
|
|
1246
1350
|
winType: `${findWin?._type || ''}`,
|
|
1247
1351
|
winExtraData: `${findWin?._extraData || ''}`,
|
|
1248
1352
|
winInitUrl: `${findWin?._initUrl || ''}`,
|
|
1353
|
+
winZIndex: `${findWin._zIndex || 0}`,
|
|
1249
1354
|
};
|
|
1250
1355
|
}
|
|
1251
1356
|
const res = await wm.create(opt.data);
|
|
@@ -1255,6 +1360,7 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsCon
|
|
|
1255
1360
|
winType: `${res?._type || ''}`,
|
|
1256
1361
|
winExtraData: `${res?._extraData || ''}`,
|
|
1257
1362
|
winInitUrl: `${res?._initUrl || ''}`,
|
|
1363
|
+
winZIndex: `${res?._zIndex || 0}`,
|
|
1258
1364
|
};
|
|
1259
1365
|
}
|
|
1260
1366
|
if (data?.type === 'get') {
|
|
@@ -1266,6 +1372,7 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsCon
|
|
|
1266
1372
|
winType: `${res?._type || ''}`,
|
|
1267
1373
|
winExtraData: `${res?._extraData || ''}`,
|
|
1268
1374
|
winInitUrl: `${res?._initUrl || ''}`,
|
|
1375
|
+
winZIndex: `${res?._zIndex || 0}`,
|
|
1269
1376
|
};
|
|
1270
1377
|
}
|
|
1271
1378
|
if (data?.type === 'getAll') {
|
|
@@ -1279,6 +1386,7 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsCon
|
|
|
1279
1386
|
winType: `${i?._type || ''}`,
|
|
1280
1387
|
winExtraData: `${i?._extraData || ''}`,
|
|
1281
1388
|
winInitUrl: `${i?._initUrl || ''}`,
|
|
1389
|
+
winZIndex: `${i?._zIndex || 0}`,
|
|
1282
1390
|
};
|
|
1283
1391
|
});
|
|
1284
1392
|
return obj;
|
|
@@ -1302,6 +1410,7 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsCon
|
|
|
1302
1410
|
winType: `${res?._type || ''}`,
|
|
1303
1411
|
winExtraData: `${res?._extraData || ''}`,
|
|
1304
1412
|
winInitUrl: `${res?._initUrl || ''}`,
|
|
1413
|
+
winZIndex: `${res?._zIndex || 0}`,
|
|
1305
1414
|
};
|
|
1306
1415
|
}
|
|
1307
1416
|
return undefined;
|
|
@@ -1316,6 +1425,7 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsCon
|
|
|
1316
1425
|
winType: `${res?._type || ''}`,
|
|
1317
1426
|
winExtraData: `${res?._extraData || ''}`,
|
|
1318
1427
|
winInitUrl: `${res?._initUrl || ''}`,
|
|
1428
|
+
winZIndex: `${res?._zIndex || 0}`,
|
|
1319
1429
|
};
|
|
1320
1430
|
}
|
|
1321
1431
|
return undefined;
|
|
@@ -1374,6 +1484,11 @@ const initialize = (preload, loadingViewUrl, errorViewUrl, preloadWebContentsCon
|
|
|
1374
1484
|
const res = await wm.createPreloadWebContents(opt.data);
|
|
1375
1485
|
return res;
|
|
1376
1486
|
}
|
|
1487
|
+
if (data?.type === 'sortBrowserViews') {
|
|
1488
|
+
const opt = data;
|
|
1489
|
+
wm.sortBrowserViews(opt.data);
|
|
1490
|
+
return true;
|
|
1491
|
+
}
|
|
1377
1492
|
return undefined;
|
|
1378
1493
|
});
|
|
1379
1494
|
return wm;
|