From f5078a16e3f7fd532e7b21c1c43834034821c009 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 12 May 2015 11:20:41 -0700 Subject: [PATCH 01/19] 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 02/19] 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 03/19] 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 04/19] 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 05/19] 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 06/19] 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 07/19] :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 08/19] 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 09/19] 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 10/19] 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 11/19] 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 12/19] 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 13/19] 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 14/19] 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 15/19] 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 16/19] 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 17/19] 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 18/19] :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 19/19] 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; } }