From a1ae8199080b34f467dcf7f898afe7642fc5e386 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 23 Nov 2012 12:14:46 -0700 Subject: [PATCH] Only tokenize in background if when a buffer is visible in an editor This will prevent running a bunch of background tokenization when Atom is reloaded. We only perform tokenization to support content that is actually on screen. --- spec/app/tokenized-buffer-spec.coffee | 2 ++ src/app/display-buffer.coffee | 2 ++ src/app/edit-session.coffee | 2 ++ src/app/editor.coffee | 1 + src/app/tokenized-buffer.coffee | 6 +++++- 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/spec/app/tokenized-buffer-spec.coffee b/spec/app/tokenized-buffer-spec.coffee index aaf08ed71..a874e43f0 100644 --- a/spec/app/tokenized-buffer-spec.coffee +++ b/spec/app/tokenized-buffer-spec.coffee @@ -21,6 +21,7 @@ describe "TokenizedBuffer", -> editSession = fixturesProject.buildEditSessionForPath('sample.js', autoIndent: false) buffer = editSession.buffer tokenizedBuffer = editSession.displayBuffer.tokenizedBuffer + editSession.setVisible(true) changeHandler = jasmine.createSpy('changeHandler') tokenizedBuffer.on "change", changeHandler @@ -289,6 +290,7 @@ describe "TokenizedBuffer", -> editSession = fixturesProject.buildEditSessionForPath('sample-with-tabs.coffee', { tabLength }) buffer = editSession.buffer tokenizedBuffer = editSession.displayBuffer.tokenizedBuffer + editSession.setVisible(true) afterEach -> editSession.destroy() diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 568e59ebe..adf4cfd8a 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -27,6 +27,8 @@ class DisplayBuffer @buildLineMap() @tokenizedBuffer.on 'change', (e) => @handleTokenizedBufferChange(e) + setVisible: (visible) -> @tokenizedBuffer.setVisible(visible) + buildLineMap: -> @lineMap = new LineMap @lineMap.insertAtScreenRow 0, @buildLinesForBufferRows(0, @buffer.getLastRow()) diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 6e88924e1..e4b5a42b7 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -91,6 +91,8 @@ class EditSession @scrollLeft == other.getScrollLeft() and @getCursorScreenPosition().isEqual(other.getCursorScreenPosition()) + setVisible: (visible) -> @displayBuffer.setVisible(visible) + setScrollTop: (@scrollTop) -> getScrollTop: -> @scrollTop diff --git a/src/app/editor.coffee b/src/app/editor.coffee index adb2592fa..0148be667 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -422,6 +422,7 @@ class Editor extends View @activeEditSession.off() @activeEditSession = @editSessions[index] + @activeEditSession.setVisible(true) @activeEditSession.on "buffer-contents-change-on-disk", => @showBufferConflictAlert(@activeEditSession) diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee index bed53f2c9..d1c0cb742 100644 --- a/src/app/tokenized-buffer.coffee +++ b/src/app/tokenized-buffer.coffee @@ -16,6 +16,7 @@ class TokenizedBuffer screenLines: null chunkSize: 50 invalidRows: null + visible: false constructor: (@buffer, { @languageMode, @tabLength }) -> @tabLength ?= 2 @@ -25,6 +26,9 @@ class TokenizedBuffer @invalidateRow(0) @buffer.on "change.tokenized-buffer#{@id}", (e) => @handleBufferChange(e) + setVisible: (@visible) -> + @tokenizeInBackground() if @visible + getTabLength: -> @tabLength @@ -35,7 +39,7 @@ class TokenizedBuffer @trigger "change", { start: 0, end: lastRow, delta: 0 } tokenizeInBackground: -> - return if @pendingChunk + return if not @visible or @pendingChunk @pendingChunk = true _.defer => @pendingChunk = false