mirror of
https://github.com/atom/atom.git
synced 2026-04-06 03:02:13 -04:00
Move ApplicationMenu to the AtomApplication
This moves it completely out of the renderer process
This commit is contained in:
committed by
Corey Johnson & Nathan Sobo
parent
4d8b2672ff
commit
fb2439f193
2
aa
2
aa
@@ -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) $@
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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})
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user