app = require 'app'
ChildProcess = require 'child_process'
path = require 'path'

updateDotExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe')
exeName = path.basename(process.execPath)

createShortcut = ->
  ChildProcess.execFile updateDotExe, ['--createShortcut', exeName], ->
    app.quit()

removeShortcut = ->
  ChildProcess.execFile updateDotExe, ['--removeShortcut', exeName], ->
    app.quit()

module.exports = ->
  switch process.argv[1]
    when '--squirrel-install', '--squirrel-updated'
      createShortcut()
      true
    when '--squirrel-uninstall'
      removeShortcut()
      true
    when '--squirrel-obsolete'
      app.quit()
      true
    else
      false

app = require 'app'
ChildProcess = require 'child_process'
path = require 'path'

spawnUpdateAndQuit = (option) ->
  updateDotExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe')
  exeName = path.basename(process.execPath)
  updateProcess = ChildProcess.spawn(updateDotExe, ["--#{option}", exeName])
  updateProcess.on 'error', -> # Ignore errors
  updateProcess.on 'close', -> app.quit()

module.exports = ->
  switch process.argv[1]
    when '--squirrel-install', '--squirrel-updated'
      spawnUpdateAndQuit('createShortcut')
      true
    when '--squirrel-uninstall'
      spawnUpdateAndQuit('removeShortcut')
      true
    when '--squirrel-obsolete'
      app.quit()
      true
    else
      false

Use spawn instead of execFile for squirrel events


'menu': [
  {
    'label': 'Packages'
    'submenu': [
      'label': 'Settings View'
      'submenu': [
        { 'label': 'Change Themes', 'command': 'settings-view:change-themes' }
        { 'label': 'Install Themes', 'command': 'settings-view:install-themes' }
        { 'label': 'Install Packages', 'command': 'settings-view:install-packages' }
      ]
    ]
  }
]

Add initial Settings View menu

Add initial Settings View menu


path = require 'path'

module.exports = (grunt) ->
  {spawn} = require('./task-helpers')(grunt)

  grunt.registerTask 'codesign', 'Codesign the app', ->
    done = @async()

    if process.platform is 'darwin' and process.env.XCODE_KEYCHAIN
      unlockKeychain (error) ->
        if error?
          done(error)
        else
          signApp(done)
    else
      signApp(done)

  unlockKeychain = (callback) ->
    cmd = 'security'
    {XCODE_KEYCHAIN_PASSWORD, XCODE_KEYCHAIN} = process.env
    args = ['unlock-keychain', '-p', XCODE_KEYCHAIN_PASSWORD, XCODE_KEYCHAIN]
    spawn {cmd, args}, (error) -> callback(error)

  signApp = (callback) ->
    switch process.platform
      when 'darwin'
        cmd = 'codesign'
        args = ['-f', '-v', '-s', 'Developer ID Application: GitHub', grunt.config.get('atom.shellAppDir')]
        spawn {cmd, args}, (error) -> callback(error)
      when 'win32'
        cmd = process.env.JANKY_SIGNTOOL ? 'signtool'
        args = [path.join(grunt.config.get('atom.shellAppDir'), 'atom.exe')]
        spawn {cmd, args}, (error) -> callback(error)
      else
        callback()

path = require 'path'

module.exports = (grunt) ->
  {spawn} = require('./task-helpers')(grunt)

  grunt.registerTask 'codesign', 'Codesign the app', ->
    done = @async()

    if process.platform is 'darwin' and process.env.XCODE_KEYCHAIN
      unlockKeychain (error) ->
        if error?
          done(error)
        else
          signApp(done)
    else
      signApp(done)

  unlockKeychain = (callback) ->
    cmd = 'security'
    {XCODE_KEYCHAIN_PASSWORD, XCODE_KEYCHAIN} = process.env
    args = ['unlock-keychain', '-p', XCODE_KEYCHAIN_PASSWORD, XCODE_KEYCHAIN]
    spawn {cmd, args}, (error) -> callback(error)

  signApp = (callback) ->
    switch process.platform
      when 'darwin'
        cmd = 'codesign'
        args = ['-f', '-v', '-s', 'Developer ID Application: GitHub', grunt.config.get('atom.shellAppDir')]
        spawn {cmd, args}, (error) -> callback(error)
      when 'win32'
        signtool = process.env.JANKY_SIGNTOOL ? 'signtool'
        cmd = 'taskkill /FIM atom.exe & ' + signtool
        args = [path.join(grunt.config.get('atom.shellAppDir'), 'atom.exe')]
        spawn {cmd, args}, (error) -> callback(error)
      else
        callback()

Kill all atom.exe before signing

Kill all atom.exe before signing


# Teaspoon includes some support files, but you can use anything from your own support path too.
# require support/jasmine-jquery-1.7.0
# require support/jasmine-jquery-2.0.0
# require support/jasmine-jquery-2.1.0
# require support/sinon
# require support/your-support-file
#
# PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
# Use this polyfill to avoid the confusion.
#= require support/phantomjs-shims
#
# You can require your own javascript files here. By default this will include everything in application, however you
# may get better load performance if you require the specific files that are being used in the spec that tests them.
#= require application
#
# Deferring execution
# If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
# Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
#
# Teaspoon.defer = true
# setTimeout(Teaspoon.execute, 1000)
#
# Matching files
# By default Teaspoon will look for files that match _spec.{js,js.coffee,.coffee}. Add a filename_spec.js file in your
# spec path and it'll be included in the default suite automatically. If you want to customize suites, check out the
# configuration in teaspoon_env.rb
#
# Manifest
# If you'd rather require your spec files manually (to control order for instance) you can disable the suite matcher in
# the configuration and use this file as a manifest.
#
# For more information: http://github.com/modeset/teaspoon

class window.Tools
  geod = GeographicLib.Geodesic.WGS84

  # Generate a square from a starting point (as a bottom right corner), clockwise, with specified distance
  @squareFrom: (point = [], distance) -> # ([lat, lng], number) -> [[lat,lng], [lat,lng], [lat,lng], [lat,lng]]
    square = []
    square.push(point)
    i = 0
    azimut = 0
    while i < 3
      r = geod.Direct(square[i][0], square[i][1], azimut, distance)
      # store new coordinate, as lat/lon pair
      square.push([r.lat2, r.lon2])
      # Move angle to 90 degrees
      azimut -= 90
      i++
    square

Add tool to generate a square polygon

Add tool to generate a square polygon


# Your snippets
#
# Atom snippets allow you to enter a simple prefix in the editor and hit tab to
# expand the prefix into a larger code block with templated values.
#
# You can create a new snippet in this file by typing `snip` and then hitting
# tab.
#
# An example CoffeeScript snippet to expand log to console.log:
#
# '.source.coffee':
#   'Console log':
#     'prefix': 'log'
#     'body': 'console.log $1'
#

# Your snippets
#
# Atom snippets allow you to enter a simple prefix in the editor and hit tab to
# expand the prefix into a larger code block with templated values.
#
# You can create a new snippet in this file by typing "snip" and then hitting
# tab.
#
# An example CoffeeScript snippet to expand log to console.log:
#
# '.source.coffee':
#   'Console log':
#     'prefix': 'log'
#     'body': 'console.log $1'
#

Use quotes for inserted text

:memo: Use quotes for inserted text