From 6a9abd1f6664cd81e1d8fcfb6032578bcdead89c Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Thu, 26 Feb 2015 15:23:11 -0700 Subject: [PATCH] =?UTF-8?q?:racehorse:=20Don=E2=80=99t=20blink=20cursors?= =?UTF-8?q?=20when=20editor=20isn=E2=80=99t=20focused?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Max Brunsfeld --- spec/text-editor-component-spec.coffee | 5 +++-- spec/text-editor-presenter-spec.coffee | 20 +++++++++++++++++--- src/text-editor-presenter.coffee | 22 +++++++++++++++------- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/spec/text-editor-component-spec.coffee b/spec/text-editor-component-spec.coffee index d7b9ed2ff..a830efe04 100644 --- a/spec/text-editor-component-spec.coffee +++ b/spec/text-editor-component-spec.coffee @@ -794,6 +794,8 @@ describe "TextEditorComponent", -> it "blinks cursors when they aren't moving", -> cursorsNode = componentNode.querySelector('.cursors') + wrapperNode.focus() + nextAnimationFrame() expect(cursorsNode.classList.contains('blink-off')).toBe false advanceClock(component.cursorBlinkPeriod / 2) @@ -2481,8 +2483,7 @@ describe "TextEditorComponent", -> gutterWidth = componentNode.querySelector('.gutter').offsetWidth componentNode.style.width = gutterWidth + 14 * charWidth + editor.getVerticalScrollbarWidth() + 'px' advanceClock(atom.views.documentPollingInterval) - nextAnimationFrame() # won't poll until cursor blinks - nextAnimationFrame() # handle update requested by poll + nextAnimationFrame() expect(componentNode.querySelector('.line').textContent).toBe "var quicksort " it "accounts for the scroll view's padding when determining the wrap location", -> diff --git a/spec/text-editor-presenter-spec.coffee b/spec/text-editor-presenter-spec.coffee index 0d526b5f2..2ee966630 100644 --- a/spec/text-editor-presenter-spec.coffee +++ b/spec/text-editor-presenter-spec.coffee @@ -1136,10 +1136,10 @@ describe "TextEditorPresenter", -> expect(stateForCursor(presenter, 0).width).toBe 10 describe ".cursorsVisible", -> - it "alternates between true and false twice per ::cursorBlinkPeriod", -> + it "alternates between true and false twice per ::cursorBlinkPeriod when the editor is focused", -> cursorBlinkPeriod = 100 cursorBlinkResumeDelay = 200 - presenter = buildPresenter({cursorBlinkPeriod, cursorBlinkResumeDelay}) + presenter = buildPresenter({cursorBlinkPeriod, cursorBlinkResumeDelay, focused: true}) expect(presenter.state.content.cursorsVisible).toBe true expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2) @@ -1148,11 +1148,25 @@ describe "TextEditorPresenter", -> expect(presenter.state.content.cursorsVisible).toBe true expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2) expect(presenter.state.content.cursorsVisible).toBe false + expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2) + expect(presenter.state.content.cursorsVisible).toBe true + + expectStateUpdate presenter, -> presenter.setFocused(false) + expect(presenter.state.content.cursorsVisible).toBe false + advanceClock(cursorBlinkPeriod / 2) + expect(presenter.state.content.cursorsVisible).toBe false + advanceClock(cursorBlinkPeriod / 2) + expect(presenter.state.content.cursorsVisible).toBe false + + expectStateUpdate presenter, -> presenter.setFocused(true) + expect(presenter.state.content.cursorsVisible).toBe true + expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2) + expect(presenter.state.content.cursorsVisible).toBe false it "stops alternating for ::cursorBlinkResumeDelay when a cursor moves or a cursor is added", -> cursorBlinkPeriod = 100 cursorBlinkResumeDelay = 200 - presenter = buildPresenter({cursorBlinkPeriod, cursorBlinkResumeDelay}) + presenter = buildPresenter({cursorBlinkPeriod, cursorBlinkResumeDelay, focused: true}) expect(presenter.state.content.cursorsVisible).toBe true expectStateUpdate presenter, -> advanceClock(cursorBlinkPeriod / 2) diff --git a/src/text-editor-presenter.coffee b/src/text-editor-presenter.coffee index 20f575407..5690f51c9 100644 --- a/src/text-editor-presenter.coffee +++ b/src/text-editor-presenter.coffee @@ -25,7 +25,7 @@ class TextEditorPresenter @observeModel() @observeConfig() @buildState() - @startBlinkingCursors() + @startBlinkingCursors() if @focused destroy: -> @disposables.dispose() @@ -113,7 +113,7 @@ class TextEditorPresenter hiddenInput: {} content: scrollingVertically: false - cursorsVisible: true + cursorsVisible: false lines: {} highlights: {} overlays: {} @@ -507,6 +507,10 @@ class TextEditorPresenter setFocused: (focused) -> unless @focused is focused @focused = focused + if @focused + @startBlinkingCursors() + else + @stopBlinkingCursors(false) @updateFocusedState() @updateHiddenInputState() @@ -977,18 +981,22 @@ class TextEditorPresenter @updateCursorState(cursor) startBlinkingCursors: -> - @toggleCursorBlinkHandle = setInterval(@toggleCursorBlink.bind(this), @getCursorBlinkPeriod() / 2) + unless @toggleCursorBlinkHandle + @state.content.cursorsVisible = true + @toggleCursorBlinkHandle = setInterval(@toggleCursorBlink.bind(this), @getCursorBlinkPeriod() / 2) - stopBlinkingCursors: -> - clearInterval(@toggleCursorBlinkHandle) + stopBlinkingCursors: (visible) -> + if @toggleCursorBlinkHandle + @state.content.cursorsVisible = visible + clearInterval(@toggleCursorBlinkHandle) + @toggleCursorBlinkHandle = null toggleCursorBlink: -> @state.content.cursorsVisible = not @state.content.cursorsVisible @emitter.emit 'did-update-state' pauseCursorBlinking: -> - @state.content.cursorsVisible = true - @stopBlinkingCursors() + @stopBlinkingCursors(true) @startBlinkingCursorsAfterDelay ?= _.debounce(@startBlinkingCursors, @getCursorBlinkResumeDelay()) @startBlinkingCursorsAfterDelay() @emitter.emit 'did-update-state'