function system(mainWindow, dir, lang, dirname) { const electron = require("electron"); const app = electron.app; const join = require('path').join; var Jimp = require("jimp"); const fs = require("fs"); var JSON5 = require('json5'); var ipc = electron.ipcMain; var tmp_img = join(app.getPath("userData"), "tmp.png"); var ha_path = join(app.getPath("userData"), "hardwareAcceleration"); var lang_path = join(app.getPath("userData"), "language"); const BrowserWindow = electron.BrowserWindow; const dialog = electron.dialog; const os = require('os') const language = require("../main/language.js"); ipc.on('native-notf', function (e, args) { var platform = process.platform; var bit = process.arch; if (platform == "win32") { const notifier = require('node-notifier') var tmp_imge = tmp_img; Jimp.read(args[2], function (err, lenna) { if (!err && lenna) { lenna.write(tmp_img); var tmp_imge = tmp_img; } else { var tmp_imge = ""; } notifier.notify({ appID: "top.thedesk", message: args[1], title: args[0], icon: tmp_imge, sound: false, wait: true, }, function (err, response) { console.log(err, response) }); }); } }); //プラットフォーム ipc.on('getPlatform', function (e, arg) { try { var gitHash = fs.readFileSync("git", 'utf8') } catch{ var gitHash = null } e.sender.webContents.send('platform', [process.platform, process.arch, process.version, process.versions.chrome, process.versions.electron, gitHash]); }) //言語 ipc.on('lang', function (e, arg) { console.log("set:" + arg); fs.writeFileSync(lang_path, arg); e.sender.webContents.send('langres', arg); }) //エクスポートのダイアログ ipc.on('exportSettings', function (e, args) { dialog.showSaveDialog(null, { title: 'Export', properties: ['openFile', 'createDirectory'], defaultPath: "export.thedeskconfig.json5" }, (savedFiles) => { if (!savedFiles) { return false; } e.sender.webContents.send('exportSettingsFile', savedFiles); }) }) //インポートのダイアログ ipc.on('importSettings', function (e, args) { dialog.showOpenDialog(null, { title: 'Import', properties: ['openFile'], filters: [ { name: 'TheDesk Config', extensions: ['thedeskconfig', 'thedeskconfigv2', 'json5'] }, ] }, (fileNames) => { if (!fileNames) { return false; } e.sender.webContents.send('config', JSON5.parse(fs.readFileSync(fileNames[0], 'utf8'))); }) }) //保存フォルダのダイアログ ipc.on('savefolder', function (e, args) { dialog.showOpenDialog(null, { title: 'Save folder', properties: ['openDirectory'], }, (fileNames) => { e.sender.webContents.send('savefolder', fileNames[0]); }); }) //カスタムサウンドのダイアログ ipc.on('customSound', function (e, arg) { dialog.showOpenDialog(null, { title: 'Custom sound', properties: ['openFile'], filters: [ { name: 'Audio', extensions: ['mp3', 'aac', 'wav', 'flac', 'm4a'] }, { name: 'All', extensions: ['*'] }, ] }, (fileNames) => { e.sender.webContents.send('customSoundRender', [arg, fileNames[0]]); }); }) //ハードウェアアクセラレーションの無効化 ipc.on('ha', function (e, arg) { if (arg == "true") { fs.writeFileSync(ha_path, arg); } else { fs.unlink(ha_path, function (err) { }); } app.relaunch() app.exit() }) ipc.on('quit', (e, args) => { app.quit(); }); ipc.on('about', (e, args) => { about(); }); function about() { var ver = app.getVersion() var window = new BrowserWindow({ webPreferences: { webviewTag: false, nodeIntegration: false, contextIsolation: true, preload: join(dirname, "js", "platform", "preload.js") }, width: 300, height: 500, "transparent": false, // ウィンドウの背景を透過 "frame": false, // 枠の無いウィンドウ "resizable": false }); window.loadURL(dir + '/about.html?ver=' + ver); return "true" } ipc.on('nano', function (e, x, y) { var nano_info_path = join(app.getPath("userData"), "nano-window-position.json"); var window_pos; try { window_pos = JSON.parse(fs.readFileSync(nano_info_path, 'utf8')); } catch (e) { window_pos = [0, 0]; // デフォルトバリュー } var nanowindow = new BrowserWindow({ webPreferences: { webviewTag: false, nodeIntegration: false, contextIsolation: true, preload: join(dirname, "js", "platform", "preload.js") }, width: 350, height: 200, "transparent": false, // ウィンドウの背景を透過 "frame": false, // 枠の無いウィンドウ "resizable": false }); nanowindow.loadURL(dir + '/nano.html'); nanowindow.setAlwaysOnTop(true); nanowindow.setPosition(window_pos[0], window_pos[1]); nanowindow.on('close', function () { fs.writeFileSync(nano_info_path, JSON.stringify(nanowindow.getPosition())); }); return true; }) var cbTimer1; ipc.on('startmem', (e, arg) => { event = e.sender cbTimer1 = setInterval(mems, 1000); }); function mems() { var mem = os.totalmem() - os.freemem(); if (mainWindow) { event.webContents.send('memory', [mem, os.cpus()[0].model, os.totalmem()]); } } ipc.on('endmem', (e, arg) => { if (cbTimer1) { clearInterval(cbTimer1); } }); ipc.on('export', (e, args) => { fs.writeFileSync(args[0], JSON5.stringify(args[1])); e.sender.webContents.send('exportAllComplete', ""); }); //フォント function object_array_sort(data, key, order, fn) { //デフォは降順(DESC) var num_a = -1; var num_b = 1; if (order === 'asc') { //指定があれば昇順(ASC) num_a = 1; num_b = -1; } data = data.sort(function (a, b) { var x = a[key]; var y = b[key]; if (x > y) return num_a; if (x < y) return num_b; return 0; }); //重複排除 var arrObj = {}; for (var i = 0; i < data.length; i++) { arrObj[data[i]['family']] = data[i]; } data = []; for (var key in arrObj) { data.push(arrObj[key]); } fn(data); // ソート後の配列を返す } ipc.on('fonts', (e, arg) => { const fm = require('font-manager'); var fonts = fm.getAvailableFontsSync(); object_array_sort(fonts, 'family', 'asc', function (fonts_sorted) { e.sender.webContents.send('font-list', fonts_sorted); }); }); } exports.system = system;