1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 17:56:25 +00:00

change IPC module(Raw buffer -> Socket) & set window behaviour for Windows

This commit is contained in:
Dick Choi
2015-12-15 13:43:28 +09:00
parent 2499a05473
commit a872ad9d8b
8 changed files with 179 additions and 94 deletions

View File

@@ -2,29 +2,32 @@ const electron = require('electron')
const BrowserWindow = electron.BrowserWindow const BrowserWindow = electron.BrowserWindow
const path = require('path') const path = require('path')
var finderWindow = new BrowserWindow({ var config = {
width: 640, width: 640,
height: 400, height: 400,
show: false, show: false,
frame: false, frame: false,
resizable: false, resizable: false,
'zoom-factor': 1.0, 'zoom-factor': 1.0,
'always-on-top': true,
'web-preferences': { 'web-preferences': {
'overlay-scrollbars': true, 'overlay-scrollbars': true,
'skip-taskbar': true 'skip-taskbar': true
}, },
'standard-window': false 'standard-window': false
}) }
if (process.platform === 'darwin') {
config['always-on-top'] = true
}
var finderWindow = new BrowserWindow(config)
var url = path.resolve(__dirname, '../browser/finder/index.html') var url = path.resolve(__dirname, '../browser/finder/index.html')
finderWindow.loadURL('file://' + url) finderWindow.loadURL('file://' + url)
finderWindow.on('blur', function () { if (process.platform === 'darwin') {
finderWindow.hide() finderWindow.setVisibleOnAllWorkspaces(true)
}) }
finderWindow.setVisibleOnAllWorkspaces(true)
module.exports = finderWindow module.exports = finderWindow

View File

@@ -30,7 +30,8 @@
<script> <script>
const electron = require('electron') const electron = require('electron')
electron.webFrame.setZoomLevelLimits(1, 1) electron.webFrame.setZoomLevelLimits(1, 1)
var scriptUrl = process.env.BOOST_ENV === 'development' const _ = require('lodash')
var scriptUrl = _.find(electron.remote.process.argv, a => a === '--hot')
? 'http://localhost:8080/assets/finder.js' ? 'http://localhost:8080/assets/finder.js'
: '../../compiled/finder.js' : '../../compiled/finder.js'
var scriptEl=document.createElement('script') var scriptEl=document.createElement('script')

View File

