295 lines
8.7 KiB
JavaScript
295 lines
8.7 KiB
JavaScript
var dirname = __dirname;
|
|
var dir = "file://" + __dirname;
|
|
var base = dir + "/view/";
|
|
// Electronのモジュール
|
|
const electron = require("electron");
|
|
const fs = require("fs");
|
|
const language = require("./main/language.js");
|
|
const css = require("./main/css.js");
|
|
const dl = require("./main/dl.js");
|
|
const img = require("./main/img.js");
|
|
const np = require("./main/np.js");
|
|
const systemFunc = require("./main/system.js");
|
|
const Menu = electron.Menu;
|
|
const join = require("path").join;
|
|
|
|
// アプリケーションをコントロールするモジュール
|
|
const app = electron.app;
|
|
// ウィンドウを作成するモジュール
|
|
const BrowserWindow = electron.BrowserWindow;
|
|
// メインウィンドウはGCされないようにグローバル宣言
|
|
let mainWindow;
|
|
|
|
// アプリが多重起動しないようにする
|
|
const gotTheLock = app.requestSingleInstanceLock();
|
|
|
|
if (!gotTheLock) {
|
|
app.quit();
|
|
} else {
|
|
app.on("second-instance", () => {
|
|
// 多重起動を試みた場合、既に存在するウィンドウにフォーカスを移す
|
|
// Someone tried to run a second instance, we should focus our window.
|
|
if (mainWindow) {
|
|
if (mainWindow.isMinimized()) mainWindow.restore();
|
|
mainWindow.focus();
|
|
}
|
|
});
|
|
}
|
|
|
|
if (process.argv.indexOf("--dev") === -1) {
|
|
var packaged = true;
|
|
} else {
|
|
var packaged = false;
|
|
console.log("||\\\\\\ \n" + "|||| \\\\\\\\ \n" + "|||| \\\\\\\\ \n" + "|||| Am I a \\\\\\\\ \n" + "|||| cat? ^ ^ \\\\\\\\\\ _____ _ ____ _ \n" + "|||| (.-.) \\\\\\\\\\ |_ _| |__ ___| _ \\ ___ ___| | __\n" + "|||| ___> ) ||||| | | | '_ \\ / _ \\ | | |/ _ \\/ __| |/ /\n" + "|||| < _ _) ////// | | | | | | __/ |_| | __/__ \\ < \n" + "|||| |_||_| ///// |_| |_| |_|\\___|____/ \\___||___/_|\\_\\ \n" + "|||| ///// \n" + "|||| /////\n" + "|||| /////\n" + "||||//////");
|
|
console.log("Welcome!");
|
|
}
|
|
var info_path = join(app.getPath("userData"), "window-size.json");
|
|
var max_info_path = join(app.getPath("userData"), "max-window-size.json");
|
|
var lang_path = join(app.getPath("userData"), "language");
|
|
var ha_path = join(app.getPath("userData"), "hardwareAcceleration");
|
|
var ua_path = join(app.getPath("userData"), "useragent");
|
|
try {
|
|
fs.readFileSync(ha_path, "utf8");
|
|
app.disableHardwareAcceleration();
|
|
if (!packaged) console.log("disabled: Hardware Acceleration");
|
|
} catch {
|
|
if (!packaged) console.log("enabled: Hardware Acceleration");
|
|
}
|
|
var window_size;
|
|
try {
|
|
window_size = JSON.parse(fs.readFileSync(info_path, "utf8"));
|
|
} catch (e) {
|
|
window_size = {
|
|
width: 1000,
|
|
height: 750
|
|
}; // デフォルトバリュー
|
|
}
|
|
var max_window_size;
|
|
try {
|
|
max_window_size = JSON.parse(fs.readFileSync(max_info_path, "utf8"));
|
|
} catch (e) {
|
|
max_window_size = {
|
|
width: "string",
|
|
height: "string",
|
|
x: "string",
|
|
y: "string"
|
|
}; // デフォルトバリュー
|
|
}
|
|
function isFile(file) {
|
|
try {
|
|
fs.statSync(file);
|
|
return true;
|
|
} catch (err) {
|
|
if (err.code === "ENOENT") return false;
|
|
}
|
|
}
|
|
// 全てのウィンドウが閉じたら終了
|
|
app.on("window-all-closed", function() {
|
|
electron.session.defaultSession.clearCache(() => {});
|
|
app.quit();
|
|
});
|
|
|
|
function createWindow() {
|
|
if (isFile(lang_path)) {
|
|
var lang = fs.readFileSync(lang_path, "utf8");
|
|
} else {
|
|
var langs = app.getLocale();
|
|
console.log(langs);
|
|
if (~langs.indexOf("ja")) {
|
|
lang = "ja";
|
|
} else if (~langs.indexOf("de")) {
|
|
lang = "de";
|
|
} else if (~langs.indexOf("cs")) {
|
|
lang = "cs";
|
|
} else if (~langs.indexOf("bg")) {
|
|
lang = "bg";
|
|
} else {
|
|
lang = "en";
|
|
}
|
|
fs.mkdir(app.getPath("userData"), function(err) {
|
|
fs.writeFileSync(lang_path, lang);
|
|
});
|
|
}
|
|
if (!packaged) console.log("your lang:" + app.getLocale());
|
|
if (!packaged) console.log("launch:" + lang);
|
|
// メイン画面の表示。ウィンドウの幅、高さを指定できる
|
|
var platform = process.platform;
|
|
var bit = process.arch;
|
|
if (platform == "linux") {
|
|
var arg = {
|
|
webPreferences: {
|
|
webviewTag: true,
|
|
nodeIntegration: false,
|
|
contextIsolation: true,
|
|
preload: join(__dirname, "js", "platform", "preload.js")
|
|
},
|
|
width: window_size.width,
|
|
height: window_size.height,
|
|
x: window_size.x,
|
|
y: window_size.y,
|
|
icon: __dirname + "/desk.png",
|
|
show: false
|
|
};
|
|
} else if (platform == "win32") {
|
|
var arg = {
|
|
webPreferences: {
|
|
webviewTag: true,
|
|
nodeIntegration: false,
|
|
contextIsolation: true,
|
|
preload: join(__dirname, "js", "platform", "preload.js")
|
|
},
|
|
width: window_size.width,
|
|
height: window_size.height,
|
|
x: window_size.x,
|
|
y: window_size.y,
|
|
simpleFullscreen: true,
|
|
show: false
|
|
};
|
|
} else if (platform == "darwin") {
|
|
var arg = {
|
|
webPreferences: {
|
|
webviewTag: true,
|
|
nodeIntegration: false,
|
|
contextIsolation: true,
|
|
preload: join(__dirname, "js", "platform", "preload.js")
|
|
},
|
|
width: window_size.width,
|
|
height: window_size.height,
|
|
x: window_size.x,
|
|
y: window_size.y,
|
|
simpleFullscreen: true,
|
|
show: false
|
|
};
|
|
}
|
|
mainWindow = new BrowserWindow(arg);
|
|
mainWindow.once("page-title-updated", () => {
|
|
mainWindow.show();
|
|
if (window_size.max) {
|
|
mainWindow.maximize();
|
|
}
|
|
});
|
|
if (!packaged) mainWindow.toggleDevTools();
|
|
electron.session.defaultSession.clearCache(() => {});
|
|
if (process.argv) {
|
|
if (process.argv[1]) {
|
|
var m = process.argv[1].match(/([a-zA-Z0-9]+)\/\?[a-zA-Z-0-9]+=(.+)/);
|
|
if (m) {
|
|
var mode = m[1];
|
|
var code = m[2];
|
|
var plus = "?mode=" + mode + "&code=" + code;
|
|
} else {
|
|
var plus = "";
|
|
}
|
|
} else {
|
|
var plus = "";
|
|
}
|
|
} else {
|
|
var plus = "";
|
|
}
|
|
var ua;
|
|
try {
|
|
ua = fs.readFileSync(ua_path, "utf8");
|
|
} catch (e) {
|
|
//default UA Example:
|
|
// Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) thedesk/18.11.3 Chrome/76.0.3809.146 Electron/6.0.12 Safari/537.36
|
|
const crypto = require("crypto");
|
|
const N = 100;
|
|
var ua = "Mastodon client: "+crypto
|
|
.randomBytes(N)
|
|
.toString("base64")
|
|
.substring(0, N);
|
|
}
|
|
mainWindow.loadURL(base + lang + "/index.html" + plus, { userAgent: ua });
|
|
if (!window_size.x && !window_size.y) {
|
|
mainWindow.center();
|
|
}
|
|
// ウィンドウが閉じられたらアプリも終了
|
|
mainWindow.on("closed", function() {
|
|
electron.ipcMain.removeAllListeners();
|
|
mainWindow = null;
|
|
});
|
|
closeArg = false;
|
|
mainWindow.on("close", function(e, arg) {
|
|
writePos(mainWindow);
|
|
if (!closeArg) {
|
|
e.preventDefault();
|
|
}
|
|
const promise = new Promise(function(resolve) {
|
|
mainWindow.webContents.send("asReadEnd", "");
|
|
setTimeout(function() {
|
|
resolve();
|
|
}, 3000);
|
|
});
|
|
promise.then(function(response) {
|
|
closeArg = true;
|
|
mainWindow.close();
|
|
});
|
|
});
|
|
electron.ipcMain.on("sendMarkersComplete", function(e, arg) {
|
|
closeArg = true;
|
|
mainWindow.close();
|
|
});
|
|
function writePos(mainWindow) {
|
|
if (max_window_size.width == mainWindow.getBounds().width && max_window_size.height == mainWindow.getBounds().height && max_window_size.x == mainWindow.getBounds().x && max_window_size.y == mainWindow.getBounds().y) {
|
|
var size = { width: mainWindow.getBounds().width, height: mainWindow.getBounds().height, x: mainWindow.getBounds().x, y: mainWindow.getBounds().y, max: true };
|
|
} else {
|
|
var size = { width: mainWindow.getBounds().width, height: mainWindow.getBounds().height, x: mainWindow.getBounds().x, y: mainWindow.getBounds().y };
|
|
}
|
|
fs.writeFileSync(info_path, JSON.stringify(size));
|
|
}
|
|
mainWindow.on("maximize", function() {
|
|
writePos(mainWindow);
|
|
fs.writeFileSync(max_info_path, JSON.stringify(mainWindow.getBounds()));
|
|
});
|
|
mainWindow.on("minimize", function() {
|
|
writePos(mainWindow);
|
|
mainWindow.webContents.send("asRead", "");
|
|
});
|
|
|
|
var platform = process.platform;
|
|
var bit = process.arch;
|
|
Menu.setApplicationMenu(Menu.buildFromTemplate(language.template(lang, mainWindow, packaged, dir, dirname)));
|
|
//CSS
|
|
css.css(mainWindow);
|
|
//アップデータとダウンロード
|
|
dl.dl(mainWindow, lang_path, base, dirname);
|
|
//画像選択と画像処理
|
|
img.img(mainWindow, dir);
|
|
//NowPlaying
|
|
np.TheDeskNowPlaying(mainWindow);
|
|
//その他system
|
|
systemFunc.system(mainWindow, dir, lang, dirname);
|
|
setInterval(function() {
|
|
mouseTrack(mainWindow);
|
|
}, 1000);
|
|
}
|
|
var x = 0;
|
|
var y = 0;
|
|
var unchanged = 0;
|
|
var locked = false;
|
|
function mouseTrack(mainWindow) {
|
|
let mousePos = electron.screen.getCursorScreenPoint();
|
|
let xNow = mousePos.x;
|
|
let yNow = mousePos.x;
|
|
if (x != xNow || y != yNow) {
|
|
unchanged = 0;
|
|
locked = false;
|
|
} else {
|
|
unchanged++;
|
|
if (unchanged > 60 && !locked) {
|
|
unchanged = 0;
|
|
locked = true;
|
|
mainWindow.webContents.send("asRead", "");
|
|
}
|
|
}
|
|
x = xNow;
|
|
y = yNow;
|
|
}
|
|
// Electronの初期化完了後に実行
|
|
app.on("ready", createWindow);
|
|
var onError = function(err, response) {
|
|
console.error(err, response);
|
|
};
|
|
|
|
app.setAsDefaultProtocolClient("thedesk");
|