thedesk/app/main.js

349 lines
9.1 KiB
JavaScript
Raw Normal View History

2019-11-18 03:07:44 +11:00
var dirname = __dirname
var dir = 'file://' + __dirname
var base = dir + '/view/'
2018-01-28 23:22:43 +11:00
// Electronのモジュール
2019-11-18 03:07:44 +11:00
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
2019-09-22 20:55:59 +10:00
2018-01-28 23:22:43 +11:00
// アプリケーションをコントロールするモジュール
2019-11-18 03:07:44 +11:00
const app = electron.app
2018-01-28 23:22:43 +11:00
// ウィンドウを作成するモジュール
2019-11-18 03:07:44 +11:00
const BrowserWindow = electron.BrowserWindow
2018-01-28 23:22:43 +11:00
// メインウィンドウはGCされないようにグローバル宣言
2019-11-18 03:07:44 +11:00
let mainWindow
// アプリが多重起動しないようにする
2019-11-18 03:07:44 +11:00
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
2019-11-18 03:07:44 +11:00
app.quit()
} else {
2019-11-18 03:07:44 +11:00
app.on('second-instance', () => {
// 多重起動を試みた場合、既に存在するウィンドウにフォーカスを移す
// Someone tried to run a second instance, we should focus our window.
if (mainWindow) {
2019-11-18 03:07:44 +11:00
if (mainWindow.isMinimized()) mainWindow.restore()
mainWindow.focus()
}
2019-11-18 03:07:44 +11:00
})
}
2019-11-18 03:07:44 +11:00
if (process.argv.indexOf('--dev') === -1) {
var packaged = true
2019-08-02 01:02:52 +10:00
} else {
2019-11-18 03:07:44 +11:00
var packaged = false
console.log(
'||\\\\\\ \n' +
'|||| \\\\\\\\ \n' +
'|||| \\\\\\\\ \n' +
'|||| Am I a \\\\\\\\ \n' +
'|||| cat? ^ ^ \\\\\\\\\\ _____ _ ____ _ \n' +
'|||| (.-.) \\\\\\\\\\ |_ _| |__ ___| _ \\ ___ ___| | __\n' +
"|||| ___> ) ||||| | | | '_ \\ / _ \\ | | |/ _ \\/ __| |/ /\n" +
'|||| < _ _) ////// | | | | | | __/ |_| | __/__ \\ < \n' +
'|||| |_||_| ///// |_| |_| |_|\\___|____/ \\___||___/_|\\_\\ \n' +
'|||| ///// \n' +
'|||| /////\n' +
'|||| /////\n' +
'||||//////'
)
console.log('If it does not show the window, you might forget `npm run construct`.')
2019-08-02 01:02:52 +10:00
}
2019-11-18 03:07:44 +11:00
var info_path = join(app.getPath('userData'), 'window-size.json')
var max_info_path = join(app.getPath('userData'), 'max-window-size.json')
2019-11-18 03:07:44 +11:00
var lang_path = join(app.getPath('userData'), 'language')
var ha_path = join(app.getPath('userData'), 'hardwareAcceleration')
var ua_path = join(app.getPath('userData'), 'useragent')
var frame_path = join(app.getPath('userData'), 'frame')
2019-05-19 17:39:30 +10:00
try {
2019-11-18 03:07:44 +11:00
fs.readFileSync(ha_path, 'utf8')
app.disableHardwareAcceleration()
if (!packaged) console.log('disabled: Hardware Acceleration')
2019-10-26 03:16:33 +11:00
} catch {
2019-11-18 03:07:44 +11:00
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'
} // デフォルトバリュー
}
2019-05-19 17:39:30 +10:00
function isFile(file) {
2019-04-11 02:52:01 +10:00
try {
2019-11-18 03:07:44 +11:00
fs.statSync(file)
return true
2019-04-11 02:52:01 +10:00
} catch (err) {
2019-11-18 03:07:44 +11:00
if (err.code === 'ENOENT') return false
2019-03-07 14:21:27 +11:00
}
}
try {
var frameRaw = fs.readFileSync(frame_path, 'utf8')
if(frameRaw == 'false') {
var frame = false
var frameTitle = 'hidden'
} else {
var frame = true
var frameTitle = 'default'
}
} catch {
var frame = true
}
2018-01-28 23:22:43 +11:00
// 全てのウィンドウが閉じたら終了
2019-11-18 03:07:44 +11:00
app.on('window-all-closed', function() {
electron.session.defaultSession.clearCache(() => {})
app.quit()
})
2018-01-28 23:22:43 +11:00
function createWindow() {
2019-08-08 00:14:20 +10:00
if (isFile(lang_path)) {
2019-11-18 03:07:44 +11:00
var lang = fs.readFileSync(lang_path, 'utf8')
2019-04-11 02:52:01 +10:00
} else {
2019-11-18 03:07:44 +11:00
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'
2019-05-19 17:39:30 +10:00
} else {
2019-11-18 03:07:44 +11:00
lang = 'en'
2019-04-11 02:52:01 +10:00
}
2019-11-18 03:07:44 +11:00
fs.mkdir(app.getPath('userData'), function(err) {
fs.writeFileSync(lang_path, lang)
})
2019-04-11 02:52:01 +10:00
}
2019-11-18 03:07:44 +11:00
if (!packaged) console.log('your lang:' + app.getLocale())
if (!packaged) console.log('launch:' + lang)
2018-01-28 23:22:43 +11:00
// メイン画面の表示。ウィンドウの幅、高さを指定できる
2019-11-18 03:07:44 +11:00
var platform = process.platform
var bit = process.arch
if (platform == 'linux') {
2019-06-15 00:17:16 +10:00
var arg = {
webPreferences: {
2019-06-16 02:08:10 +10:00
webviewTag: true,
2019-06-15 00:17:16 +10:00
nodeIntegration: false,
contextIsolation: true,
2019-11-18 03:07:44 +11:00
preload: join(__dirname, 'js', 'platform', 'preload.js')
2019-06-15 00:17:16 +10:00
},
2019-10-26 03:16:33 +11:00
width: window_size.width,
height: window_size.height,
x: window_size.x,
y: window_size.y,
2019-11-18 03:07:44 +11:00
icon: __dirname + '/desk.png',
show: false,
frame: frame,
resizable: true
2019-11-18 03:07:44 +11:00
}
} else if (platform == 'win32') {
2019-06-15 00:17:16 +10:00
var arg = {
webPreferences: {
2019-06-16 02:08:10 +10:00
webviewTag: true,
2019-06-15 00:17:16 +10:00
nodeIntegration: false,
contextIsolation: true,
2019-11-18 03:07:44 +11:00
preload: join(__dirname, 'js', 'platform', 'preload.js')
2019-06-15 00:17:16 +10:00
},
2019-10-26 03:16:33 +11:00
width: window_size.width,
height: window_size.height,
x: window_size.x,
y: window_size.y,
simpleFullscreen: true,
show: false,
frame: frame
2019-11-18 03:07:44 +11:00
}
} else if (platform == 'darwin') {
2019-06-15 00:17:16 +10:00
var arg = {
webPreferences: {
2019-06-16 02:08:10 +10:00
webviewTag: true,
2019-06-15 00:17:16 +10:00
nodeIntegration: false,
contextIsolation: true,
2019-11-18 03:07:44 +11:00
preload: join(__dirname, 'js', 'platform', 'preload.js')
2019-06-15 00:17:16 +10:00
},
2019-10-26 03:16:33 +11:00
width: window_size.width,
height: window_size.height,
x: window_size.x,
y: window_size.y,
simpleFullscreen: true,
show: false,
titleBarStyle: frameTitle,
frame: frame,
2019-11-18 03:07:44 +11:00
}
2018-04-16 23:58:14 +10:00
}
2019-11-18 03:07:44 +11:00
mainWindow = new BrowserWindow(arg)
mainWindow.once('page-title-updated', () => {
mainWindow.show()
if (window_size.max) {
2019-11-18 03:07:44 +11:00
mainWindow.maximize()
2019-08-11 03:52:32 +10:00
}
2019-11-18 03:07:44 +11:00
})
if (!packaged) mainWindow.toggleDevTools()
electron.session.defaultSession.clearCache(() => {})
2019-05-19 17:39:30 +10:00
if (process.argv) {
if (process.argv[1]) {
2019-11-18 03:07:44 +11:00
var m = process.argv[1].match(/([a-zA-Z0-9]+)\/\?[a-zA-Z-0-9]+=(.+)/)
2019-05-19 17:39:30 +10:00
if (m) {
2019-11-18 03:07:44 +11:00
var mode = m[1]
var code = m[2]
var plus = '?mode=' + mode + '&code=' + code
2019-05-19 17:39:30 +10:00
} else {
2019-11-18 03:07:44 +11:00
var plus = ''
2018-02-18 16:43:11 +11:00
}
2019-05-19 17:39:30 +10:00
} else {
2019-11-18 03:07:44 +11:00
var plus = ''
2018-02-18 16:43:11 +11:00
}
2019-05-19 17:39:30 +10:00
} else {
2019-11-18 03:07:44 +11:00
var plus = ''
2018-02-18 16:43:11 +11:00
}
2019-11-18 03:07:44 +11:00
var ua
2019-10-26 03:16:33 +11:00
try {
2019-11-18 03:07:44 +11:00
ua = fs.readFileSync(ua_path, 'utf8')
2019-10-26 03:16:33 +11:00
} 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
2019-11-18 03:07:44 +11:00
const crypto = require('crypto')
const N = 100
2019-10-31 02:30:26 +11:00
var ua =
2019-11-18 03:07:44 +11:00
'Mastodon client: ' +
2019-10-31 02:30:26 +11:00
crypto
.randomBytes(N)
2019-11-18 03:07:44 +11:00
.toString('base64')
.substring(0, N)
2019-10-26 03:16:33 +11:00
}
2019-11-18 03:07:44 +11:00
mainWindow.loadURL(base + lang + '/index.html' + plus, { userAgent: ua })
if (!window_size.x && !window_size.y) {
mainWindow.center()
}
2018-01-28 23:22:43 +11:00
// ウィンドウが閉じられたらアプリも終了
2019-11-18 03:07:44 +11:00
mainWindow.on('closed', function() {
electron.ipcMain.removeAllListeners()
mainWindow = null
})
closeArg = false
mainWindow.on('close', function(e, arg) {
writePos(mainWindow)
2019-10-26 03:16:33 +11:00
if (!closeArg) {
2019-11-18 03:07:44 +11:00
e.preventDefault()
2019-10-26 03:16:33 +11:00
}
const promise = new Promise(function(resolve) {
2019-11-18 03:07:44 +11:00
mainWindow.webContents.send('asReadEnd', '')
2019-10-26 03:16:33 +11:00
setTimeout(function() {
2019-11-18 03:07:44 +11:00
resolve()
}, 3000)
})
2019-10-26 03:16:33 +11:00
promise.then(function(response) {
2019-11-18 03:07:44 +11:00
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()))
})
2019-11-18 03:07:44 +11:00
mainWindow.on('minimize', function() {
writePos(mainWindow)
2019-11-18 03:07:44 +11:00
mainWindow.webContents.send('asRead', '')
})
2019-05-19 17:39:30 +10:00
2019-11-18 03:07:44 +11:00
var platform = process.platform
var bit = process.arch
Menu.setApplicationMenu(
Menu.buildFromTemplate(language.template(lang, mainWindow, packaged, dir, dirname, frame))
2019-11-18 03:07:44 +11:00
)
if(!frame) {
mainWindow.setMenu(null)
}
2019-04-03 14:59:29 +11:00
//CSS
2019-11-18 03:07:44 +11:00
css.css(mainWindow)
2019-04-03 14:59:29 +11:00
//アップデータとダウンロード
2019-11-18 03:07:44 +11:00
dl.dl(mainWindow, lang_path, base, dirname)
2019-04-03 14:59:29 +11:00
//画像選択と画像処理
2019-11-18 03:07:44 +11:00
img.img(mainWindow, dir)
2019-04-03 14:59:29 +11:00
//NowPlaying
2019-11-18 03:07:44 +11:00
np.TheDeskNowPlaying(mainWindow)
2019-04-03 14:59:29 +11:00
//その他system
2019-11-18 03:07:44 +11:00
systemFunc.system(mainWindow, dir, lang, dirname)
2019-10-26 03:16:33 +11:00
setInterval(function() {
2019-11-18 03:07:44 +11:00
mouseTrack(mainWindow)
}, 1000)
2019-09-22 20:55:59 +10:00
}
2019-11-18 03:07:44 +11:00
var x = 0
var y = 0
var unchanged = 0
var locked = false
2019-09-22 20:55:59 +10:00
function mouseTrack(mainWindow) {
2019-11-18 03:07:44 +11:00
let mousePos = electron.screen.getCursorScreenPoint()
let xNow = mousePos.x
let yNow = mousePos.x
2019-09-22 20:55:59 +10:00
if (x != xNow || y != yNow) {
2019-11-18 03:07:44 +11:00
unchanged = 0
locked = false
2019-09-22 20:55:59 +10:00
} else {
2019-11-18 03:07:44 +11:00
unchanged++
2019-09-22 20:55:59 +10:00
if (unchanged > 60 && !locked) {
2019-11-18 03:07:44 +11:00
unchanged = 0
locked = true
mainWindow.webContents.send('asRead', '')
2019-09-22 20:55:59 +10:00
}
}
2019-11-18 03:07:44 +11:00
x = xNow
y = yNow
2018-01-28 23:22:43 +11:00
}
// Electronの初期化完了後に実行
2019-11-18 03:07:44 +11:00
app.on('ready', createWindow)
2019-10-26 03:16:33 +11:00
var onError = function(err, response) {
2019-11-18 03:07:44 +11:00
console.error(err, response)
}
2019-02-28 04:02:23 +11:00
2019-11-18 03:07:44 +11:00
app.setAsDefaultProtocolClient('thedesk')