@@ -13,7 +13,9 @@ import dataStore from 'boost/dataStore'
const electron = require('electron') const electron = require('electron')
const { remote, clipboard, ipcRenderer } = electron const { remote, clipboard, ipcRenderer } = electron
var hideFinder = remote.getGlobal('hideFinder') function hideFinder () {
ipcRenderer.send('hide-finder')
}
function notify (...args) { function notify (...args) {
return new window.Notification(...args) return new window.Notification(...args)

View File

@@ -58,10 +58,11 @@
electron.webFrame.setZoomLevelLimits(1, 1) electron.webFrame.setZoomLevelLimits(1, 1)
var version = electron.remote.app.getVersion() var version = electron.remote.app.getVersion()
document.title = 'Boost' + ((version == null || version.length === 0) ? ' DEV' : '') document.title = 'Boost' + ((version == null || version.length === 0) ? ' DEV' : '')
var scriptUrl = process.env.BOOST_ENV === 'development' const _ = require('lodash')
var scriptUrl = _.find(electron.remote.process.argv, a => a === '--hot')
? 'http://localhost:8080/assets/main.js' ? 'http://localhost:8080/assets/main.js'
: '../../compiled/main.js' : '../../compiled/main.js'
var scriptEl=document.createElement('script') var scriptEl = document.createElement('script')
scriptEl.setAttribute("type","text/javascript") scriptEl.setAttribute("type","text/javascript")
scriptEl.setAttribute("src", scriptUrl) scriptEl.setAttribute("src", scriptUrl)
document.getElementsByTagName("head")[0].appendChild(scriptEl) document.getElementsByTagName("head")[0].appendChild(scriptEl)

117
finder.js
View File

@@ -4,26 +4,84 @@ const Tray = electron.Tray
const Menu = electron.Menu const Menu = electron.Menu
const MenuItem = electron.MenuItem const MenuItem = electron.MenuItem
const ipcMain = electron.ipcMain const ipcMain = electron.ipcMain
const path = require('path')
process.stdin.setEncoding('utf8') const nodeIpc = require('node-ipc')
console.log = function () { var finderWindow = null
process.stdout.write(JSON.stringify({ var isFinderLoaded = false
type: 'log',
data: JSON.stringify(Array.prototype.slice.call(arguments).join(' ')) function hideFinder () {
}), 'utf-8') if (!isFinderLoaded) return false
if (process.platform === 'darwin') {
Menu.sendActionToFirstResponder('hide:')
}
if (process.platform === 'win32') {
finderWindow.minimize()
}
finderWindow.hide()
} }
function showFinder () {
if (!isFinderLoaded) return false
if (!finderWindow.isVisible()) {
finderWindow.show()
}
if (process.platform === 'win32') {
finderWindow.minimize()
finderWindow.restore()
}
}
nodeIpc.config.id = 'finder'
nodeIpc.config.retry = 1500
nodeIpc.config.silent = true
nodeIpc.connectTo(
'main',
path.join(app.getPath('userData'), 'boost.service'),
function () {
nodeIpc.of.main.on(
'connect',
function () {
nodeIpc.log('<< ## connected to world ##'.rainbow, nodeIpc.config.delay)
}
)
nodeIpc.of.main.on(
'disconnect',
function(){
nodeIpc.log('<< disconnected from main'.notice)
}
)
nodeIpc.of.main.on(
'message',
function (payload) {
switch (payload.type) {
case 'open-finder':
showFinder()
break
}
}
)
}
)
function emit (type, data) { function emit (type, data) {
process.stdout.write(JSON.stringify({ var payload = {
type: type, type: type,
data: JSON.stringify(data) data: data
}), 'utf-8') }
nodeIpc.of.main.emit('message', payload)
} }
var finderWindow var appQuit = false
app.on('ready', function () { app.on('ready', function () {
app.dock.hide() if (process.platform === 'darwin') {
app.dock.hide()
}
var appIcon = new Tray(__dirname + '/resources/tray-icon.png') var appIcon = new Tray(__dirname + '/resources/tray-icon.png')
appIcon.setToolTip('Boost') appIcon.setToolTip('Boost')
@@ -43,7 +101,7 @@ app.on('ready', function () {
trayMenu.append(new MenuItem({ trayMenu.append(new MenuItem({
label: 'Open Finder window', label: 'Open Finder window',
click: function () { click: function () {
finderWindow.show() showFinder()
} }
})) }))
trayMenu.append(new MenuItem({ trayMenu.append(new MenuItem({
@@ -53,29 +111,30 @@ app.on('ready', function () {
} }
})) }))
appIcon.setContextMenu(trayMenu) appIcon.setContextMenu(trayMenu)
appIcon.on('click', function (e) {
process.stdin.on('data', function (payload) { e.preventDefault()
try { appIcon.popUpContextMenu(trayMenu)
payload = JSON.parse(payload)
} catch (e) {
console.log('Not parsable payload : ', payload)
return
}
console.log('from main >> ', payload.type)
switch (payload.type) {
case 'open-finder':
finderWindow.show()
break
}
}) })
ipcMain.on('copy-finder', function () { ipcMain.on('copy-finder', function () {
emit('copy-finder') emit('copy-finder')
}) })
ipcMain.on('hide-finder', function () {
hideFinder()
})
isFinderLoaded = true
}) })
global.hideFinder = function () { finderWindow.on('blur', function () {
Menu.sendActionToFirstResponder('hide:') hideFinder()
} })
finderWindow.on('close', function (e) {
if (appQuit) return true
e.preventDefault()
hideFinder()
})
}) })

View File

