1
0
mirror of https://github.com/BoostIo/Boostnote synced 2025-12-13 09:46:22 +00:00
Files
Boostnote/lib/hotkey.js
2016-03-10 08:49:44 +09:00

117 lines
2.7 KiB
JavaScript

const electron = require('electron')
const app = electron.app
const ipc = electron.ipcMain
const Menu = electron.Menu
const globalShortcut = electron.globalShortcut
const jetpack = require('fs-jetpack')
const mainWindow = require('./main-window')
const nodeIpc = require('@rokt33r/node-ipc')
const _ = require('lodash')
const OSX = global.process.platform === 'darwin'
const defaultKeymap = {
toggleFinder: OSX ? 'Cmd + Alt + S' : 'Super + Alt + S',
toggleMain: OSX ? 'Cmd + Alt + L' : 'Super + Alt + E'
}
const keymapFilename = 'keymap.json'
var userDataPath = app.getPath('userData')
function getKeymap () {
var userDataPath = app.getPath('userData')
if (jetpack.cwd(userDataPath).exists(keymapFilename)) {
try {
return JSON.parse(jetpack.cwd(userDataPath).read(keymapFilename, 'utf-8'))
} catch (err) {}
}
return {}
}
function saveKeymap () {
var content
try {
content = JSON.stringify(global.keymap)
} catch (e) {
global.keymap = {}
content = JSON.stringify(global.keymap)
}
jetpack.cwd(userDataPath).file(keymapFilename, { content })
}
function emitToFinder (type, data) {
var payload = {
type: type,
data: data
}
nodeIpc.server.broadcast('message', payload)
}
function toggleFinder () {
emitToFinder('open-finder')
mainWindow.webContents.send('open-finder', {})
}
function toggleMain () {
if (mainWindow.isFocused()) {
if (process.platform === 'darwin') {
Menu.sendActionToFirstResponder('hide:')
} else {
mainWindow.minimize()
}
} else {
if (process.platform === 'darwin') {
mainWindow.show()
} else {
mainWindow.minimize()
mainWindow.restore()
}
mainWindow.webContents.send('top-focus-search')
}
}
// Init
global.keymap = Object.assign({}, defaultKeymap, getKeymap())
function registerKey (name, callback) {
if (_.isString(global.keymap[name]) && global.keymap[name].trim().length > 0) {
globalShortcut.register(global.keymap[name], callback)
}
}
function registerAllKeys (broadcast) {
if (broadcast == null) broadcast = true
var errors = []
try {
registerKey('toggleFinder', toggleFinder)
} catch (err) {
errors.push('toggleFinder')
}
try {
registerKey('toggleMain', toggleMain)
} catch (err) {
errors.push('toggleMain')
}
if (broadcast) {
if (errors.length === 0) {
mainWindow.webContents.send('APP_SETTING_DONE', {})
} else {
mainWindow.webContents.send('APP_SETTING_ERROR', {
message: 'Failed to apply hotkey: ' + errors.join(' ')
})
}
}
}
registerAllKeys(false)
ipc.on('hotkeyUpdated', function (event, newKeymap) {
global.keymap = Object.assign({}, defaultKeymap, global.keymap, newKeymap)
saveKeymap()
globalShortcut.unregisterAll()
registerAllKeys()
})