UNPKG

@theia/core

Version:

Theia is a cloud & desktop IDE framework implemented in TypeScript.

191 lines • 7.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.preload = void 0; const disposable_1 = require("../common/disposable"); const electron_api_1 = require("../electron-common/electron-api"); // eslint-disable-next-line import/no-extraneous-dependencies const { ipcRenderer, contextBridge } = require('electron'); // a map of menuId => map<handler id => handler> const commandHandlers = new Map(); let nextHandlerId = 0; const mainMenuId = 0; let nextMenuId = mainMenuId + 1; function convertMenu(menu, handlerMap) { if (!menu) { return undefined; } return menu.map(item => { let handlerId = undefined; if (item.execute) { handlerId = nextHandlerId++; handlerMap.set(handlerId, item.execute); } return { id: item.id, submenu: convertMenu(item.submenu, handlerMap), accelerator: item.accelerator, label: item.label, handlerId: handlerId, checked: item.checked, enabled: item.enabled, role: item.role, type: item.type, visible: item.visible }; }); } const api = { setMenuBarVisible: (visible, windowName) => ipcRenderer.send(electron_api_1.CHANNEL_SET_MENU_BAR_VISIBLE, visible, windowName), setMenu: (menu) => { commandHandlers.delete(mainMenuId); const handlers = new Map(); commandHandlers.set(mainMenuId, handlers); ipcRenderer.send(electron_api_1.CHANNEL_SET_MENU, mainMenuId, convertMenu(menu, handlers)); }, getSecurityToken: () => ipcRenderer.sendSync(electron_api_1.CHANNEL_GET_SECURITY_TOKEN), focusWindow: (name) => ipcRenderer.send(electron_api_1.CHANNEL_FOCUS_WINDOW, name), showItemInFolder: fsPath => { ipcRenderer.send(electron_api_1.CHANNEL_SHOW_ITEM_IN_FOLDER, fsPath); }, attachSecurityToken: (endpoint) => ipcRenderer.invoke(electron_api_1.CHANNEL_ATTACH_SECURITY_TOKEN, endpoint), popup: async function (menu, x, y, onClosed) { const menuId = nextMenuId++; const handlers = new Map(); commandHandlers.set(menuId, handlers); const handle = await ipcRenderer.invoke(electron_api_1.CHANNEL_OPEN_POPUP, menuId, convertMenu(menu, handlers), x, y); const closeListener = () => { ipcRenderer.removeListener(electron_api_1.CHANNEL_ON_CLOSE_POPUP, closeListener); commandHandlers.delete(menuId); onClosed(); }; ipcRenderer.on(electron_api_1.CHANNEL_ON_CLOSE_POPUP, closeListener); return handle; }, closePopup: function (handle) { ipcRenderer.send(electron_api_1.CHANNEL_CLOSE_POPUP, handle); }, getTitleBarStyleAtStartup: function () { return ipcRenderer.invoke(electron_api_1.CHANNEL_GET_TITLE_STYLE_AT_STARTUP); }, setTitleBarStyle: function (style) { ipcRenderer.send(electron_api_1.CHANNEL_SET_TITLE_STYLE, style); }, setBackgroundColor: function (backgroundColor) { ipcRenderer.send(electron_api_1.CHANNEL_SET_BACKGROUND_COLOR, backgroundColor); }, minimize: function () { ipcRenderer.send(electron_api_1.CHANNEL_MINIMIZE); }, isMaximized: function () { return ipcRenderer.sendSync(electron_api_1.CHANNEL_IS_MAXIMIZED); }, maximize: function () { ipcRenderer.send(electron_api_1.CHANNEL_MAXIMIZE); }, unMaximize: function () { ipcRenderer.send(electron_api_1.CHANNEL_UNMAXIMIZE); }, close: function () { ipcRenderer.send(electron_api_1.CHANNEL_CLOSE); }, onWindowEvent: function (event, handler) { const h = (_event, evt) => { if (event === evt) { handler(); } }; ipcRenderer.on(electron_api_1.CHANNEL_ON_WINDOW_EVENT, h); return disposable_1.Disposable.create(() => ipcRenderer.off(electron_api_1.CHANNEL_ON_WINDOW_EVENT, h)); }, setCloseRequestHandler: function (handler) { ipcRenderer.on(electron_api_1.CHANNEL_REQUEST_CLOSE, async (event, stopReason, confirmChannel, cancelChannel) => { try { if (await handler(stopReason)) { event.sender.send(confirmChannel); return; } ; } catch (e) { console.warn('exception in close handler ', e); } event.sender.send(cancelChannel); }); }, setSecondaryWindowCloseRequestHandler(windowName, handler) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const listener = async (event, name, confirmChannel, cancelChannel) => { if (name === windowName) { try { if (await handler()) { event.sender.send(confirmChannel); ipcRenderer.removeListener(electron_api_1.CHANNEL_REQUEST_SECONDARY_CLOSE, listener); return; } ; } catch (e) { console.warn('exception in close handler ', e); } event.sender.send(cancelChannel); } }; ipcRenderer.on(electron_api_1.CHANNEL_REQUEST_SECONDARY_CLOSE, listener); }, toggleDevTools: function () { ipcRenderer.send(electron_api_1.CHANNEL_TOGGLE_DEVTOOLS); }, getZoomLevel: function () { return ipcRenderer.invoke(electron_api_1.CHANNEL_GET_ZOOM_LEVEL); }, setZoomLevel: function (desired) { ipcRenderer.send(electron_api_1.CHANNEL_SET_ZOOM_LEVEL, desired); }, isFullScreenable: function () { return ipcRenderer.sendSync(electron_api_1.CHANNEL_IS_FULL_SCREENABLE); }, isFullScreen: function () { return ipcRenderer.sendSync(electron_api_1.CHANNEL_IS_FULL_SCREEN); }, toggleFullScreen: function () { ipcRenderer.send(electron_api_1.CHANNEL_TOGGLE_FULL_SCREEN); }, requestReload: () => ipcRenderer.send(electron_api_1.CHANNEL_REQUEST_RELOAD), restart: () => ipcRenderer.send(electron_api_1.CHANNEL_RESTART), applicationStateChanged: state => { ipcRenderer.send(electron_api_1.CHANNEL_APP_STATE_CHANGED, state); }, readClipboard() { return ipcRenderer.sendSync(electron_api_1.CHANNEL_READ_CLIPBOARD); }, writeClipboard(text) { ipcRenderer.send(electron_api_1.CHANNEL_WRITE_CLIPBOARD, text); }, onKeyboardLayoutChanged(handler) { return createDisposableListener(electron_api_1.CHANNEL_KEYBOARD_LAYOUT_CHANGED, (event, layout) => { handler(layout); }); }, onData: handler => createDisposableListener(electron_api_1.CHANNEL_IPC_CONNECTION, (event, data) => { handler(data); }), sendData: data => { ipcRenderer.send(electron_api_1.CHANNEL_IPC_CONNECTION, data); }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any function createDisposableListener(channel, handler) { ipcRenderer.on(channel, handler); return disposable_1.Disposable.create(() => ipcRenderer.off(channel, handler)); } function preload() { console.log('exposing theia core electron api'); ipcRenderer.on(electron_api_1.CHANNEL_INVOKE_MENU, (_, menuId, handlerId) => { const map = commandHandlers.get(menuId); if (map) { const handler = map.get(handlerId); if (handler) { handler(); } } }); contextBridge.exposeInMainWorld('electronTheiaCore', api); } exports.preload = preload; //# sourceMappingURL=preload.js.map