Move ApplicationMenu to the AtomApplication

This moves it completely out of the renderer process
This commit is contained in:
probablycorey
2013-08-17 11:08:24 -07:00
committed by Corey Johnson & Nathan Sobo
parent 4d8b2672ff
commit fb2439f193
4 changed files with 61 additions and 66 deletions

2
aa
View File

@@ -1,2 +1,2 @@
coffee -c -o /Applications/Atom.app/Contents/Resources/app/src/ src/main.coffee src/atom-application.coffee src/atom-window.coffee &&
coffee -c -o /Applications/Atom.app/Contents/Resources/app/src/ src/main.coffee src/atom-application.coffee src/atom-window.coffee src/application-menu.coffee &&
/Applications/Atom.app/Contents/MacOS/Atom --resource-path=$(pwd) --executed-from=$(pwd) $@

View File

@@ -1,20 +1,51 @@
ipc = require 'ipc'
Menu = require 'menu'
module.exports =
class ApplicationMenu
keyBindingsByCommand: null
menu: null
constructor: (@keyBindingsByCommand) ->
menuTemplate = @getMenuTemplate()
@parseMenuTemplate(menuTemplate, keyBindingsByCommand)
ipc.sendChannel 'build-menu-bar-from-template', menuTemplate
constructor: (@keyBindingsByCommand, isDevMode, version) ->
menuTemplate = @getMenuTemplate(isDevMode, version)
@parseMenuTemplate(menuTemplate)
@menu = Menu.buildFromTemplate(menuTemplate)
Menu.setApplicationMenu(@menu)
@enableWindowMenuItems(true)
getMenuTemplate: ->
allMenuItems: (menu=@menu) ->
menuItems = []
for index, item of menu.items or {}
menuItems.push(item)
menuItems = menuItems.concat(@allMenuItems(item.submenu)) if item.submenu
menuItems
enableWindowMenuItems: (enable) ->
for menuItem in @allMenuItems()
menuItem.enabled = enable if menuItem.metadata?['windowMenuItem']
parseMenuTemplate: (menuTemplate) ->
menuTemplate.forEach (menuItem) =>
menuItem.metadata = {}
if menuItem.command
menuItem.accelerator = @acceleratorForCommand(menuItem.command)
menuItem.click = => global.atomApplication.sendCommand(menuItem.command)
menuItem.metadata['windowMenuItem'] = true unless /^application:/.test(menuItem.command)
@parseMenuTemplate(menuItem.submenu) if menuItem.submenu
showDownloadUpdateItem: (version, quitAndUpdateCallback) ->
downloadUpdateItem = _.find @allMenuItems(), (item) -> item.label == 'Install update'
if downloadUpdateItem
downloadUpdateItem.visible = true
downloadUpdateItem.click = quitAndUpdateCallback
getMenuTemplate: (isDevMode, version) ->
atomMenu =
label: 'Atom'
submenu: [
{ label: 'About Atom', command: 'application:about' }
{ label: "Version #{atom.getVersion()}", enabled: false }
{ label: "Version #{version}", enabled: false }
{ label: "Install update", command: 'application:install-update', visible: false }
{ type: 'separator' }
{ label: 'Preferences...', command: 'application:show-settings' }
@@ -69,19 +100,13 @@ class ApplicationMenu
]
menu = [atomMenu, fileMenu, editMenu, viewMenu, windowMenu]
if atom.isDevMode()
if isDevMode
menu.push
label: '\uD83D\uDC80' # Skull emoji
submenu: [ { label: 'In Development Mode', enabled: false } ]
menu
parseMenuTemplate: (menuItems) ->
for menuItem in menuItems
if menuItem.command
menuItem.accelerator = @acceleratorForCommand(menuItem.command)
@parseMenuTemplate(menuItem.submenu) if menuItem.submenu
acceleratorForCommand: (command) ->
keyBinding = @keyBindingsByCommand[command]?[0]
return null unless keyBinding

View File

