       overlayState.itemWidth = itemWidth
       overlayState.itemHeight = itemHeight
       overlayState.contentMargin = contentMargin
-      @updateOverlaysState()
+      @shouldUpdateOverlaysState = true
+
+      @emitDidUpdateState()
 
   observeCursor: (cursor) ->
     didChangePositionDisposable = cursor.onDidChangePosition =>
-      @updateHiddenInputState() if cursor.isLastCursor()
+      @shouldUpdateHiddenInputState = true if cursor.isLastCursor()
       @pauseCursorBlinking()
       @updateCursorState(cursor)
+
+      @emitDidUpdateState()
 
     didChangeVisibilityDisposable = cursor.onDidChangeVisibility =>
       @updateCursorState(cursor)

      @shouldUpdateLineNumberGutterState = true
      @shouldUpdateLineNumbersState = true
      @shouldUpdateGutterOrderState = true
      @updateCustomGutterDecorationState() # FIXME: use `shouldUpdate...`
    @disposables.add @model.onDidChangeGrammar(@didChangeGrammar.bind(this))
    @disposables.add @model.onDidChangePlaceholderText(@updateContentState.bind(this))
    @disposables.add @model.onDidChangeMini =>
      @shouldUpdateScrollbarDimensions = true
      @shouldUpdateScrollbarsState = true
      @shouldUpdateContentState = true
      @shouldUpdateDecorations = true
      @shouldUpdateLinesState = true
      @shouldUpdateLineNumberGutterState = true
      @shouldUpdateLineNumbersState = true
      @updateCommonGutterState() # TODO: check out later...
      @updateGutterOrderState() # FIXME: use `shouldUpdate...`
      @updateCustomGutterDecorationState() # FIXME: use `shouldUpdate...`
    @disposables.add @model.onDidChangeLineNumberGutterVisible =>
      @shouldUpdateLineNumberGutterState = true
      @updateCommonGutterState() # TODO: check out later...
      @updateGutterOrderState() # FIXME: use `shouldUpdate...`
    @disposables.add @model.onDidAddDecoration(@didAddDecoration.bind(this))
    @disposables.add @model.onDidAddCursor(@didAddCursor.bind(this))
    @disposables.add @model.onDidChangeScrollTop(@setScrollTop.bind(this))

      @measuredHorizontalScrollbarHeight = horizontalScrollbarHeight
      @model.setHorizontalScrollbarHeight(horizontalScrollbarHeight)
      @updateScrollbarDimensions()
      @shouldUpdateScrollbarsState = true
      @shouldUpdateVerticalScrollState = true
      @shouldUpdateHorizontalScrollState = true
      @shouldUpdateCursorsState = true unless oldHorizontalScrollbarHeight?

      @emitDidUpdateState()

  setVerticalScrollbarWidth: (verticalScrollbarWidth) ->
    unless @measuredVerticalScrollbarWidth is verticalScrollbarWidth
