Skip to content

Commit 186a9a5

Browse files
committed
Fixes microsoft#6478: Cancel drag-select or drag-and-drop if a non modifier key is pressed
1 parent 79e83a0 commit 186a9a5

2 files changed

Lines changed: 30 additions & 16 deletions

File tree

src/vs/editor/browser/controller/mouseHandler.ts

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -265,20 +265,18 @@ export class MouseHandler extends ViewEventHandler {
265265

266266
class MouseDownOperation extends Disposable {
267267

268-
private _context: ViewContext;
269-
private _viewController: ViewController;
270-
private _viewHelper: IPointerHandlerHelper;
271-
private _createMouseTarget: (e: EditorMouseEvent, testEventTarget: boolean) => editorBrowser.IMouseTarget;
272-
private _getMouseColumn: (e: EditorMouseEvent) => number;
268+
private readonly _context: ViewContext;
269+
private readonly _viewController: ViewController;
270+
private readonly _viewHelper: IPointerHandlerHelper;
271+
private readonly _createMouseTarget: (e: EditorMouseEvent, testEventTarget: boolean) => editorBrowser.IMouseTarget;
272+
private readonly _getMouseColumn: (e: EditorMouseEvent) => number;
273273

274-
private _mouseMoveMonitor: GlobalEditorMouseMoveMonitor;
274+
private readonly _mouseMoveMonitor: GlobalEditorMouseMoveMonitor;
275+
private readonly _onScrollTimeout: TimeoutTimer;
276+
private readonly _mouseState: MouseDownState;
275277

276278
private _currentSelection: Selection;
277-
private _mouseState: MouseDownState;
278-
279-
private _onScrollTimeout: TimeoutTimer;
280279
private _isActive: boolean;
281-
282280
private _lastMouseEvent: EditorMouseEvent;
283281

284282
constructor(
@@ -295,15 +293,13 @@ class MouseDownOperation extends Disposable {
295293
this._createMouseTarget = createMouseTarget;
296294
this._getMouseColumn = getMouseColumn;
297295

298-
this._currentSelection = new Selection(1, 1, 1, 1);
296+
this._mouseMoveMonitor = this._register(new GlobalEditorMouseMoveMonitor(this._viewHelper.viewDomNode));
297+
this._onScrollTimeout = this._register(new TimeoutTimer());
299298
this._mouseState = new MouseDownState();
300299

301-
this._onScrollTimeout = this._register(new TimeoutTimer());
300+
this._currentSelection = new Selection(1, 1, 1, 1);
302301
this._isActive = false;
303-
304302
this._lastMouseEvent = null;
305-
306-
this._mouseMoveMonitor = this._register(new GlobalEditorMouseMoveMonitor(this._viewHelper.viewDomNode));
307303
}
308304

309305
public dispose(): void {

src/vs/editor/browser/editorDom.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,17 +146,35 @@ export class GlobalEditorMouseMoveMonitor extends Disposable {
146146

147147
private _editorViewDomNode: HTMLElement;
148148
private _globalMouseMoveMonitor: GlobalMouseMoveMonitor<EditorMouseEvent>;
149+
private _keydownListener: IDisposable;
149150

150151
constructor(editorViewDomNode: HTMLElement) {
151152
super();
152153
this._editorViewDomNode = editorViewDomNode;
153154
this._globalMouseMoveMonitor = this._register(new GlobalMouseMoveMonitor<EditorMouseEvent>());
155+
this._keydownListener = null;
154156
}
155157

156158
public startMonitoring(merger: EditorMouseEventMerger, mouseMoveCallback: (e: EditorMouseEvent) => void, onStopCallback: () => void): void {
159+
160+
// Add a <<capture>> keydown event listener that will cancel the monitoring
161+
// if something other than a modifier key is pressed
162+
this._keydownListener = dom.addStandardDisposableListener(<any>document, 'keydown', (e) => {
163+
const kb = e.toKeybinding();
164+
if (kb.isModifierKey()) {
165+
// Allow modifier keys
166+
return;
167+
}
168+
this._globalMouseMoveMonitor.stopMonitoring(true);
169+
}, true);
170+
157171
let myMerger: dom.IEventMerger<EditorMouseEvent> = (lastEvent: EditorMouseEvent, currentEvent: MouseEvent): EditorMouseEvent => {
158172
return merger(lastEvent, new EditorMouseEvent(currentEvent, this._editorViewDomNode));
159173
};
160-
this._globalMouseMoveMonitor.startMonitoring(myMerger, mouseMoveCallback, onStopCallback);
174+
175+
this._globalMouseMoveMonitor.startMonitoring(myMerger, mouseMoveCallback, () => {
176+
this._keydownListener.dispose();
177+
onStopCallback();
178+
});
161179
}
162180
}

0 commit comments

Comments
 (0)