From e455acec5e07062b7f4a68132458fe827e28b00a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 08:56:12 -0700 Subject: [PATCH 01/61] :arrow_up: language-gfm@0.74 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56f8bf7c5..020fd2f2e 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "language-coffee-script": "0.40.0", "language-csharp": "0.5.0", "language-css": "0.29.0", - "language-gfm": "0.73.0", + "language-gfm": "0.74.0", "language-git": "0.10.0", "language-go": "0.26.0", "language-html": "0.37.0", From 4b2e23508f0267fdb8d4af002359d6819e980582 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Fri, 8 May 2015 16:02:01 -0700 Subject: [PATCH 02/61] Add autocomplete-plus into core :tada: --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 020fd2f2e..eeaeed69c 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "solarized-dark-syntax": "0.35.0", "solarized-light-syntax": "0.21.0", "archive-view": "0.57.0", - "autocomplete": "0.47.0", + "autocomplete-plus": "2.13.1", "autoflow": "0.23.0", "autosave": "0.20.0", "background-tips": "0.24.0", From da646e635c170fe3eb18903ad8b14d0036eb035e Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Fri, 8 May 2015 16:02:34 -0700 Subject: [PATCH 03/61] Uninstall any intalled version of autocomplete-plus --- src/package-manager.coffee | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 8527188d3..1692d477a 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -303,6 +303,9 @@ class PackageManager # of the first package isn't skewed by being the first to require atom require '../exports/atom' + # TODO: remove after a few atom versions. + @uninstallAutocompletePlus() + packagePaths = @getAvailablePackagePaths() packagePaths = packagePaths.filter (packagePath) => not @isPackageDisabled(path.basename(packagePath)) packagePaths = _.uniq packagePaths, (packagePath) -> path.basename(packagePath) @@ -409,6 +412,18 @@ class PackageManager message = "Failed to load the #{path.basename(packagePath)} package" atom.notifications.addError(message, {stack, detail, dismissable: true}) + # TODO: remove these autocomplete-plus specific helpers after a few versions. + uninstallAutocompletePlus: -> + packageDir = null + devDir = path.join("dev", "packages") + for packageDirPath in @packageDirPaths + packageDir = packageDirPath if not packageDirPath.endsWith(devDir) + + if packageDir? + autocompletePlusPath = path.join(packageDir, 'autocomplete-plus') + fs.isDirectory autocompletePlusPath, (isDir, error) -> + fs.unlink(autocompletePlusPath) if isDir + if Grim.includeDeprecatedAPIs EmitterMixin = require('emissary').Emitter EmitterMixin.includeInto(PackageManager) From 1d9d9f1cf597fc598e22544b0e7a2cc1dd1d5e8b Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 15:24:57 -0700 Subject: [PATCH 04/61] Handle deleting autocomplete-plus when symlink and dir --- src/package-manager.coffee | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 1692d477a..7ee1304c2 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -421,8 +421,10 @@ class PackageManager if packageDir? autocompletePlusPath = path.join(packageDir, 'autocomplete-plus') - fs.isDirectory autocompletePlusPath, (isDir, error) -> - fs.unlink(autocompletePlusPath) if isDir + if fs.isSymbolicLinkSync(autocompletePlusPath) + fs.unlink(autocompletePlusPath) + else if fs.isDirectorySync(autocompletePlusPath) + fs.remove(autocompletePlusPath, ->) if Grim.includeDeprecatedAPIs EmitterMixin = require('emissary').Emitter From 044c2ec37c33621933b9e1e32bdd5db8d68b46a4 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:21:17 -0700 Subject: [PATCH 05/61] Bundle autocomplete-css, html and atom-api --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index eeaeed69c..07cf9ac55 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,9 @@ "solarized-dark-syntax": "0.35.0", "solarized-light-syntax": "0.21.0", "archive-view": "0.57.0", + "autocomplete-atom-api": "0.9.0", + "autocomplete-css": "0.7.2", + "autocomplete-html": "0.7.1", "autocomplete-plus": "2.13.1", "autoflow": "0.23.0", "autosave": "0.20.0", From e7d921bfbc93b6e05c77d766130d64a165e5e83f Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:21:35 -0700 Subject: [PATCH 06/61] Add specs for autocomplete deletion --- spec/package-manager-spec.coffee | 33 ++++++++++++++++++++++++++++++++ spec/spec-helper.coffee | 2 ++ 2 files changed, 35 insertions(+) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 92dc21a13..00b05c102 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -824,3 +824,36 @@ describe "PackageManager", -> expect(atom.config.get('core.themes')).not.toContain packageName expect(atom.config.get('core.themes')).not.toContain packageName expect(atom.config.get('core.disabledPackages')).not.toContain packageName + + describe "deleting non-bundled autocomplete packages", -> + [autocompleteCSSPath, autocompletePlusPath] = [] + fs = require 'fs-plus' + path = require 'path' + + beforeEach -> + fixturePath = path.resolve(__dirname, './fixtures/packages') + autocompleteCSSPath = path.join(fixturePath, 'autocomplete-css') + autocompletePlusPath = path.join(fixturePath, 'autocomplete-plus') + + try + fs.mkdirSync(autocompleteCSSPath) + fs.writeFileSync(path.join(autocompleteCSSPath, 'package.json'), '{}') + fs.symlinkSync(path.join(fixturePath, 'package-with-main'), autocompletePlusPath, 'dir') + catch e + ; + + expect(fs.isDirectorySync(autocompleteCSSPath)).toBe true + expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true + + jasmine.unspy(atom.packages, 'uninstallAutocompletePlus') + + it "removes the packages", -> + atom.packages.loadPackages() + + waitsFor -> + not fs.isDirectorySync(autocompleteCSSPath) and + not fs.isSymbolicLinkSync(autocompletePlusPath) + + runs -> + expect(fs.isDirectorySync(autocompleteCSSPath)).toBe false + expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe false diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 0112042e2..2e4355a10 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -140,6 +140,8 @@ beforeEach -> spyOn(clipboard, 'writeText').andCallFake (text) -> clipboardContent = text spyOn(clipboard, 'readText').andCallFake -> clipboardContent + spyOn(atom.packages, 'uninstallAutocompletePlus') + addCustomMatchers(this) afterEach -> From b83b9bab074f5628f41513a0f11bf0c1d33be7cb Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:21:51 -0700 Subject: [PATCH 07/61] Handle deleting multiple directories --- src/package-manager.coffee | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 7ee1304c2..60a6f7f20 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -417,14 +417,35 @@ class PackageManager packageDir = null devDir = path.join("dev", "packages") for packageDirPath in @packageDirPaths - packageDir = packageDirPath if not packageDirPath.endsWith(devDir) + if not packageDirPath.endsWith(devDir) + packageDir = packageDirPath + break if packageDir? - autocompletePlusPath = path.join(packageDir, 'autocomplete-plus') - if fs.isSymbolicLinkSync(autocompletePlusPath) - fs.unlink(autocompletePlusPath) - else if fs.isDirectorySync(autocompletePlusPath) - fs.remove(autocompletePlusPath, ->) + dirsToRemove = [ + path.join(packageDir, 'autocomplete-plus') + path.join(packageDir, 'autocomplete-atom-api') + path.join(packageDir, 'autocomplete-css') + path.join(packageDir, 'autocomplete-html') + ] + for dirToRemove in dirsToRemove + @uninstallDirectory(dirToRemove) + return + + uninstallDirectory: (directory) -> + symlinkPromise = new Promise (resolve) -> + fs.isSymbolicLink directory, (isSymLink) -> resolve(isSymLink) + + dirPromise = new Promise (resolve) -> + fs.isDirectory directory, (isDir) -> resolve(isDir) + + Promise.all([symlinkPromise, dirPromise]).then (values) -> + [isSymLink, isDir] = values + console.log directory, isSymLink, isDir + if isSymLink + fs.unlink(directory) + else if isDir + fs.remove(directory, ->) if Grim.includeDeprecatedAPIs EmitterMixin = require('emissary').Emitter From c571e3da0caeb43c2192450af44a502681378394 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:25:23 -0700 Subject: [PATCH 08/61] Remove log line --- src/package-manager.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 60a6f7f20..32e55aecd 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -441,7 +441,6 @@ class PackageManager Promise.all([symlinkPromise, dirPromise]).then (values) -> [isSymLink, isDir] = values - console.log directory, isSymLink, isDir if isSymLink fs.unlink(directory) else if isDir From 3b03ef5a0b63d42732d0bd043c2d73bcbd3a4f6c Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:36:09 -0700 Subject: [PATCH 09/61] :arrow_up: autocomplete-plus@2.14.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 07cf9ac55..9972dca62 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.13.1", + "autocomplete-plus": "2.14.0", "autoflow": "0.23.0", "autosave": "0.20.0", "background-tips": "0.24.0", From dd45a6f3abda2bd7cb453b465d654daf9c835b6c Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:42:17 -0700 Subject: [PATCH 10/61] No parens around fn --- src/package-manager.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 32e55aecd..192c1484e 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -444,7 +444,7 @@ class PackageManager if isSymLink fs.unlink(directory) else if isDir - fs.remove(directory, ->) + fs.remove directory, -> if Grim.includeDeprecatedAPIs EmitterMixin = require('emissary').Emitter From b0c9a93420886d8fcd3dc13995d83e475efe4ab6 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 16:54:14 -0700 Subject: [PATCH 11/61] Fix another lint error --- spec/package-manager-spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 00b05c102..89e97f219 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -840,7 +840,7 @@ describe "PackageManager", -> fs.writeFileSync(path.join(autocompleteCSSPath, 'package.json'), '{}') fs.symlinkSync(path.join(fixturePath, 'package-with-main'), autocompletePlusPath, 'dir') catch e - ; + undefined expect(fs.isDirectorySync(autocompleteCSSPath)).toBe true expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true From 95ba6d5fa99f0c11c56c2d7ebf25b4ba1d7b1c67 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 18:47:42 -0700 Subject: [PATCH 12/61] Bundle autocomplete-snippets --- package.json | 1 + src/package-manager.coffee | 1 + 2 files changed, 2 insertions(+) diff --git a/package.json b/package.json index 9972dca62..dd8c2fff6 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-html": "0.7.1", "autocomplete-plus": "2.14.0", + "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", "background-tips": "0.24.0", diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 192c1484e..75005fe11 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -427,6 +427,7 @@ class PackageManager path.join(packageDir, 'autocomplete-atom-api') path.join(packageDir, 'autocomplete-css') path.join(packageDir, 'autocomplete-html') + path.join(packageDir, 'autocomplete-snippets') ] for dirToRemove in dirsToRemove @uninstallDirectory(dirToRemove) From a99d9bf24b936624f878d07e805261f12308e62b Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Mon, 11 May 2015 18:48:00 -0700 Subject: [PATCH 13/61] :arrow_up: autocomplete-plus@2.14.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dd8c2fff6..c3c76d599 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.14.0", + "autocomplete-plus": "2.14.1", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From 326255e6ef98cb02fd629d75a04e1618a182b94d Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 12 May 2015 09:57:46 -0700 Subject: [PATCH 14/61] Add callback to unlink --- src/package-manager.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 75005fe11..7789d7590 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -443,7 +443,7 @@ class PackageManager Promise.all([symlinkPromise, dirPromise]).then (values) -> [isSymLink, isDir] = values if isSymLink - fs.unlink(directory) + fs.unlink directory, -> else if isDir fs.remove directory, -> From ef224e39dba2e44ce7ce00154cd1b7eb01fb072a Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 12 May 2015 09:57:50 -0700 Subject: [PATCH 15/61] Remove catch --- spec/package-manager-spec.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 89e97f219..1cd961936 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -839,8 +839,6 @@ describe "PackageManager", -> fs.mkdirSync(autocompleteCSSPath) fs.writeFileSync(path.join(autocompleteCSSPath, 'package.json'), '{}') fs.symlinkSync(path.join(fixturePath, 'package-with-main'), autocompletePlusPath, 'dir') - catch e - undefined expect(fs.isDirectorySync(autocompleteCSSPath)).toBe true expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true From 4a2c3e90ba332beb37ed32266181e52cdd9dc4ab Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 12 May 2015 10:24:29 -0700 Subject: [PATCH 16/61] Bundle autocomplete-emojis --- package.json | 1 + src/package-manager.coffee | 1 + 2 files changed, 2 insertions(+) diff --git a/package.json b/package.json index c3c76d599..4261d4f29 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "archive-view": "0.57.0", "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", + "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.1", "autocomplete-plus": "2.14.1", "autocomplete-snippets": "1.6.1", diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 7789d7590..1262aa59e 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -427,6 +427,7 @@ class PackageManager path.join(packageDir, 'autocomplete-atom-api') path.join(packageDir, 'autocomplete-css') path.join(packageDir, 'autocomplete-html') + path.join(packageDir, 'autocomplete-emojis') path.join(packageDir, 'autocomplete-snippets') ] for dirToRemove in dirsToRemove From 400fb0cf6d0b2a73aaa1a88f8253d47d8386096f Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Tue, 12 May 2015 16:00:48 -0700 Subject: [PATCH 17/61] :arrow_up: autocomplete-plus@2.14.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4261d4f29..a92f48caf 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.14.1", + "autocomplete-plus": "2.14.2", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From d72376aac0bc560983bc489972d7ada420242136 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 09:16:53 -0700 Subject: [PATCH 18/61] :arrow_up: autocomplete-plus@2.15.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a92f48caf..b03c372e7 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.14.2", + "autocomplete-plus": "2.15.0", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From f5078a16e3f7fd532e7b21c1c43834034821c009 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:20:41 -0700 Subject: [PATCH 19/61] Remove default background style --- static/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/index.html b/static/index.html index 5559058dc..062a2db29 100644 --- a/static/index.html +++ b/static/index.html @@ -1,5 +1,5 @@ - + From 87db62a70b005969b84139f49eea23cd3da774aa Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:20:56 -0700 Subject: [PATCH 20/61] Remove empty title element --- static/index.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/static/index.html b/static/index.html index 062a2db29..84e8d57d4 100644 --- a/static/index.html +++ b/static/index.html @@ -1,8 +1,6 @@ - - From 22544688559761e48c38eaaa0293cf8e678e5e12 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:21:25 -0700 Subject: [PATCH 21/61] Show window as early as possible --- src/atom.coffee | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index 1cf63b397..c14e5517d 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -196,6 +196,10 @@ class Atom extends Model # # Call after this instance has been assigned to the `atom` global. initialize: -> + dimensions = @restoreWindowDimensions() + maximize = dimensions?.maximized and process.platform isnt 'darwin' + @displayWindow({maximize}) + sourceMapCache = {} window.onerror = => @@ -483,7 +487,10 @@ class Atom extends Model # Extended: Set the full screen state of the current window. setFullScreen: (fullScreen=false) -> ipc.send('call-window-method', 'setFullScreen', fullScreen) - if fullScreen then document.body.classList.add("fullscreen") else document.body.classList.remove("fullscreen") + if fullScreen + document.body.classList.add("fullscreen") + else + document.body.classList.remove("fullscreen") # Extended: Toggle the full screen state of the current window. toggleFullScreen: -> @@ -494,8 +501,9 @@ class Atom extends Model # This is done in a next tick to prevent a white flicker from occurring # if called synchronously. displayWindow: ({maximize}={}) -> + @show() + setImmediate => - @show() @focus() @setFullScreen(true) if @workspace.fullScreen @maximize() if maximize @@ -582,7 +590,6 @@ class Atom extends Model CommandInstaller.installApmCommand false, (error) -> console.warn error.message if error? - dimensions = @restoreWindowDimensions() @loadConfig() @keymaps.loadBundledKeymaps() @themes.loadBaseStylesheets() @@ -602,9 +609,6 @@ class Atom extends Model @openInitialEmptyEditorIfNecessary() - maximize = dimensions?.maximized and process.platform isnt 'darwin' - @displayWindow({maximize}) - unloadEditorWindow: -> return if not @project From 943df493005531e4bae0a8bd635357f8e17fa5b7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:53:04 -0700 Subject: [PATCH 22/61] Read/write window background in local storage --- src/atom.coffee | 12 ++++++++++-- static/index.js | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index c14e5517d..7ce43df66 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -282,7 +282,9 @@ class Atom extends Model deprecate "The atom.syntax global is deprecated. Use atom.grammars instead." @grammars - @disposables.add @packages.onDidActivateInitialPackages => @watchThemes() + @disposables.add @packages.onDidActivateInitialPackages => + @watchThemes() + @storeWindowBackground() Project = require './project' TextBuffer = require 'text-buffer' @@ -580,6 +582,11 @@ class Atom extends Model dimensions = @getWindowDimensions() @state.windowDimensions = dimensions if @isValidDimensions(dimensions) + storeWindowBackground: -> + workspaceElement = @views?.getView(@workspace) + backgroundColor = window.getComputedStyle(workspaceElement)['background-color'] + window.localStorage.setItem('atom:window-background-color', backgroundColor) + # Call this method when establishing a real application window. startEditorWindow: -> {safeMode} = @getLoadSettings() @@ -751,7 +758,8 @@ class Atom extends Model # Only reload stylesheets from non-theme packages for pack in @packages.getActivePackages() when pack.getType() isnt 'theme' pack.reloadStylesheets?() - null + @storeWindowBackground() + return # Notify the browser project of the window's current project path watchProjectPath: -> diff --git a/static/index.js b/static/index.js index 0a377044e..b2e580c80 100644 --- a/static/index.js +++ b/static/index.js @@ -43,6 +43,7 @@ window.onload = function() { } } + var setLoadTime = function(loadTime) { if (global.atom) { global.atom.loadTime = loadTime; @@ -162,3 +163,26 @@ var profileStartup = function(cacheDir, loadSettings, initialTime) { }); } } + +var setupWindowBackground = function() { + var backgroundColor = window.localStorage.getItem('atom:window-background-color'); + if (!backgroundColor) { + return; + } + + var backgroundStylesheet = document.createElement('style'); + backgroundStylesheet.type = 'text/css'; + backgroundStylesheet.innerText = 'html, body { background: ' + backgroundColor + ' }'; + document.head.appendChild(backgroundStylesheet); + + // Remove once the page loads + window.addEventListener("load", function loadWindow() { + window.removeEventListener("load", loadWindow, false); + setTimeout(function() { + backgroundStylesheet.remove(); + backgroundStylesheet = null; + }, 1000); + }, false); +} + +setupWindowBackground(); From ded24387008d0ef9d4d19397202f90ade5ae286e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:15:26 -0700 Subject: [PATCH 23/61] Add ; to inline style --- static/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/index.js b/static/index.js index b2e580c80..63fa503ee 100644 --- a/static/index.js +++ b/static/index.js @@ -172,7 +172,7 @@ var setupWindowBackground = function() { var backgroundStylesheet = document.createElement('style'); backgroundStylesheet.type = 'text/css'; - backgroundStylesheet.innerText = 'html, body { background: ' + backgroundColor + ' }'; + backgroundStylesheet.innerText = 'html, body { background: ' + backgroundColor + '; }'; document.head.appendChild(backgroundStylesheet); // Remove once the page loads From 87fd2ec188d80ea8148edcbe71b33f7d0e345542 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:19:33 -0700 Subject: [PATCH 24/61] Store background on unload --- src/atom.coffee | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index 7ce43df66..6b9beb64c 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -282,9 +282,7 @@ class Atom extends Model deprecate "The atom.syntax global is deprecated. Use atom.grammars instead." @grammars - @disposables.add @packages.onDidActivateInitialPackages => - @watchThemes() - @storeWindowBackground() + @disposables.add @packages.onDidActivateInitialPackages => @watchThemes() Project = require './project' TextBuffer = require 'text-buffer' @@ -619,6 +617,7 @@ class Atom extends Model unloadEditorWindow: -> return if not @project + @storeWindowBackground() @state.grammars = @grammars.serialize() @state.project = @project.serialize() @state.workspace = @workspace.serialize() @@ -758,7 +757,6 @@ class Atom extends Model # Only reload stylesheets from non-theme packages for pack in @packages.getActivePackages() when pack.getType() isnt 'theme' pack.reloadStylesheets?() - @storeWindowBackground() return # Notify the browser project of the window's current project path From a0abd9ebe438cd478f7925378ebbdc0c5fa0cd11 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:20:17 -0700 Subject: [PATCH 25/61] :art: --- static/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/static/index.js b/static/index.js index 63fa503ee..c00fe4c14 100644 --- a/static/index.js +++ b/static/index.js @@ -43,7 +43,6 @@ window.onload = function() { } } - var setLoadTime = function(loadTime) { if (global.atom) { global.atom.loadTime = loadTime; From 88c1c8404e0ac4fe6bfcab9dcef948d1d7399088 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:22:31 -0700 Subject: [PATCH 26/61] Display window after wiring up windor.onerror --- src/atom.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index 6b9beb64c..eec652f39 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -196,10 +196,6 @@ class Atom extends Model # # Call after this instance has been assigned to the `atom` global. initialize: -> - dimensions = @restoreWindowDimensions() - maximize = dimensions?.maximized and process.platform isnt 'darwin' - @displayWindow({maximize}) - sourceMapCache = {} window.onerror = => @@ -227,6 +223,10 @@ class Atom extends Model @disposables?.dispose() @disposables = new CompositeDisposable + dimensions = @restoreWindowDimensions() + maximize = dimensions?.maximized and process.platform isnt 'darwin' + @displayWindow({maximize}) + @setBodyPlatformClass() @loadTime = null From 104bece1191f04d1359df3586ae7662560ae2c07 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:47:56 -0700 Subject: [PATCH 27/61] Add restoreWindow helper --- src/atom.coffee | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index eec652f39..c963cd8a4 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -223,9 +223,8 @@ class Atom extends Model @disposables?.dispose() @disposables = new CompositeDisposable - dimensions = @restoreWindowDimensions() - maximize = dimensions?.maximized and process.platform isnt 'darwin' - @displayWindow({maximize}) + @restoreWindow() + @show() @setBodyPlatformClass() @@ -496,16 +495,17 @@ class Atom extends Model toggleFullScreen: -> @setFullScreen(not @isFullScreen()) - # Schedule the window to be shown and focused on the next tick. + # Restore the window to its previous dimensions. # - # This is done in a next tick to prevent a white flicker from occurring - # if called synchronously. - displayWindow: ({maximize}={}) -> - @show() + # Also restores the full screen and maximized state on the next tick to + # prevent resize glitches. + restoreWindow: -> + dimensions = @restoreWindowDimensions() + maximize = dimensions?.maximized and process.platform isnt 'darwin' setImmediate => @focus() - @setFullScreen(true) if @workspace.fullScreen + @setFullScreen(true) if @workspace?.fullScreen @maximize() if maximize # Get the dimensions of this window. From 10c65b53f98cf76a7c87607d5bc0b5fbb5de3dea Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:50:29 -0700 Subject: [PATCH 28/61] Don't store background for spec windows --- src/atom.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/atom.coffee b/src/atom.coffee index c963cd8a4..0e8f85f5e 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -581,6 +581,8 @@ class Atom extends Model @state.windowDimensions = dimensions if @isValidDimensions(dimensions) storeWindowBackground: -> + return if @inSpecMode() + workspaceElement = @views?.getView(@workspace) backgroundColor = window.getComputedStyle(workspaceElement)['background-color'] window.localStorage.setItem('atom:window-background-color', backgroundColor) From 8439099a06b97cd667aac1186f41e896aa714c3e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:54:01 -0700 Subject: [PATCH 29/61] Call show from within restoreWindow --- src/atom.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/atom.coffee b/src/atom.coffee index 0e8f85f5e..c8b9c718f 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -224,7 +224,6 @@ class Atom extends Model @disposables = new CompositeDisposable @restoreWindow() - @show() @setBodyPlatformClass() @@ -501,6 +500,8 @@ class Atom extends Model # prevent resize glitches. restoreWindow: -> dimensions = @restoreWindowDimensions() + @show() + maximize = dimensions?.maximized and process.platform isnt 'darwin' setImmediate => From 2707b09f00a55d3e8f52e9714c4682f27488a84b Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 16:54:48 -0700 Subject: [PATCH 30/61] restoreWindow -> displayWindow --- src/atom.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index c8b9c718f..b33461034 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -223,7 +223,7 @@ class Atom extends Model @disposables?.dispose() @disposables = new CompositeDisposable - @restoreWindow() + @displayWindow() @setBodyPlatformClass() @@ -494,11 +494,11 @@ class Atom extends Model toggleFullScreen: -> @setFullScreen(not @isFullScreen()) - # Restore the window to its previous dimensions. + # Restore the window to its previous dimensions and show it. # # Also restores the full screen and maximized state on the next tick to # prevent resize glitches. - restoreWindow: -> + displayWindow: -> dimensions = @restoreWindowDimensions() @show() From 1f9f17f9ff24d95e5234c40a9c9c7e4991b022e9 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 17:41:00 -0700 Subject: [PATCH 31/61] Don't display window in spec mode --- src/atom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom.coffee b/src/atom.coffee index b33461034..36e40e923 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -223,7 +223,7 @@ class Atom extends Model @disposables?.dispose() @disposables = new CompositeDisposable - @displayWindow() + @displayWindow() unless @inSpecMode() @setBodyPlatformClass() From 42004ce770c2d6f64c972ce68651e28752d2b011 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 17:48:40 -0700 Subject: [PATCH 32/61] Remove unneeded ? --- src/atom.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/atom.coffee b/src/atom.coffee index 36e40e923..702973cd9 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -584,7 +584,7 @@ class Atom extends Model storeWindowBackground: -> return if @inSpecMode() - workspaceElement = @views?.getView(@workspace) + workspaceElement = @views.getView(@workspace) backgroundColor = window.getComputedStyle(workspaceElement)['background-color'] window.localStorage.setItem('atom:window-background-color', backgroundColor) From fff546a1e5abeeda2542cba4cbbd6463903d31fe Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 09:47:10 -0700 Subject: [PATCH 33/61] Don't set background of spec windows --- static/index.js | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/static/index.js b/static/index.js index c00fe4c14..a656ac501 100644 --- a/static/index.js +++ b/static/index.js @@ -1,6 +1,9 @@ var fs = require('fs'); var path = require('path'); +var loadSettings = null; +var loadSettingsError = null; + window.onload = function() { try { var startTime = Date.now(); @@ -18,18 +21,13 @@ window.onload = function() { cacheDir = path.join(cacheDir, 'root'); } - var rawLoadSettings = decodeURIComponent(location.hash.substr(1)); - var loadSettings; - try { - loadSettings = JSON.parse(rawLoadSettings); - } catch (error) { - console.error("Failed to parse load settings: " + rawLoadSettings); - throw error; - } - // Normalize to make sure drive letter case is consistent on Windows process.resourcesPath = path.normalize(process.resourcesPath); + if (loadSettingsError) { + throw loadSettingsError; + } + var devMode = loadSettings.devMode || !loadSettings.resourcePath.startsWith(process.resourcesPath + path.sep); if (loadSettings.profileStartup) { @@ -163,7 +161,24 @@ var profileStartup = function(cacheDir, loadSettings, initialTime) { } } +var parseLoadSettings = function() { + var rawLoadSettings = decodeURIComponent(location.hash.substr(1)); + try { + loadSettings = JSON.parse(rawLoadSettings); + } catch (error) { + loadSettingsError = error; + } + + if (!loadSettings || typeof loadSettings !== 'object') { + loadSettings = {}; + } +} + var setupWindowBackground = function() { + if (loadSettings.isSpec) { + return; + } + var backgroundColor = window.localStorage.getItem('atom:window-background-color'); if (!backgroundColor) { return; @@ -184,4 +199,5 @@ var setupWindowBackground = function() { }, false); } +parseLoadSettings(); setupWindowBackground(); From f989981d194743dc860ba9009a17a1ecee23c081 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 09:50:11 -0700 Subject: [PATCH 34/61] Extract getCacheDirectory helper --- static/index.js | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/static/index.js b/static/index.js index a656ac501..7d9bf4467 100644 --- a/static/index.js +++ b/static/index.js @@ -15,12 +15,6 @@ window.onload = function() { // Ensure ATOM_HOME is always set before anything else is required setupAtomHome(); - var cacheDir = path.join(process.env.ATOM_HOME, 'compile-cache'); - // Use separate compile cache when sudo'ing as root to avoid permission issues - if (process.env.USER === 'root' && process.env.SUDO_USER && process.env.SUDO_USER !== process.env.USER) { - cacheDir = path.join(cacheDir, 'root'); - } - // Normalize to make sure drive letter case is consistent on Windows process.resourcesPath = path.normalize(process.resourcesPath); @@ -31,9 +25,9 @@ window.onload = function() { var devMode = loadSettings.devMode || !loadSettings.resourcePath.startsWith(process.resourcesPath + path.sep); if (loadSettings.profileStartup) { - profileStartup(cacheDir, loadSettings, Date.now() - startTime); + profileStartup(loadSettings, Date.now() - startTime); } else { - setupWindow(cacheDir, loadSettings); + setupWindow(loadSettings); setLoadTime(Date.now() - startTime); } } catch (error) { @@ -41,6 +35,15 @@ window.onload = function() { } } +var getCacheDirectory = function() { + var cacheDir = path.join(process.env.ATOM_HOME, 'compile-cache'); + // Use separate compile cache when sudo'ing as root to avoid permission issues + if (process.env.USER === 'root' && process.env.SUDO_USER && process.env.SUDO_USER !== process.env.USER) { + cacheDir = path.join(cacheDir, 'root'); + } + return cacheDir; +} + var setLoadTime = function(loadTime) { if (global.atom) { global.atom.loadTime = loadTime; @@ -57,7 +60,9 @@ var handleSetupError = function(error) { console.error(error.stack || error); } -var setupWindow = function(cacheDir, loadSettings) { +var setupWindow = function(loadSettings) { + var cacheDir = getCacheDirectory(); + setupCoffeeCache(cacheDir); ModuleCache = require('../src/module-cache'); @@ -131,16 +136,17 @@ var setupSourceMapCache = function(cacheDir) { var setupVmCompatibility = function() { var vm = require('vm'); - if (!vm.Script.createContext) + if (!vm.Script.createContext) { vm.Script.createContext = vm.createContext; + } } -var profileStartup = function(cacheDir, loadSettings, initialTime) { +var profileStartup = function(loadSettings, initialTime) { var profile = function() { console.profile('startup'); try { var startTime = Date.now() - setupWindow(cacheDir, loadSettings); + setupWindow(loadSettings); setLoadTime(Date.now() - startTime + initialTime); } catch (error) { handleSetupError(error); From f2c50bfd9e6a9a7f12af73afc8c692dbbe4f2292 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 10:00:34 -0700 Subject: [PATCH 35/61] Remove unneeded loadSettings validation --- static/index.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/static/index.js b/static/index.js index 7d9bf4467..b0dd1c3c1 100644 --- a/static/index.js +++ b/static/index.js @@ -174,14 +174,10 @@ var parseLoadSettings = function() { } catch (error) { loadSettingsError = error; } - - if (!loadSettings || typeof loadSettings !== 'object') { - loadSettings = {}; - } } var setupWindowBackground = function() { - if (loadSettings.isSpec) { + if (loadSettings && loadSettings.isSpec) { return; } From 41d3764189d1d9737eb5b4408231be624e3997eb Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 10:09:34 -0700 Subject: [PATCH 36/61] :art: --- src/atom.coffee | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/atom.coffee b/src/atom.coffee index 702973cd9..0d029b61d 100644 --- a/src/atom.coffee +++ b/src/atom.coffee @@ -502,12 +502,10 @@ class Atom extends Model dimensions = @restoreWindowDimensions() @show() - maximize = dimensions?.maximized and process.platform isnt 'darwin' - setImmediate => @focus() @setFullScreen(true) if @workspace?.fullScreen - @maximize() if maximize + @maximize() if dimensions?.maximized and process.platform isnt 'darwin' # Get the dimensions of this window. # From 9f2faa086b5de07e13620ad3fab8142cec3e4f1a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 10:11:46 -0700 Subject: [PATCH 37/61] Add back raw load settings logging --- static/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/static/index.js b/static/index.js index b0dd1c3c1..ef61e8bce 100644 --- a/static/index.js +++ b/static/index.js @@ -172,6 +172,7 @@ var parseLoadSettings = function() { try { loadSettings = JSON.parse(rawLoadSettings); } catch (error) { + console.error("Failed to parse load settings: " + rawLoadSettings); loadSettingsError = error; } } From 1edeb7b56869f9489b51bfd3fd4a5ddae3c7bd76 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 09:50:12 -0700 Subject: [PATCH 38/61] Save list of open windows as windows are added/removed --- src/browser/atom-application.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 0e7ff9f4d..20ebf84f9 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -100,6 +100,7 @@ class AtomApplication removeWindow: (window) -> @windows.splice @windows.indexOf(window), 1 @applicationMenu?.enableWindowSpecificItems(false) if @windows.length is 0 + @saveState() # Public: Adds the {AtomWindow} to the global window list. addWindow: (window) -> @@ -114,6 +115,7 @@ class AtomApplication window.browserWindow.once 'closed', => @lastFocusedWindow = null if window is @lastFocusedWindow window.browserWindow.removeListener 'focus', focusHandler + window.browserWindow.webContents.once 'did-finish-load', => @saveState() # Creates server to listen for additional atom application launches. # @@ -202,9 +204,6 @@ class AtomApplication app.on 'window-all-closed', -> app.quit() if process.platform in ['win32', 'linux'] - app.on 'before-quit', => - @saveState() - app.on 'will-quit', => @killAllProcesses() @deleteSocketFile() From 725a564e626eb98802c54f82c618aea3dd784507 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 10:44:58 -0700 Subject: [PATCH 39/61] Avoid saving windows state when quitting on windows/linux --- src/browser/atom-application.coffee | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 20ebf84f9..3a36b8b72 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -99,7 +99,11 @@ class AtomApplication # Public: Removes the {AtomWindow} from the global window list. removeWindow: (window) -> @windows.splice @windows.indexOf(window), 1 - @applicationMenu?.enableWindowSpecificItems(false) if @windows.length is 0 + if @windows.length is 0 + @applicationMenu?.enableWindowSpecificItems(false) + if process.platform in ['win32', 'linux'] + app.quit() + return @saveState() # Public: Adds the {AtomWindow} to the global window list. @@ -201,9 +205,6 @@ class AtomApplication @openPathOnEvent('application:open-your-stylesheet', 'atom://.atom/stylesheet') @openPathOnEvent('application:open-license', path.join(process.resourcesPath, 'LICENSE.md')) - app.on 'window-all-closed', -> - app.quit() if process.platform in ['win32', 'linux'] - app.on 'will-quit', => @killAllProcesses() @deleteSocketFile() From 62c406f4507c768eebae78ed6ae766517ebe482b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 11:10:01 -0700 Subject: [PATCH 40/61] Save open window state when a window loses focus --- src/browser/atom-application.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 3a36b8b72..d7a8b0b5b 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -115,10 +115,13 @@ class AtomApplication unless window.isSpec focusHandler = => @lastFocusedWindow = window + blurHandler = => @saveState() window.browserWindow.on 'focus', focusHandler + window.browserWindow.on 'blur', blurHandler window.browserWindow.once 'closed', => @lastFocusedWindow = null if window is @lastFocusedWindow window.browserWindow.removeListener 'focus', focusHandler + window.browserWindow.removeListener 'blur', blurHandler window.browserWindow.webContents.once 'did-finish-load', => @saveState() # Creates server to listen for additional atom application launches. From 8ddfa8690b9c8825409627990abc9311853eb96f Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 7 May 2015 15:31:44 -0700 Subject: [PATCH 41/61] Save window state when atom.exit() is called --- src/browser/atom-application.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index d7a8b0b5b..deccae4ee 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -213,6 +213,7 @@ class AtomApplication @deleteSocketFile() app.on 'will-exit', => + @saveState() @killAllProcesses() @deleteSocketFile() From 6026c78d9e0acf2a67e56dca4eba81fb97f1dd70 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Mon, 11 May 2015 09:20:07 -0700 Subject: [PATCH 42/61] Don't save window state when closing spec windows --- src/browser/atom-application.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index deccae4ee..b423544cc 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -104,7 +104,7 @@ class AtomApplication if process.platform in ['win32', 'linux'] app.quit() return - @saveState() + @saveState() unless window.isSpec # Public: Adds the {AtomWindow} to the global window list. addWindow: (window) -> From dabf5b5f693545bfb3cad36f82595d3515e4d040 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 10:46:14 -0700 Subject: [PATCH 43/61] Don't save windows state when apm test finishes --- src/browser/atom-application.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index b423544cc..af6a45763 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -213,7 +213,7 @@ class AtomApplication @deleteSocketFile() app.on 'will-exit', => - @saveState() + @saveState() unless @windows.every (window) -> window.isSpec @killAllProcesses() @deleteSocketFile() @@ -426,8 +426,8 @@ class AtomApplication saveState: -> states = [] for window in @windows - if loadSettings = window.getLoadSettings() - unless loadSettings.isSpec + unless window.isSpec + if loadSettings = window.getLoadSettings() states.push(initialPaths: loadSettings.initialPaths) @storageFolder.store('application.json', states) From 1abca560cd62c27d555f4268891b054433984085 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 11:26:56 -0700 Subject: [PATCH 44/61] :arrow_up: autocomplete-plus@2.15.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b03c372e7..3614b5f26 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.1", - "autocomplete-plus": "2.15.0", + "autocomplete-plus": "2.15.1", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From a937dc2fd4c87c06f7fbf25244564c07905b580a Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 11:30:35 -0700 Subject: [PATCH 45/61] Dont remove symlinked autocomplete-plus packages --- spec/package-manager-spec.coffee | 9 ++++++--- src/package-manager.coffee | 4 +--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/spec/package-manager-spec.coffee b/spec/package-manager-spec.coffee index 1cd961936..1244ab984 100644 --- a/spec/package-manager-spec.coffee +++ b/spec/package-manager-spec.coffee @@ -845,13 +845,16 @@ describe "PackageManager", -> jasmine.unspy(atom.packages, 'uninstallAutocompletePlus') + afterEach -> + try + fs.unlink autocompletePlusPath, -> + it "removes the packages", -> atom.packages.loadPackages() waitsFor -> - not fs.isDirectorySync(autocompleteCSSPath) and - not fs.isSymbolicLinkSync(autocompletePlusPath) + not fs.isDirectorySync(autocompleteCSSPath) runs -> expect(fs.isDirectorySync(autocompleteCSSPath)).toBe false - expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe false + expect(fs.isSymbolicLinkSync(autocompletePlusPath)).toBe true diff --git a/src/package-manager.coffee b/src/package-manager.coffee index 1262aa59e..606f72eda 100644 --- a/src/package-manager.coffee +++ b/src/package-manager.coffee @@ -443,9 +443,7 @@ class PackageManager Promise.all([symlinkPromise, dirPromise]).then (values) -> [isSymLink, isDir] = values - if isSymLink - fs.unlink directory, -> - else if isDir + if not isSymLink and isDir fs.remove directory, -> if Grim.includeDeprecatedAPIs From bcd20a7cd27f8efb795485efa641c6c84808fd94 Mon Sep 17 00:00:00 2001 From: Michael Bolin Date: Wed, 13 May 2015 15:06:23 -0700 Subject: [PATCH 46/61] Do not create an AutoUpdateManager when in test mode. --- src/browser/atom-application.coffee | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index af6a45763..3e1f19f17 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -1,7 +1,6 @@ AtomWindow = require './atom-window' ApplicationMenu = require './application-menu' AtomProtocolHandler = require './atom-protocol-handler' -AutoUpdateManager = require './auto-update-manager' BrowserWindow = require 'browser-window' StorageFolder = require '../storage-folder' Menu = require 'menu' @@ -71,7 +70,9 @@ class AtomApplication @pathsToOpen ?= [] @windows = [] - @autoUpdateManager = new AutoUpdateManager(@version) + unless options.test + AutoUpdateManager = require './auto-update-manager' + @autoUpdateManager = new AutoUpdateManager(@version) @applicationMenu = new ApplicationMenu(@version) @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @@ -110,8 +111,9 @@ class AtomApplication addWindow: (window) -> @windows.push window @applicationMenu?.addWindow(window.browserWindow) - window.once 'window:loaded', => - @autoUpdateManager.emitUpdateAvailableEvent(window) + if @autoUpdateManager + window.once 'window:loaded', => + @autoUpdateManager.emitUpdateAvailableEvent(window) unless window.isSpec focusHandler = => @lastFocusedWindow = window @@ -185,8 +187,8 @@ class AtomApplication @on 'application:report-issue', -> require('shell').openExternal('https://github.com/atom/atom/blob/master/CONTRIBUTING.md#submitting-issues') @on 'application:search-issues', -> require('shell').openExternal('https://github.com/issues?q=+is%3Aissue+user%3Aatom') - @on 'application:install-update', -> @autoUpdateManager.install() - @on 'application:check-for-update', => @autoUpdateManager.check() + @on 'application:install-update', -> @autoUpdateManager?.install() + @on 'application:check-for-update', => @autoUpdateManager?.check() if process.platform is 'darwin' @on 'application:about', -> Menu.sendActionToFirstResponder('orderFrontStandardAboutPanel:') From 356fa4ac24888221063d39657f938c867ea6f2f2 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:21:20 -0700 Subject: [PATCH 47/61] :art: --- src/browser/atom-application.coffee | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 3e1f19f17..0080e3639 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -73,6 +73,7 @@ class AtomApplication unless options.test AutoUpdateManager = require './auto-update-manager' @autoUpdateManager = new AutoUpdateManager(@version) + @applicationMenu = new ApplicationMenu(@version) @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @@ -111,7 +112,8 @@ class AtomApplication addWindow: (window) -> @windows.push window @applicationMenu?.addWindow(window.browserWindow) - if @autoUpdateManager + + if @autoUpdateManager? window.once 'window:loaded', => @autoUpdateManager.emitUpdateAvailableEvent(window) @@ -187,8 +189,9 @@ class AtomApplication @on 'application:report-issue', -> require('shell').openExternal('https://github.com/atom/atom/blob/master/CONTRIBUTING.md#submitting-issues') @on 'application:search-issues', -> require('shell').openExternal('https://github.com/issues?q=+is%3Aissue+user%3Aatom') - @on 'application:install-update', -> @autoUpdateManager?.install() - @on 'application:check-for-update', => @autoUpdateManager?.check() + if @autoUpdateManager? + @on 'application:install-update', => @autoUpdateManager.install() + @on 'application:check-for-update', => @autoUpdateManager.check() if process.platform is 'darwin' @on 'application:about', -> Menu.sendActionToFirstResponder('orderFrontStandardAboutPanel:') From 720deff1cdb30c426a73ebaca0ab5e28d48e8155 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:26:23 -0700 Subject: [PATCH 48/61] :arrow_up: grim@1.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3614b5f26..855256bfb 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "fstream": "0.1.24", "fuzzaldrin": "^2.1", "git-utils": "^3.0.0", - "grim": "1.4.0", + "grim": "1.4.1", "hosted-git-info": "^2.1.2", "jasmine-json": "~0.0", "jasmine-tagged": "^1.1.4", From c8d6d883f3356d1fdb1d78c672054e6693337265 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:30:00 -0700 Subject: [PATCH 49/61] :arrow_up: deprecation-cop@0.47 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 855256bfb..19b6a19e8 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "bookmarks": "0.35.0", "bracket-matcher": "0.74.0", "command-palette": "0.35.0", - "deprecation-cop": "0.46.0", + "deprecation-cop": "0.47.0", "dev-live-reload": "0.46.0", "encoding-selector": "0.20.0", "exception-reporting": "0.24.0", From 2195b1a38d7e28b291199b21e0f3a6595b8ca59c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:33:56 -0700 Subject: [PATCH 50/61] Pass auto update manager into application menu --- src/browser/application-menu.coffee | 7 +++---- src/browser/atom-application.coffee | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/browser/application-menu.coffee b/src/browser/application-menu.coffee index a845c682f..7fc548892 100644 --- a/src/browser/application-menu.coffee +++ b/src/browser/application-menu.coffee @@ -9,11 +9,10 @@ _ = require 'underscore-plus' # and maintain the state of all menu items. module.exports = class ApplicationMenu - constructor: (@version) -> + constructor: (@version, @autoUpdateManager) -> @windowTemplates = new WeakMap() @setActiveTemplate(@getDefaultTemplate()) - global.atomApplication.autoUpdateManager.on 'state-changed', (state) => - @showUpdateMenuItem(state) + @autoUpdateManager?.on 'state-changed', (state) => @showUpdateMenuItem(state) # Public: Updates the entire menu with the given keybindings. # @@ -33,7 +32,7 @@ class ApplicationMenu @menu = Menu.buildFromTemplate(_.deepClone(template)) Menu.setApplicationMenu(@menu) - @showUpdateMenuItem(global.atomApplication.autoUpdateManager.getState()) + @showUpdateMenuItem(@autoUpdateManager.getState()) if @autoUpdateManager? # Register a BrowserWindow with this application menu. addWindow: (window) -> diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 0080e3639..0dc269080 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -74,7 +74,7 @@ class AtomApplication AutoUpdateManager = require './auto-update-manager' @autoUpdateManager = new AutoUpdateManager(@version) - @applicationMenu = new ApplicationMenu(@version) + @applicationMenu = new ApplicationMenu(@version, @autoUpdateManager) @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @listenForArgumentsFromNewProcess() From d319d17dcdf6ce86dbd29adda226f240a9142a16 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:35:27 -0700 Subject: [PATCH 51/61] Always call showUpdateMenuItem --- src/browser/application-menu.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/application-menu.coffee b/src/browser/application-menu.coffee index 7fc548892..e3885de00 100644 --- a/src/browser/application-menu.coffee +++ b/src/browser/application-menu.coffee @@ -32,7 +32,7 @@ class ApplicationMenu @menu = Menu.buildFromTemplate(_.deepClone(template)) Menu.setApplicationMenu(@menu) - @showUpdateMenuItem(@autoUpdateManager.getState()) if @autoUpdateManager? + @showUpdateMenuItem(@autoUpdateManager?.getState()) # Register a BrowserWindow with this application menu. addWindow: (window) -> From cb223fa03e9015fbfb5bb8a46a535d12d4690d7c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:55:17 -0700 Subject: [PATCH 52/61] Don't check for updates in test mode --- src/browser/application-menu.coffee | 4 ++-- src/browser/atom-application.coffee | 16 ++++++---------- src/browser/auto-update-manager.coffee | 4 ++-- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/browser/application-menu.coffee b/src/browser/application-menu.coffee index e3885de00..74da80e43 100644 --- a/src/browser/application-menu.coffee +++ b/src/browser/application-menu.coffee @@ -12,7 +12,7 @@ class ApplicationMenu constructor: (@version, @autoUpdateManager) -> @windowTemplates = new WeakMap() @setActiveTemplate(@getDefaultTemplate()) - @autoUpdateManager?.on 'state-changed', (state) => @showUpdateMenuItem(state) + @autoUpdateManager.on 'state-changed', (state) => @showUpdateMenuItem(state) # Public: Updates the entire menu with the given keybindings. # @@ -32,7 +32,7 @@ class ApplicationMenu @menu = Menu.buildFromTemplate(_.deepClone(template)) Menu.setApplicationMenu(@menu) - @showUpdateMenuItem(@autoUpdateManager?.getState()) + @showUpdateMenuItem(@autoUpdateManager.getState()) # Register a BrowserWindow with this application menu. addWindow: (window) -> diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 0dc269080..09738b452 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -1,6 +1,7 @@ AtomWindow = require './atom-window' ApplicationMenu = require './application-menu' AtomProtocolHandler = require './atom-protocol-handler' +AutoUpdateManager = require './auto-update-manager' BrowserWindow = require 'browser-window' StorageFolder = require '../storage-folder' Menu = require 'menu' @@ -70,10 +71,7 @@ class AtomApplication @pathsToOpen ?= [] @windows = [] - unless options.test - AutoUpdateManager = require './auto-update-manager' - @autoUpdateManager = new AutoUpdateManager(@version) - + @autoUpdateManager = new AutoUpdateManager(@version, options.test) @applicationMenu = new ApplicationMenu(@version, @autoUpdateManager) @atomProtocolHandler = new AtomProtocolHandler(@resourcePath, @safeMode) @@ -113,9 +111,8 @@ class AtomApplication @windows.push window @applicationMenu?.addWindow(window.browserWindow) - if @autoUpdateManager? - window.once 'window:loaded', => - @autoUpdateManager.emitUpdateAvailableEvent(window) + window.once 'window:loaded', => + @autoUpdateManager.emitUpdateAvailableEvent(window) unless window.isSpec focusHandler = => @lastFocusedWindow = window @@ -189,9 +186,8 @@ class AtomApplication @on 'application:report-issue', -> require('shell').openExternal('https://github.com/atom/atom/blob/master/CONTRIBUTING.md#submitting-issues') @on 'application:search-issues', -> require('shell').openExternal('https://github.com/issues?q=+is%3Aissue+user%3Aatom') - if @autoUpdateManager? - @on 'application:install-update', => @autoUpdateManager.install() - @on 'application:check-for-update', => @autoUpdateManager.check() + @on 'application:install-update', => @autoUpdateManager.install() + @on 'application:check-for-update', => @autoUpdateManager.check() if process.platform is 'darwin' @on 'application:about', -> Menu.sendActionToFirstResponder('orderFrontStandardAboutPanel:') diff --git a/src/browser/auto-update-manager.coffee b/src/browser/auto-update-manager.coffee index 358390889..7c8613be5 100644 --- a/src/browser/auto-update-manager.coffee +++ b/src/browser/auto-update-manager.coffee @@ -15,7 +15,7 @@ module.exports = class AutoUpdateManager _.extend @prototype, EventEmitter.prototype - constructor: (@version) -> + constructor: (@version, @testMode) -> @state = IdleState if process.platform is 'win32' # Squirrel for Windows can't handle query params @@ -80,7 +80,7 @@ class AutoUpdateManager autoUpdater.once 'update-not-available', @onUpdateNotAvailable autoUpdater.once 'error', @onUpdateError - autoUpdater.checkForUpdates() + autoUpdater.checkForUpdates() unless @testMode install: -> autoUpdater.quitAndInstall() From 2bbdd9446db83c21fc3198f8e5749fa547aa193e Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:55:56 -0700 Subject: [PATCH 53/61] :art: --- src/browser/atom-application.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/src/browser/atom-application.coffee b/src/browser/atom-application.coffee index 09738b452..afc811144 100644 --- a/src/browser/atom-application.coffee +++ b/src/browser/atom-application.coffee @@ -110,7 +110,6 @@ class AtomApplication addWindow: (window) -> @windows.push window @applicationMenu?.addWindow(window.browserWindow) - window.once 'window:loaded', => @autoUpdateManager.emitUpdateAvailableEvent(window) From 6c81f7233b33505d1377b6e84a9318e2e2408d2d Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 13 May 2015 15:58:14 -0700 Subject: [PATCH 54/61] Don't quit and install in test mode --- src/browser/auto-update-manager.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/auto-update-manager.coffee b/src/browser/auto-update-manager.coffee index 7c8613be5..654a8de67 100644 --- a/src/browser/auto-update-manager.coffee +++ b/src/browser/auto-update-manager.coffee @@ -83,7 +83,7 @@ class AutoUpdateManager autoUpdater.checkForUpdates() unless @testMode install: -> - autoUpdater.quitAndInstall() + autoUpdater.quitAndInstall() unless @testMode onUpdateNotAvailable: => autoUpdater.removeListener 'error', @onUpdateError From ddc603e4b8bf6c1d7aa3c11b8cd6682d9d73d176 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 16:31:19 -0700 Subject: [PATCH 55/61] :arrow_up: autocomplete-html@0.7.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19b6a19e8..5cfd5b6d0 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "autocomplete-atom-api": "0.9.0", "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", - "autocomplete-html": "0.7.1", + "autocomplete-html": "0.7.2", "autocomplete-plus": "2.15.1", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", From fe2cfff7a67c7e5a800d7fd2467ba28621bdce9c Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 17:00:30 -0700 Subject: [PATCH 56/61] Allocate fewer objects for fold attributes in DisplayBuffer --- src/display-buffer.coffee | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index f4c078b17..37120dd83 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -42,6 +42,7 @@ class DisplayBuffer extends Model @disposables.add @buffer.onDidUpdateMarkers @handleBufferMarkersUpdated @disposables.add @buffer.onDidCreateMarker @handleBufferMarkerCreated @updateAllScreenLines() + @foldMarkerAttributes = Object.freeze({class: 'fold', displayBufferId: @id}) @createFoldForMarker(marker) for marker in @buffer.findMarkers(@getFoldMarkerAttributes()) subscribeToScopedConfigSettings: => @@ -1075,8 +1076,11 @@ class DisplayBuffer extends Model findFoldMarkers: (attributes) -> @buffer.findMarkers(@getFoldMarkerAttributes(attributes)) - getFoldMarkerAttributes: (attributes={}) -> - _.extend(attributes, class: 'fold', displayBufferId: @id) + getFoldMarkerAttributes: (attributes) -> + if attributes + _.extend(attributes, @foldMarkerAttributes) + else + @foldMarkerAttributes pauseMarkerChangeEvents: -> marker.pauseChangeEvents() for marker in @getMarkers() From e73f47dfa30ede157c29605a798cc2a7f87e8b47 Mon Sep 17 00:00:00 2001 From: simurai Date: Thu, 14 May 2015 10:09:30 +0900 Subject: [PATCH 57/61] :arrow_up: status-bar@0.72.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5cfd5b6d0..3c2bf1c69 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "settings-view": "0.199.0", "snippets": "0.89.0", "spell-check": "0.58.0", - "status-bar": "0.71.0", + "status-bar": "0.72.0", "styleguide": "0.44.0", "symbols-view": "0.96.0", "tabs": "0.68.0", From 80d41c70ee355b472ba1ef3202ffd5d4c4469f2f Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 18:15:46 -0700 Subject: [PATCH 58/61] :arrow_up: metrics@0.46.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3c2bf1c69..33a6811cc 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "keybinding-resolver": "0.32.0", "link": "0.30.0", "markdown-preview": "0.148.0", - "metrics": "0.45.0", + "metrics": "0.46.0", "notifications": "0.43.0", "open-on-github": "0.36.0", "package-generator": "0.39.0", From 0a0c42850b64124a077d3258ead6eade9e878272 Mon Sep 17 00:00:00 2001 From: Ben Ogle Date: Wed, 13 May 2015 18:18:57 -0700 Subject: [PATCH 59/61] :arrow_up: autocomplete-plus@2.15.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33a6811cc..c2bdb47f5 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "autocomplete-css": "0.7.2", "autocomplete-emojis": "2.2.2", "autocomplete-html": "0.7.2", - "autocomplete-plus": "2.15.1", + "autocomplete-plus": "2.15.2", "autocomplete-snippets": "1.6.1", "autoflow": "0.23.0", "autosave": "0.20.0", From 19d905606b8572397c22e9ec8aa3194d3f9fdf67 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 19:59:25 -0700 Subject: [PATCH 60/61] Avoid double computation of screen lines when opening files Previously, instantiating a TextEditor would always compute compute screen lines twice: once when the DisplayBuffer was instantiated, and once when the 'invisibles' property was set on the DisplayBuffer. --- spec/text-editor-spec.coffee | 10 +++---- spec/tokenized-buffer-spec.coffee | 13 +++++---- src/display-buffer.coffee | 11 ++++---- src/text-editor.coffee | 29 ++----------------- src/tokenized-buffer.coffee | 47 +++++++++++++++++++++++-------- 5 files changed, 54 insertions(+), 56 deletions(-) diff --git a/spec/text-editor-spec.coffee b/spec/text-editor-spec.coffee index dd6b69f26..d1d311088 100644 --- a/spec/text-editor-spec.coffee +++ b/spec/text-editor-spec.coffee @@ -36,23 +36,21 @@ describe "TextEditor", -> it "preserves the invisibles setting", -> atom.config.set('editor.showInvisibles', true) - previousInvisibles = editor.displayBuffer.invisibles + previousInvisibles = editor.tokenizedLineForScreenRow(0).invisibles editor2 = editor.testSerialization() - expect(editor2.displayBuffer.invisibles).toEqual previousInvisibles - expect(editor2.displayBuffer.tokenizedBuffer.invisibles).toEqual previousInvisibles + expect(previousInvisibles).toBeDefined() + expect(editor2.displayBuffer.tokenizedLineForScreenRow(0).invisibles).toEqual previousInvisibles it "updates invisibles if the settings have changed between serialization and deserialization", -> atom.config.set('editor.showInvisibles', true) - previousInvisibles = editor.displayBuffer.invisibles state = editor.serialize() atom.config.set('editor.invisibles', eol: '?') editor2 = TextEditor.deserialize(state) - expect(editor2.displayBuffer.invisibles.eol).toBe '?' - expect(editor2.displayBuffer.tokenizedBuffer.invisibles.eol).toBe '?' + expect(editor.tokenizedLineForScreenRow(0).invisibles.eol).toBe '?' describe "when the editor is constructed with an initialLine option", -> it "positions the cursor on the specified line", -> diff --git a/spec/tokenized-buffer-spec.coffee b/spec/tokenized-buffer-spec.coffee index 3cd776c2b..9d92335af 100644 --- a/spec/tokenized-buffer-spec.coffee +++ b/spec/tokenized-buffer-spec.coffee @@ -611,7 +611,8 @@ describe "TokenizedBuffer", -> tokenizedBuffer = new TokenizedBuffer({buffer}) fullyTokenize(tokenizedBuffer) - tokenizedBuffer.setInvisibles(space: 'S', tab: 'T') + atom.config.set("editor.showInvisibles", true) + atom.config.set("editor.invisibles", space: 'S', tab: 'T') fullyTokenize(tokenizedBuffer) expect(tokenizedBuffer.tokenizedLineForRow(0).text).toBe "SST Sa line with tabsTand T spacesSTS" @@ -623,7 +624,7 @@ describe "TokenizedBuffer", -> tokenizedBuffer = new TokenizedBuffer({buffer}) atom.config.set('editor.showInvisibles', true) - tokenizedBuffer.setInvisibles(cr: 'R', eol: 'N') + atom.config.set("editor.invisibles", cr: 'R', eol: 'N') fullyTokenize(tokenizedBuffer) expect(tokenizedBuffer.tokenizedLineForRow(0).endOfLineInvisibles).toEqual ['R', 'N'] @@ -634,7 +635,7 @@ describe "TokenizedBuffer", -> expect(left.endOfLineInvisibles).toBe null expect(right.endOfLineInvisibles).toEqual ['R', 'N'] - tokenizedBuffer.setInvisibles(cr: 'R', eol: false) + atom.config.set("editor.invisibles", cr: 'R', eol: false) expect(tokenizedBuffer.tokenizedLineForRow(0).endOfLineInvisibles).toEqual ['R'] expect(tokenizedBuffer.tokenizedLineForRow(1).endOfLineInvisibles).toEqual [] @@ -688,7 +689,8 @@ describe "TokenizedBuffer", -> it "sets leading and trailing whitespace correctly on a line with invisible characters that is copied", -> buffer.setText(" \t a line with tabs\tand \tspaces \t ") - tokenizedBuffer.setInvisibles(space: 'S', tab: 'T') + atom.config.set("editor.showInvisibles", true) + atom.config.set("editor.invisibles", space: 'S', tab: 'T') fullyTokenize(tokenizedBuffer) line = tokenizedBuffer.tokenizedLineForRow(0).copy() @@ -696,7 +698,8 @@ describe "TokenizedBuffer", -> expect(line.tokens[line.tokens.length - 1].firstTrailingWhitespaceIndex).toBe 0 it "sets the ::firstNonWhitespaceIndex and ::firstTrailingWhitespaceIndex correctly when tokens are split for soft-wrapping", -> - tokenizedBuffer.setInvisibles(space: 'S') + atom.config.set("editor.showInvisibles", true) + atom.config.set("editor.invisibles", space: 'S') buffer.setText(" token ") fullyTokenize(tokenizedBuffer) token = tokenizedBuffer.tokenizedLines[0].tokens[0] diff --git a/src/display-buffer.coffee b/src/display-buffer.coffee index 37120dd83..d5a893fe3 100644 --- a/src/display-buffer.coffee +++ b/src/display-buffer.coffee @@ -24,13 +24,13 @@ class DisplayBuffer extends Model horizontalScrollMargin: 6 scopedCharacterWidthsChangeCount: 0 - constructor: ({tabLength, @editorWidthInChars, @tokenizedBuffer, buffer, @invisibles}={}) -> + constructor: ({tabLength, @editorWidthInChars, @tokenizedBuffer, buffer, ignoreInvisibles}={}) -> super @emitter = new Emitter @disposables = new CompositeDisposable - @tokenizedBuffer ?= new TokenizedBuffer({tabLength, buffer, @invisibles}) + @tokenizedBuffer ?= new TokenizedBuffer({tabLength, buffer, ignoreInvisibles}) @buffer = @tokenizedBuffer.buffer @charWidthsByScope = {} @markers = {} @@ -87,14 +87,13 @@ class DisplayBuffer extends Model scrollTop: @scrollTop scrollLeft: @scrollLeft tokenizedBuffer: @tokenizedBuffer.serialize() - invisibles: _.clone(@invisibles) deserializeParams: (params) -> params.tokenizedBuffer = TokenizedBuffer.deserialize(params.tokenizedBuffer) params copy: -> - newDisplayBuffer = new DisplayBuffer({@buffer, tabLength: @getTabLength(), @invisibles}) + newDisplayBuffer = new DisplayBuffer({@buffer, tabLength: @getTabLength()}) newDisplayBuffer.setScrollTop(@getScrollTop()) newDisplayBuffer.setScrollLeft(@getScrollLeft()) @@ -429,8 +428,8 @@ class DisplayBuffer extends Model setTabLength: (tabLength) -> @tokenizedBuffer.setTabLength(tabLength) - setInvisibles: (@invisibles) -> - @tokenizedBuffer.setInvisibles(@invisibles) + setIgnoreInvisibles: (ignoreInvisibles) -> + @tokenizedBuffer.setIgnoreInvisibles(ignoreInvisibles) setSoftWrapped: (softWrapped) -> if softWrapped isnt @softWrapped diff --git a/src/text-editor.coffee b/src/text-editor.coffee index ac7c7d4f2..d2bd77522 100644 --- a/src/text-editor.coffee +++ b/src/text-editor.coffee @@ -84,12 +84,10 @@ class TextEditor extends Model @selections = [] buffer ?= new TextBuffer - @displayBuffer ?= new DisplayBuffer({buffer, tabLength, softWrapped}) + @displayBuffer ?= new DisplayBuffer({buffer, tabLength, softWrapped, ignoreInvisibles: @mini}) @buffer = @displayBuffer.buffer @softTabs = @usesSoftTabs() ? @softTabs ? atom.config.get('editor.softTabs') ? true - @updateInvisibles() - for marker in @findMarkers(@getSelectionMarkerAttributes()) marker.setProperties(preserveFolds: true) @addSelection(marker) @@ -170,21 +168,9 @@ class TextEditor extends Model @subscribe @displayBuffer.onDidAddDecoration (decoration) => @emit 'decoration-added', decoration @subscribe @displayBuffer.onDidRemoveDecoration (decoration) => @emit 'decoration-removed', decoration - @subscribeToScopedConfigSettings() - - subscribeToScopedConfigSettings: -> - @scopedConfigSubscriptions?.dispose() - @scopedConfigSubscriptions = subscriptions = new CompositeDisposable - - scopeDescriptor = @getRootScopeDescriptor() - - subscriptions.add atom.config.onDidChange 'editor.showInvisibles', scope: scopeDescriptor, => @updateInvisibles() - subscriptions.add atom.config.onDidChange 'editor.invisibles', scope: scopeDescriptor, => @updateInvisibles() - destroyed: -> @unsubscribe() if includeDeprecatedAPIs @disposables.dispose() - @scopedConfigSubscriptions.dispose() selection.destroy() for selection in @getSelections() @buffer.release() @displayBuffer.destroy() @@ -488,7 +474,7 @@ class TextEditor extends Model setMini: (mini) -> if mini isnt @mini @mini = mini - @updateInvisibles() + @displayBuffer.setIgnoreInvisibles(@mini) @emitter.emit 'did-change-mini', @mini @mini @@ -2779,15 +2765,6 @@ class TextEditor extends Model shouldAutoIndentOnPaste: -> atom.config.get("editor.autoIndentOnPaste", scope: @getRootScopeDescriptor()) - shouldShowInvisibles: -> - not @mini and atom.config.get('editor.showInvisibles', scope: @getRootScopeDescriptor()) - - updateInvisibles: -> - if @shouldShowInvisibles() - @displayBuffer.setInvisibles(atom.config.get('editor.invisibles', scope: @getRootScopeDescriptor())) - else - @displayBuffer.setInvisibles(null) - ### Section: Event Handlers ### @@ -2796,8 +2773,6 @@ class TextEditor extends Model @softTabs = @usesSoftTabs() ? @softTabs handleGrammarChange: -> - @updateInvisibles() - @subscribeToScopedConfigSettings() @unfoldAll() @emit 'grammar-changed' if includeDeprecatedAPIs @emitter.emit 'did-change-grammar', @getGrammar() diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index d9f1bcba7..b72e712a1 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -20,8 +20,9 @@ class TokenizedBuffer extends Model chunkSize: 50 invalidRows: null visible: false + configSettings: null - constructor: ({@buffer, @tabLength, @invisibles}) -> + constructor: ({@buffer, @tabLength, @ignoreInvisibles}) -> @emitter = new Emitter @disposables = new CompositeDisposable @@ -39,7 +40,7 @@ class TokenizedBuffer extends Model serializeParams: -> bufferPath: @buffer.getPath() tabLength: @tabLength - invisibles: _.clone(@invisibles) + ignoreInvisibles: @ignoreInvisibles deserializeParams: (params) -> params.buffer = atom.project.bufferForPathSync(params.bufferPath) @@ -76,13 +77,28 @@ class TokenizedBuffer extends Model @grammarUpdateDisposable = @grammar.onDidUpdate => @retokenizeLines() @disposables.add(@grammarUpdateDisposable) - @configSettings = tabLength: atom.config.get('editor.tabLength', scope: @rootScopeDescriptor) + scopeOptions = {scope: @rootScopeDescriptor} + @configSettings = + tabLength: atom.config.get('editor.tabLength', scopeOptions) + invisibles: atom.config.get('editor.invisibles', scopeOptions) + showInvisibles: atom.config.get('editor.showInvisibles', scopeOptions) - @grammarTabLengthSubscription?.dispose() - @grammarTabLengthSubscription = atom.config.onDidChange 'editor.tabLength', scope: @rootScopeDescriptor, ({newValue}) => + if @configSubscriptions? + @configSubscriptions.dispose() + @disposables.remove(@configSubscriptions) + @configSubscriptions = new CompositeDisposable + @configSubscriptions.add atom.config.onDidChange 'editor.tabLength', scopeOptions, ({newValue}) => @configSettings.tabLength = newValue @retokenizeLines() - @disposables.add(@grammarTabLengthSubscription) + @configSubscriptions.add atom.config.onDidChange 'editor.invisibles', scopeOptions, ({newValue}) => + oldInvisibles = @getInvisiblesToShow() + @configSettings.invisibles = newValue + @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) + @configSubscriptions.add atom.config.onDidChange 'editor.showInvisibles', scopeOptions, ({newValue}) => + oldInvisibles = @getInvisiblesToShow() + @configSettings.showInvisibles = newValue + @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) + @disposables.add(@configSubscriptions) @retokenizeLines() @@ -123,10 +139,11 @@ class TokenizedBuffer extends Model @tabLength = tabLength @retokenizeLines() - setInvisibles: (invisibles) -> - unless _.isEqual(invisibles, @invisibles) - @invisibles = invisibles - @retokenizeLines() + setIgnoreInvisibles: (ignoreInvisibles) -> + if ignoreInvisibles isnt @ignoreInvisibles + @ignoreInvisibles = ignoreInvisibles + if @configSettings.showInvisibles and @configSettings.invisibles? + @retokenizeLines() tokenizeInBackground: -> return if not @visible or @pendingChunk or not @isAlive() @@ -302,7 +319,7 @@ class TokenizedBuffer extends Model tabLength = @getTabLength() indentLevel = @indentLevelForRow(row) lineEnding = @buffer.lineEndingForRow(row) - new TokenizedLine({tokens, tabLength, indentLevel, @invisibles, lineEnding}) + new TokenizedLine({tokens, tabLength, indentLevel, invisibles: @getInvisiblesToShow(), lineEnding}) buildTokenizedLineForRow: (row, ruleStack) -> @buildTokenizedLineForRowWithText(row, @buffer.lineForRow(row), ruleStack) @@ -312,7 +329,13 @@ class TokenizedBuffer extends Model tabLength = @getTabLength() indentLevel = @indentLevelForRow(row) {tokens, ruleStack} = @grammar.tokenizeLine(line, ruleStack, row is 0) - new TokenizedLine({tokens, ruleStack, tabLength, lineEnding, indentLevel, @invisibles}) + new TokenizedLine({tokens, ruleStack, tabLength, lineEnding, indentLevel, invisibles: @getInvisiblesToShow()}) + + getInvisiblesToShow: -> + if @configSettings.showInvisibles and not @ignoreInvisibles + @configSettings.invisibles + else + null tokenizedLineForRow: (bufferRow) -> @tokenizedLines[bufferRow] From 31c1ac412b4343b33ffc15befd374a8e8ae76edf Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 13 May 2015 21:23:20 -0700 Subject: [PATCH 61/61] :art: remove duplication in TokenizedBuffer::setGrammar --- src/tokenized-buffer.coffee | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index b72e712a1..6d8f0c018 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -90,14 +90,11 @@ class TokenizedBuffer extends Model @configSubscriptions.add atom.config.onDidChange 'editor.tabLength', scopeOptions, ({newValue}) => @configSettings.tabLength = newValue @retokenizeLines() - @configSubscriptions.add atom.config.onDidChange 'editor.invisibles', scopeOptions, ({newValue}) => - oldInvisibles = @getInvisiblesToShow() - @configSettings.invisibles = newValue - @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) - @configSubscriptions.add atom.config.onDidChange 'editor.showInvisibles', scopeOptions, ({newValue}) => - oldInvisibles = @getInvisiblesToShow() - @configSettings.showInvisibles = newValue - @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) + ['invisibles', 'showInvisibles'].forEach (key) => + @configSubscriptions.add atom.config.onDidChange "editor.#{key}", scopeOptions, ({newValue}) => + oldInvisibles = @getInvisiblesToShow() + @configSettings[key] = newValue + @retokenizeLines() unless _.isEqual(@getInvisiblesToShow(), oldInvisibles) @disposables.add(@configSubscriptions) @retokenizeLines()