/
githubmirror
/
edex-ui
Обзор
Документация
Войти
/
githubmirror
/
edex-ui
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v1.0.0
src/_boot.js
190 строк
6 KB
GitSquared
:twisted_rightwards_arrows: Replace mod_syslog with mod_toplist
16 сен 2018, 17:09
Не верифицирован
16 сен 2018, 17:09
7bc0f42
Код
Авторство
О чём код?
const signale = require("signale"); const {app, BrowserWindow, dialog, shell} = require("electron"); process.on("uncaughtException", e => { signale.fatal(e); dialog.showErrorBox("eEDEX-UI failed to launch", e.message || "Cannot retrieve error message."); if (tty) { tty.tty.kill(); } }); signale.start(`Starting eDEX-UI v${app.getVersion()}`); signale.info(`With Node ${process.versions.node} and Electron ${process.versions.electron}`); signale.info(`Renderer is Chrome ${process.versions.chrome}`); signale.time("Startup"); const electron = require("electron"); const ipc = electron.ipcMain; const path = require("path"); const url = require("url"); const fs = require("fs"); const clip = require("clipboardy"); const Terminal = require("./classes/terminal.class.js").Terminal; ipc.on("log", (e, type, content) => { signale[type](content); }); var win, tty; const settingsFile = path.join(electron.app.getPath("userData"), "settings.json"); const themesDir = path.join(electron.app.getPath("userData"), "themes"); const innerThemesDir = path.join(__dirname, "assets/themes"); const kblayoutsDir = path.join(electron.app.getPath("userData"), "keyboards"); const innerKblayoutsDir = path.join(__dirname, "assets/kb_layouts"); const fontsDir = path.join(electron.app.getPath("userData"), "fonts"); const innerFontsDir = path.join(__dirname, "assets/fonts"); // Fix userData folder not setup on Windows try { fs.mkdirSync(electron.app.getPath("userData")); signale.info(`Created config dir at ${electron.app.getPath("userData")}`); } catch(e) { signale.info(`Base config dir is ${electron.app.getPath("userData")}`); } // Create default settings file if (!fs.existsSync(settingsFile)) { fs.writeFileSync(settingsFile, JSON.stringify({ shell: (process.platform === "win32") ? "powershell.exe" : "bash", cwd: electron.app.getPath("userData"), keyboard: "en-US", theme: "tron" })); } // Copy default themes & keyboard layouts & fonts try { fs.mkdirSync(themesDir); } catch(e) { // Folder already exists } fs.readdirSync(innerThemesDir).forEach((e) => { fs.writeFileSync(path.join(themesDir, e), fs.readFileSync(path.join(innerThemesDir, e), {encoding:"utf-8"})); }); try { fs.mkdirSync(kblayoutsDir); } catch(e) { // Folder already exists } fs.readdirSync(innerKblayoutsDir).forEach((e) => { fs.writeFileSync(path.join(kblayoutsDir, e), fs.readFileSync(path.join(innerKblayoutsDir, e), {encoding:"utf-8"})); }); try { fs.mkdirSync(fontsDir); } catch(e) { // Folder already exists } fs.readdirSync(innerFontsDir).forEach((e) => { fs.writeFileSync(path.join(fontsDir, e), fs.readFileSync(path.join(innerFontsDir, e))); }); function createWindow(settings) { signale.info("Creating window..."); let {x, y, width, height} = electron.screen.getPrimaryDisplay().bounds; width++; height++; win = new BrowserWindow({ title: "eDEX-UI", x, y, width, height, show: false, resizable: true, movable: settings.allowWindowed || false, fullscreen: true, autoHideMenuBar: true, frame: settings.allowWindowed || false, backgroundColor: '#000000', webPreferences: { devTools: true, backgroundThrottling: false, webSecurity: true, allowRunningInsecureContent: false, experimentalFeatures: settings.experimentalFeatures || false } }); win.loadURL(url.format({ pathname: path.join(__dirname, 'ui.html'), protocol: 'file:', slashes: true })); win.once("ready-to-show", () => { signale.complete("Frontend window is up!"); win.show(); if (!settings.allowWindowed) { win.setResizable(false); } }); signale.watch("Waiting for frontend connection..."); } app.on('ready', () => { signale.pending(`Loading settings file...`); let settings = require(settingsFile); signale.success(`Settings loaded!`); signale.pending(`Creating new terminal process on port ${settings.port || '3000'}`); tty = new Terminal({ role: "server", shell: settings.shell, cwd: settings.cwd, port: settings.port || 3000 }); signale.success(`Terminal back-end initialized!`); tty.onclosed = (code, signal) => { tty.ondisconnected = () => {}; signale.complete("Terminal exited", code, signal); app.quit(); }; tty.onopened = () => { signale.success("Connected to frontend!"); signale.timeEnd("Startup"); }; tty.onresized = (cols, rows) => { signale.info("Resized TTY to ", cols, rows); }; tty.ondisconnected = () => { signale.error("Lost connection to frontend"); signale.watch("Waiting for frontend connection..."); }; // Clipboard backend access ipc.on("clipboard", (e, arg) => { switch(arg) { case "read": clip.read().then(text => { e.sender.send("clipboard-reply", text); }); break; default: throw new Error("Illegal clipboard access request"); } }); createWindow(settings); }); app.on('web-contents-created', (e, contents) => { // Prevent creating more than one window contents.on('new-window', (e, url) => { e.preventDefault(); shell.openExternal(url); }); // Prevent loading something else than the UI contents.on('will-navigate', (e, url) => { if (url !== contents.getURL()) e.preventDefault(); }); }); app.on('window-all-closed', () => { signale.info("All windows closed"); app.quit(); }); app.on('before-quit', () => { tty.tty.kill(); signale.complete("Shutting down..."); });