     didChangePositionDisposable = cursor.onDidChangePosition =>
       @updateHiddenInputState() if cursor.isLastCursor()
       @pauseCursorBlinking()
-      @updateCursorsState()
-
-    didChangeVisibilityDisposable = cursor.onDidChangeVisibility(@updateCursorsState.bind(this))
+      @updateCursorState(cursor)
+
+    didChangeVisibilityDisposable = cursor.onDidChangeVisibility =>
+      @updateCursorState(cursor)
 
     didDestroyDisposable = cursor.onDidDestroy =>
       @disposables.remove(didChangePositionDisposable)
       @disposables.remove(didChangeVisibilityDisposable)
       @disposables.remove(didDestroyDisposable)
       @updateHiddenInputState()
-      @updateCursorsState()
+      @updateCursorState(cursor, true)
 
     @disposables.add(didChangePositionDisposable)
     @disposables.add(didChangeVisibilityDisposable)

    @observeCursor(cursor)
    @updateHiddenInputState()
    @pauseCursorBlinking()
    @updateCursorsState()

  startBlinkingCursors: ->
    @toggleCursorBlinkHandle = setInterval(@toggleCursorBlink.bind(this), @getCursorBlinkPeriod() / 2)

  updateCursorsState: ->
    @state.content.cursors = {}

    @updateCursorState(cursor) for cursor in @model.cursors # using property directly to avoid allocation

    @emitter.emit 'did-update-state'


  updateCursorState: (cursor, destroyOnly = false) ->
    delete @state.content.cursors[cursor.id]

    return if destroyOnly
    return unless @startRow? and @endRow? and @hasPixelRectRequirements() and @baseCharacterWidth?
    return unless cursor.isVisible() and @startRow <= cursor.getScreenRow() < @endRow

    pixelRect = @pixelRectForScreenRange(cursor.getScreenRange())
    pixelRect.width = @baseCharacterWidth if pixelRect.width is 0
    @state.content.cursors[cursor.id] = pixelRect

  updateOverlaysState: ->
    return unless @hasPixelRectRequirements()