@@ -13,14 +13,22 @@ function getLocalPath () {
} }
function forgeInitialRepositories () { function forgeInitialRepositories () {
return [{ let defaultRepo = {
key: keygen(), key: keygen(),
name: 'local', name: 'local',
type: 'userData', type: 'userData',
user: { user: {
name: remote.getGlobal('process').env.USER name: 'New user'
} }
}] }
if (process.platform === 'darwin') {
defaultRepo.user.name = remote.process.env.USER
} else if (process.platform === 'win32') {
defaultRepo.user.name = remote.process.env.USERNAME
}
return [defaultRepo]
} }
function getRepositories () { function getRepositories () {

105
main.js
View File

@@ -7,7 +7,8 @@ const autoUpdater = electron.autoUpdater
const jetpack = require('fs-jetpack') const jetpack = require('fs-jetpack')
const path = require('path') const path = require('path')
const ChildProcess = require('child_process') const ChildProcess = require('child_process')
electron.crashReporter.start() const _ = require('lodash')
// electron.crashReporter.start()
var mainWindow = null var mainWindow = null
var finderProcess var finderProcess
@@ -61,6 +62,44 @@ autoUpdater
} }
}) })
const nodeIpc = require('node-ipc')
var isNodeIpcReady = false
nodeIpc.config.id = 'node'
nodeIpc.config.retry= 1500
nodeIpc.config.silent = true
nodeIpc.serve(
path.join(app.getPath('userData'), 'boost.service'),
function(){
isNodeIpcReady = true
nodeIpc.server.on(
'message',
function (data, socket){
console.log('>>', data)
format(data)
}
)
}
)
function format (payload) {
switch (payload.type) {
case 'show-main-window':
mainWindow.minimize()
mainWindow.restore()
break
case 'copy-finder':
mainWindow.webContents.send('copy-finder')
break
case 'quit-app':
appQuit = true
app.quit()
break
}
}
app.on('ready', function () { app.on('ready', function () {
app.on('before-quit', function () { app.on('before-quit', function () {
if (finderProcess) finderProcess.kill() if (finderProcess) finderProcess.kill()
@@ -93,14 +132,26 @@ app.on('ready', function () {
e.preventDefault() e.preventDefault()
mainWindow.hide() mainWindow.hide()
}) })
function emitToFinder (type, data) {
if (!isNodeIpcReady) {
console.log('server is not ready')
}
var payload = {
type: type,
data: data
}
nodeIpc.server.broadcast('message', payload)
}
mainWindow.webContents.on('did-finish-load', function () { mainWindow.webContents.on('did-finish-load', function () {
if (finderProcess == null) { if (finderProcess == null) {
var finderArgv = [path.resolve(__dirname, 'finder.js'), '--finder']
if (_.find(process.argv, a => a === '--hot')) finderArgv.push('--hot')
finderProcess = ChildProcess finderProcess = ChildProcess
.execFile(process.execPath, [path.resolve(__dirname, 'finder.js'), '--finder']) .execFile(process.execPath, finderArgv)
finderProcess.stdout.setEncoding('utf8')
finderProcess.stderr.setEncoding('utf8') nodeIpc.server.start()
finderProcess.stdout.on('data', format)
finderProcess.stderr.on('data', errorFormat)
} }
if (update != null) { if (update != null) {
@@ -115,48 +166,6 @@ app.on('ready', function () {
mainWindow.show() mainWindow.show()
}) })
function format (payload) {
// console.log('from finder >> ', payload)
try {
payload = JSON.parse(payload)
} catch (e) {
console.log('Not parsable payload : ', payload)
return
}
switch (payload.type) {
case 'log':
console.log('FINDER(stdout): ' + payload.data)
break
case 'show-main-window':
mainWindow.show()
break
case 'copy-finder':
mainWindow.webContents.send('copy-finder')
break
case 'request-data':
mainWindow.webContents.send('request-data')
break
case 'quit-app':
appQuit = true
app.quit()
break
}
}
function errorFormat (output) {
console.error('FINDER(stderr):' + output)
}
function emitToFinder (type, data) {
if (!finderProcess) {
console.log('finder process is not ready')
return
}
var payload = {
type: type,
data: data
}
finderProcess.stdin.write(JSON.stringify(payload), 'utf-8')
}
var userDataPath = app.getPath('userData') var userDataPath = app.getPath('userData')
if (!jetpack.cwd(userDataPath).exists('keymap.json')) { if (!jetpack.cwd(userDataPath).exists('keymap.json')) {

View File

@@ -4,9 +4,10 @@
"description": "Boost App", "description": "Boost App",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"start": "set BOOST_ENV=development&& electron ./main.js", "start": "electron ./index.js",
"hot": "electron ./index.js --hot",
"webpack": "webpack-dev-server --hot --inline --config webpack.config.js", "webpack": "webpack-dev-server --hot --inline --config webpack.config.js",
"compile": "NODE_ENV=production webpack --config webpack.config.production.js", "compile": "webpack --config webpack.config.production.js",
"pack:osx": "electron-packager ./ Boost --app-version=$npm_package_version $npm_package_config_platform $npm_package_config_version $npm_package_config_ignore --overwrite --out=\"dist\"", "pack:osx": "electron-packager ./ Boost --app-version=$npm_package_version $npm_package_config_platform $npm_package_config_version $npm_package_config_ignore --overwrite --out=\"dist\"",
"codesign": "codesign --verbose --deep --force --sign \"MAISIN solutions Inc.\" dist/Boost-darwin-x64/Boost.app", "codesign": "codesign --verbose --deep --force --sign \"MAISIN solutions Inc.\" dist/Boost-darwin-x64/Boost.app",
"build:osx": "electron-builder \"dist/Boost-darwin-x64/Boost.app\" --platform=osx --out=\"dist\" --config=\"./builder-config.json\"", "build:osx": "electron-builder \"dist/Boost-darwin-x64/Boost.app\" --platform=osx --out=\"dist\" --config=\"./builder-config.json\"",
@@ -48,6 +49,7 @@
"markdown-it-emoji": "^1.1.0", "markdown-it-emoji": "^1.1.0",
"md5": "^2.0.0", "md5": "^2.0.0",
"moment": "^2.10.3", "moment": "^2.10.3",
"node-ipc": "^5.0.0",
"socket.io-client": "^1.3.6", "socket.io-client": "^1.3.6",
"superagent": "^1.2.0", "superagent": "^1.2.0",
"superagent-promise": "^1.0.3" "superagent-promise": "^1.0.3"