mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-22 01:25:38 -05:00
Merge from vscode merge-base (#22780)
* Revert "Revert "Merge from vscode merge-base (#22769)" (#22779)"
This reverts commit 47a1745180.
* Fix notebook download task
* Remove done call from extensions-ci
This commit is contained in:
126
src/sql/base/browser/globalPointerMoveMonitor.ts
Normal file
126
src/sql/base/browser/globalPointerMoveMonitor.ts
Normal file
@@ -0,0 +1,126 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
|
||||
|
||||
export interface IPointerMoveEventData {
|
||||
leftButton: boolean;
|
||||
buttons: number;
|
||||
pageX: number;
|
||||
pageY: number;
|
||||
}
|
||||
|
||||
export interface IEventMerger<R> {
|
||||
(lastEvent: R | null, currentEvent: PointerEvent): R;
|
||||
}
|
||||
|
||||
export interface IPointerMoveCallback<R> {
|
||||
(pointerMoveData: R): void;
|
||||
}
|
||||
|
||||
export interface IOnStopCallback {
|
||||
(browserEvent?: PointerEvent | KeyboardEvent): void;
|
||||
}
|
||||
|
||||
export function standardPointerMoveMerger(lastEvent: IPointerMoveEventData | null, currentEvent: PointerEvent): IPointerMoveEventData {
|
||||
currentEvent.preventDefault();
|
||||
return {
|
||||
leftButton: (currentEvent.button === 0),
|
||||
buttons: currentEvent.buttons,
|
||||
pageX: currentEvent.pageX,
|
||||
pageY: currentEvent.pageY
|
||||
};
|
||||
}
|
||||
|
||||
export class GlobalPointerMoveMonitor<R extends { buttons: number } = IPointerMoveEventData> implements IDisposable {
|
||||
|
||||
private readonly _hooks = new DisposableStore();
|
||||
private _pointerMoveEventMerger: IEventMerger<R> | null = null;
|
||||
private _pointerMoveCallback: IPointerMoveCallback<R> | null = null;
|
||||
private _onStopCallback: IOnStopCallback | null = null;
|
||||
|
||||
public dispose(): void {
|
||||
this.stopMonitoring(false);
|
||||
this._hooks.dispose();
|
||||
}
|
||||
|
||||
public stopMonitoring(invokeStopCallback: boolean, browserEvent?: PointerEvent | KeyboardEvent): void {
|
||||
if (!this.isMonitoring()) {
|
||||
// Not monitoring
|
||||
return;
|
||||
}
|
||||
|
||||
// Unhook
|
||||
this._hooks.clear();
|
||||
this._pointerMoveEventMerger = null;
|
||||
this._pointerMoveCallback = null;
|
||||
const onStopCallback = this._onStopCallback;
|
||||
this._onStopCallback = null;
|
||||
|
||||
if (invokeStopCallback && onStopCallback) {
|
||||
onStopCallback(browserEvent);
|
||||
}
|
||||
}
|
||||
|
||||
public isMonitoring(): boolean {
|
||||
return !!this._pointerMoveEventMerger;
|
||||
}
|
||||
|
||||
public startMonitoring(
|
||||
initialElement: Element,
|
||||
pointerId: number,
|
||||
initialButtons: number,
|
||||
pointerMoveEventMerger: IEventMerger<R>,
|
||||
pointerMoveCallback: IPointerMoveCallback<R>,
|
||||
onStopCallback: IOnStopCallback
|
||||
): void {
|
||||
if (this.isMonitoring()) {
|
||||
this.stopMonitoring(false);
|
||||
}
|
||||
this._pointerMoveEventMerger = pointerMoveEventMerger;
|
||||
this._pointerMoveCallback = pointerMoveCallback;
|
||||
this._onStopCallback = onStopCallback;
|
||||
|
||||
let eventSource: Element | Window = initialElement;
|
||||
|
||||
try {
|
||||
initialElement.setPointerCapture(pointerId);
|
||||
this._hooks.add(toDisposable(() => {
|
||||
initialElement.releasePointerCapture(pointerId);
|
||||
}));
|
||||
} catch (err) {
|
||||
// See https://github.com/microsoft/vscode/issues/144584
|
||||
// See https://github.com/microsoft/vscode/issues/146947
|
||||
// `setPointerCapture` sometimes fails when being invoked
|
||||
// from a `mousedown` listener on macOS and Windows
|
||||
// and it always fails on Linux with the exception:
|
||||
// DOMException: Failed to execute 'setPointerCapture' on 'Element':
|
||||
// No active pointer with the given id is found.
|
||||
// In case of failure, we bind the listeners on the window
|
||||
eventSource = window;
|
||||
}
|
||||
|
||||
this._hooks.add(dom.addDisposableThrottledListener<R, PointerEvent>(
|
||||
eventSource,
|
||||
dom.EventType.POINTER_MOVE,
|
||||
(data: R) => {
|
||||
if (data.buttons !== initialButtons) {
|
||||
// Buttons state has changed in the meantime
|
||||
this.stopMonitoring(true);
|
||||
return;
|
||||
}
|
||||
this._pointerMoveCallback!(data);
|
||||
},
|
||||
(lastEvent: R | null, currentEvent) => this._pointerMoveEventMerger!(lastEvent, currentEvent)
|
||||
));
|
||||
|
||||
this._hooks.add(dom.addDisposableListener(
|
||||
eventSource,
|
||||
dom.EventType.POINTER_UP,
|
||||
(e: PointerEvent) => this.stopMonitoring(true)
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -261,6 +261,7 @@ export class PanelComponent extends Disposable implements IThemable {
|
||||
this.selectTab(nextTabIndex);
|
||||
}
|
||||
|
||||
/* eslint-disable */
|
||||
/**
|
||||
* Updates the specified tab with new config values
|
||||
* @param tabId The id of the tab to update
|
||||
@@ -285,6 +286,7 @@ export class PanelComponent extends Disposable implements IThemable {
|
||||
tabHeader?.refresh();
|
||||
}
|
||||
}
|
||||
/* eslint-enable */
|
||||
|
||||
private findAndRemoveTabFromMRU(tab: TabComponent): void {
|
||||
let mruIndex = this._mru.findIndex(i => i === tab);
|
||||
|
||||
Reference in New Issue
Block a user