From 381255d5f79f8f8ac4d0cf24354e27d2dff9fecd Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Thu, 14 Nov 2019 14:35:33 -0800 Subject: [PATCH 1/2] account for padding on macOS fixes #84231 --- src/vs/base/browser/ui/dropdown/dropdown.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index c36015f710b76..37d67e74aefa9 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -11,9 +11,10 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IContextViewProvider, IAnchor, AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; import { IMenuOptions } from 'vs/base/browser/ui/menu/menu'; import { ResolvedKeybinding, KeyCode } from 'vs/base/common/keyCodes'; -import { EventHelper, EventType, removeClass, addClass, append, $, addDisposableListener, addClasses } from 'vs/base/browser/dom'; +import { EventHelper, EventType, removeClass, addClass, append, $, addDisposableListener, addClasses, getDomNodePagePosition } from 'vs/base/browser/dom'; import { IContextMenuDelegate } from 'vs/base/browser/contextmenu'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { isMacintosh } from 'vs/base/common/platform'; export interface ILabelRenderer { (container: HTMLElement): IDisposable | null; @@ -171,6 +172,20 @@ export class Dropdown extends BaseDropdown { } protected getAnchor(): HTMLElement | IAnchor { + // Shift macOS dropdown menus by a few pixels + // to account for extra padding on the top + // https://github.com/microsoft/vscode/issues/84231 + if (isMacintosh) { + let elementPosition = getDomNodePagePosition(this.element); + + const anchor: IAnchor = { + x: elementPosition.left, + y: elementPosition.top + elementPosition.height + 4 + }; + + return anchor; + } + return this.element; } From 47b2395333b6ea42b290b1e22309cc665de954f4 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Thu, 14 Nov 2019 14:56:38 -0800 Subject: [PATCH 2/2] move to native context menu service and account for zoom --- src/vs/base/browser/ui/dropdown/dropdown.ts | 17 +---------------- .../electron-browser/contextmenuService.ts | 9 ++++++++- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index 37d67e74aefa9..c36015f710b76 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -11,10 +11,9 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IContextViewProvider, IAnchor, AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; import { IMenuOptions } from 'vs/base/browser/ui/menu/menu'; import { ResolvedKeybinding, KeyCode } from 'vs/base/common/keyCodes'; -import { EventHelper, EventType, removeClass, addClass, append, $, addDisposableListener, addClasses, getDomNodePagePosition } from 'vs/base/browser/dom'; +import { EventHelper, EventType, removeClass, addClass, append, $, addDisposableListener, addClasses } from 'vs/base/browser/dom'; import { IContextMenuDelegate } from 'vs/base/browser/contextmenu'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { isMacintosh } from 'vs/base/common/platform'; export interface ILabelRenderer { (container: HTMLElement): IDisposable | null; @@ -172,20 +171,6 @@ export class Dropdown extends BaseDropdown { } protected getAnchor(): HTMLElement | IAnchor { - // Shift macOS dropdown menus by a few pixels - // to account for extra padding on the top - // https://github.com/microsoft/vscode/issues/84231 - if (isMacintosh) { - let elementPosition = getDomNodePagePosition(this.element); - - const anchor: IAnchor = { - x: elementPosition.left, - y: elementPosition.top + elementPosition.height + 4 - }; - - return anchor; - } - return this.element; } diff --git a/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts b/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts index cea0688e45f49..e607464f9028e 100644 --- a/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts +++ b/src/vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts @@ -91,18 +91,25 @@ class NativeContextMenuService extends Disposable implements IContextMenuService const anchor = delegate.getAnchor(); let x: number, y: number; + let zoom = webFrame.getZoomFactor(); if (dom.isHTMLElement(anchor)) { let elementPosition = dom.getDomNodePagePosition(anchor); x = elementPosition.left; y = elementPosition.top + elementPosition.height; + + // Shift macOS menus by a few pixels below elements + // to account for extra padding on top of native menu + // https://github.com/microsoft/vscode/issues/84231 + if (isMacintosh) { + y += 4 / zoom; + } } else { const pos: { x: number; y: number; } = anchor; x = pos.x + 1; /* prevent first item from being selected automatically under mouse */ y = pos.y; } - let zoom = webFrame.getZoomFactor(); x *= zoom; y *= zoom;