@@ -1,4 +1,5 @@
AtomWindow = require './atom-window'
ApplicationMenu = require './application-menu'
BrowserWindow = require 'browser-window'
Menu = require 'menu'
autoUpdater = require 'auto-updater'
@@ -34,11 +35,12 @@ class AtomApplication
client.on 'error', createAtomApplication
windows: null
menu: null
applicationMenu: null
resourcePath: null
version: null
devMode: null
constructor: ({@resourcePath, pathsToOpen, urlsToOpen, @version, test, pidToKillWhenClosed, devMode, newWindow}) ->
constructor: ({@resourcePath, pathsToOpen, urlsToOpen, @version, test, pidToKillWhenClosed, @devMode, newWindow}) ->
global.atomApplication = this
@pidsToOpenWindows = {}
@@ -54,19 +56,19 @@ class AtomApplication
if test
@runSpecs({exitWhenDone: true, @resourcePath})
else if pathsToOpen.length > 0
@openPaths({pathsToOpen, pidToKillWhenClosed, newWindow, devMode})
@openPaths({pathsToOpen, pidToKillWhenClosed, newWindow, @devMode})
else if urlsToOpen.length > 0
@openUrl({urlToOpen, devMode}) for urlToOpen in urlsToOpen
@openUrl({urlToOpen, @devMode}) for urlToOpen in urlsToOpen
else
@openPath({pidToKillWhenClosed, newWindow, devMode}) # Always open a editor window if this is the first instance of Atom.
@openPath({pidToKillWhenClosed, newWindow, @devMode}) # Always open a editor window if this is the first instance of Atom.
removeWindow: (window) ->
@windows.splice @windows.indexOf(window), 1
@enableWindowMenuItems(false) if @windows.length == 0
@applicationMenu?.enableWindowMenuItems(false) if @windows.length == 0
addWindow: (window) ->
@windows.push window
@enableWindowMenuItems(true) == 0
@applicationMenu?.enableWindowMenuItems(true) == 0
createDefaultMenu: ->
@menu = Menu.buildFromTemplate [
@@ -119,10 +121,7 @@ class AtomApplication
autoUpdater.on 'ready-for-update-on-quit', (event, version, quitAndUpdateCallback) =>
event.preventDefault()
updateMenuItem = _.find @allMenuItems(), (menuItem) -> menuItem.label == 'Install update'
if updateMenuItem
updateMenuItem.visible = true
updateMenuItem.click = quitAndUpdateCallback
@applicationMenu.showDownloadUpdateItem(version, quitAndUpdateCallback)
ipc.on 'open', (processId, routingId, pathsToOpen) =>
if pathsToOpen?.length > 0
@@ -133,37 +132,8 @@ class AtomApplication
ipc.on 'get-version', (event) =>
event.result = @version
ipc.once 'build-menu-bar-from-template', (processId, routingId, menuTemplate) =>
@buildMenu(menuTemplate)
buildMenu: (menuTemplate) ->
@parseMenuTemplate(menuTemplate)
@menu = Menu.buildFromTemplate(menuTemplate)
Menu.setApplicationMenu(@menu)
@enableWindowMenuItems(true)
allMenuItems: (menu=@menu) ->
return [] unless menu?
menuItems = []
for index, item of menu.items or {}
menuItems.push(item)
menuItems = menuItems.concat(@allMenuItems(item.submenu)) if item.submenu
menuItems
enableWindowMenuItems: (enable) ->
for menuItem in @allMenuItems()
menuItem.enabled = enable if menuItem.metadata?['windowSpecificItem']
parseMenuTemplate: (menuTemplate) ->
menuTemplate.forEach (menuItem) =>
menuItem.metadata = {}
if menuItem.command
menuItem.click = => @sendCommand(menuItem.command)
menuItem.metadata['windowSpecificItem'] = true unless /^application:/.test(menuItem.command)
if menuItem.submenu
@parseMenuTemplate(menuItem.submenu)
ipc.once 'keymap-loaded', (processId, routingId, keyBindingsByCommand) =>
@applicationMenu = new ApplicationMenu(keyBindingsByCommand, @version, @devMode)
sendCommand: (command, args...) ->
return if @interceptApplicationCommands(command)
@@ -215,22 +185,22 @@ class AtomApplication
focusedWindow: ->
_.find @windows, (atomWindow) -> atomWindow.isFocused()
openPaths: ({pathsToOpen, pidToKillWhenClosed, newWindow, devMode}) ->
@openPath({pathToOpen, pidToKillWhenClosed, newWindow, devMode}) for pathToOpen in pathsToOpen ? []
openPaths: ({pathsToOpen, pidToKillWhenClosed, newWindow, @devMode}) ->
@openPath({pathToOpen, pidToKillWhenClosed, newWindow, @devMode}) for pathToOpen in pathsToOpen ? []
openPath: ({pathToOpen, pidToKillWhenClosed, newWindow, devMode}={}) ->
unless devMode
openPath: ({pathToOpen, pidToKillWhenClosed, newWindow, @devMode}={}) ->
unless @devMode
existingWindow = @windowForPath(pathToOpen) unless pidToKillWhenClosed or newWindow
if existingWindow
openedWindow = existingWindow
openedWindow.openPath(pathToOpen)
else
bootstrapScript = 'window-bootstrap'
if devMode
if @devMode
resourcePath = global.devResourcePath
else
resourcePath = @resourcePath
openedWindow = new AtomWindow({pathToOpen, bootstrapScript, resourcePath, devMode})
openedWindow = new AtomWindow({pathToOpen, bootstrapScript, resourcePath, @devMode})
if pidToKillWhenClosed?
@pidsToOpenWindows[pidToKillWhenClosed] = openedWindow
@@ -266,6 +236,6 @@ class AtomApplication
devMode = true
new AtomWindow({bootstrapScript, resourcePath, exitWhenDone, isSpec, devMode})
promptForPath: ({devMode}={}) ->
promptForPath: ({@devMode}={}) ->
pathsToOpen = dialog.showOpenDialog title: 'Open', properties: ['openFile', 'openDirectory', 'multiSelections', 'createDirectory']
@openPaths({pathsToOpen, devMode})
@openPaths({pathsToOpen, @devMode})

View File

@@ -4,8 +4,8 @@ telepath = require 'telepath'
$ = require 'jquery'
less = require 'less'
remote = require 'remote'
ipc = require 'ipc'
WindowEventHandler = require 'window-event-handler'
ApplicationMenu = require 'application-menu'
require 'jquery-extensions'
require 'underscore-extensions'
require 'space-pen-extensions'
@@ -55,7 +55,7 @@ window.startEditorWindow = ->
atom.activatePackages()
keymap.loadUserKeymaps()
atom.requireUserInitScript()
new ApplicationMenu(keymap.toObject())
ipc.sendChannel 'keymap-loaded', keymap.toObject()
$(window).on 'unload', -> unloadEditorWindow(); false
atom.show()
atom.focus()