diff --git a/src/vs/base/browser/ui/contextview/contextview.ts b/src/vs/base/browser/ui/contextview/contextview.ts index 409f3c9497f..55384d0bbaa 100644 --- a/src/vs/base/browser/ui/contextview/contextview.ts +++ b/src/vs/base/browser/ui/contextview/contextview.ts @@ -26,6 +26,7 @@ export const enum AnchorPosition { export interface IDelegate { getAnchor(): HTMLElement | IAnchor; render(container: HTMLElement): IDisposable; + focus?(): void; layout?(): void; anchorAlignment?: AnchorAlignment; // default: left anchorPosition?: AnchorPosition; // default: below @@ -165,6 +166,11 @@ export class ContextView extends Disposable { // Layout this.doLayout(); + + // Focus + if (this.delegate.focus) { + this.delegate.focus(); + } } public layout(): void { @@ -223,7 +229,7 @@ export class ContextView extends Disposable { const anchorPosition = this.delegate!.anchorPosition || AnchorPosition.BELOW; const anchorAlignment = this.delegate!.anchorAlignment || AnchorAlignment.LEFT; - const verticalAnchor: ILayoutAnchor = { offset: around.top, size: around.height, position: anchorPosition === AnchorPosition.BELOW ? LayoutAnchorPosition.Before : LayoutAnchorPosition.After }; + const verticalAnchor: ILayoutAnchor = { offset: around.top - window.pageYOffset, size: around.height, position: anchorPosition === AnchorPosition.BELOW ? LayoutAnchorPosition.Before : LayoutAnchorPosition.After }; let horizontalAnchor: ILayoutAnchor; @@ -233,7 +239,7 @@ export class ContextView extends Disposable { horizontalAnchor = { offset: around.left + around.width, size: 0, position: LayoutAnchorPosition.After }; } - const top = layout(window.innerHeight, viewSizeHeight, verticalAnchor); + const top = layout(window.innerHeight, viewSizeHeight, verticalAnchor) + window.pageYOffset; // if view intersects vertically with anchor, shift it horizontally if (Range.intersects({ start: top, end: top + viewSizeHeight }, { start: verticalAnchor.offset, end: verticalAnchor.offset + verticalAnchor.size })) { diff --git a/src/vs/editor/contrib/contextmenu/contextmenu.ts b/src/vs/editor/contrib/contextmenu/contextmenu.ts index 76741920f13..e6937083e5e 100644 --- a/src/vs/editor/contrib/contextmenu/contextmenu.ts +++ b/src/vs/editor/contrib/contextmenu/contextmenu.ts @@ -95,7 +95,7 @@ export class ContextMenuController implements IEditorContribution { // Unless the user triggerd the context menu through Shift+F10, use the mouse position as menu position let forcedPosition: IPosition; if (e.target.type !== MouseTargetType.TEXTAREA) { - forcedPosition = { x: e.event.posx, y: e.event.posy + 1 }; + forcedPosition = { x: e.event.posx + 2, y: e.event.posy + 1 }; } // Show the context menu diff --git a/src/vs/platform/contextview/browser/contextMenuHandler.ts b/src/vs/platform/contextview/browser/contextMenuHandler.ts index 46b250bc81c..989638f7254 100644 --- a/src/vs/platform/contextview/browser/contextMenuHandler.ts +++ b/src/vs/platform/contextview/browser/contextMenuHandler.ts @@ -57,6 +57,8 @@ export class ContextMenuHandler { this.focusToReturn = document.activeElement as HTMLElement; + let menu: Menu | undefined; + this.contextViewService.showContextView({ getAnchor: () => delegate.getAnchor(), canRelayout: false, @@ -77,7 +79,7 @@ export class ContextMenuHandler { actionRunner.onDidBeforeRun(this.onActionRun, this, menuDisposables); actionRunner.onDidRun(this.onDidActionRun, this, menuDisposables); - const menu = new Menu(container, actions, { + menu = new Menu(container, actions, { actionItemProvider: delegate.getActionItem, context: delegate.getActionsContext ? delegate.getActionsContext() : null, actionRunner, @@ -90,11 +92,13 @@ export class ContextMenuHandler { menu.onDidBlur(() => this.contextViewService.hideContextView(true), null, menuDisposables); domEvent(window, EventType.BLUR)(() => { this.contextViewService.hideContextView(true); }, null, menuDisposables); - menu.focus(!!delegate.autoSelectFirstItem); - return combinedDisposable([...menuDisposables, menu]); }, + focus: () => { + menu.focus(!!delegate.autoSelectFirstItem); + }, + onHide: (didCancel?: boolean) => { if (delegate.onHide) { delegate.onHide(didCancel); diff --git a/src/vs/platform/contextview/browser/contextView.ts b/src/vs/platform/contextview/browser/contextView.ts index 64606f9f9ce..df51bcf7d29 100644 --- a/src/vs/platform/contextview/browser/contextView.ts +++ b/src/vs/platform/contextview/browser/contextView.ts @@ -29,6 +29,7 @@ export interface IContextViewDelegate { render(container: HTMLElement): IDisposable; onDOMEvent?(e: any, activeElement: HTMLElement): void; onHide?(data?: any): void; + focus?(): void; anchorAlignment?: AnchorAlignment; }