diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 500c27d7d6c..46e761bc5ff 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -505,6 +505,24 @@ declare namespace vscode { isReversed: boolean; } + /** + * Represents sources that can cause [selection change events](#window.onDidChangeTextEditorSelection). + */ + export enum TextEditorSelectionChangeKind { + /** + * Selection changed due to typing in the editor. + */ + Keyboard = 1, + /** + * Selection change due to clicking in the editor. + */ + Mouse = 2, + /** + * Selection changed because a command ran. + */ + Command = 3 + } + /** * Represents an event describing the change in a [text editor's selections](#TextEditor.selections). */ @@ -513,6 +531,11 @@ declare namespace vscode { * The [text editor](#TextEditor) for which the selections have changed. */ textEditor: TextEditor; + /** + * The [change kind](#TextEditorSelectionChangeKind) which has triggered this + * event. Can be `undefined`. + */ + kind: TextEditorSelectionChangeKind; /** * The new value for the [text editor's selections](#TextEditor.selections). */ diff --git a/src/vs/workbench/api/node/extHostEditors.ts b/src/vs/workbench/api/node/extHostEditors.ts index f15a38174b8..4e01b6ebd03 100644 --- a/src/vs/workbench/api/node/extHostEditors.ts +++ b/src/vs/workbench/api/node/extHostEditors.ts @@ -11,7 +11,7 @@ import Event, {Emitter} from 'vs/base/common/event'; import {TPromise} from 'vs/base/common/winjs.base'; import {IThreadService} from 'vs/workbench/services/thread/common/threadService'; import {ExtHostDocuments, ExtHostDocumentData} from 'vs/workbench/api/node/extHostDocuments'; -import {Selection, Range, Position, EditorOptions, EndOfLine, TextEditorRevealType} from './extHostTypes'; +import {Selection, Range, Position, EditorOptions, EndOfLine, TextEditorRevealType, TextEditorSelectionChangeKind} from './extHostTypes'; import {ISingleEditOperation} from 'vs/editor/common/editorCommon'; import {IResolvedTextEditorConfiguration, ISelectionChangeEvent} from 'vs/workbench/api/node/mainThreadEditorsTracker'; import * as TypeConverters from './extHostTypeConverters'; @@ -103,12 +103,14 @@ export class ExtHostEditors extends ExtHostEditorsShape { } $acceptSelectionsChanged(id: string, event: ISelectionChangeEvent): void { - let selections = event.selections.map(TypeConverters.toSelection); - let editor = this._editors[id]; - editor._acceptSelections(selections); + const kind = TextEditorSelectionChangeKind.fromValue(event.source); + const selections = event.selections.map(TypeConverters.toSelection); + const textEditor = this._editors[id]; + textEditor._acceptSelections(selections); this._onDidChangeTextEditorSelection.fire({ - textEditor: editor, - selections: selections + textEditor, + selections, + kind }); } diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index b1a291b7ae4..af533a978b8 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -829,6 +829,22 @@ export enum TextEditorRevealType { InCenterIfOutsideViewport = 2 } +export enum TextEditorSelectionChangeKind { + Keyboard = 1, + Mouse = 2, + Command = 3 +} + +export namespace TextEditorSelectionChangeKind { + export function fromValue(s: string) { + switch (s) { + case 'keyboard': return TextEditorSelectionChangeKind.Keyboard; + case 'mouse': return TextEditorSelectionChangeKind.Mouse; + case 'api': return TextEditorSelectionChangeKind.Command; + } + } +} + export class DocumentLink { range: Range;