diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index c195b03f812312ef7ed2f68094970e3f01d0be02..97a47778cdd5cc047669644892a4f61f31466e0e 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -701,7 +701,7 @@ export class ActionBar extends Disposable implements IActionRunner { } } - private focusNext(): void { + protected focusNext(): void { if (typeof this.focusedItem === 'undefined') { this.focusedItem = this.items.length - 1; } @@ -721,7 +721,7 @@ export class ActionBar extends Disposable implements IActionRunner { this.updateFocus(); } - private focusPrevious(): void { + protected focusPrevious(): void { if (typeof this.focusedItem === 'undefined') { this.focusedItem = 0; } diff --git a/src/vs/base/browser/ui/menu/menu.ts b/src/vs/base/browser/ui/menu/menu.ts index 1cf6cf7075361267e10803e4c08a9e6a58a54eaf..25000d5e79167eaa6afc695d2f09b4253cfb3da0 100644 --- a/src/vs/base/browser/ui/menu/menu.ts +++ b/src/vs/base/browser/ui/menu/menu.ts @@ -18,6 +18,7 @@ import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableEle import { ScrollbarVisibility, ScrollEvent } from 'vs/base/common/scrollable'; import { Event, Emitter } from 'vs/base/common/event'; import { AnchorAlignment } from 'vs/base/browser/ui/contextview/contextview'; +import { isLinux } from 'vs/base/common/platform'; export const MENU_MNEMONIC_REGEX: RegExp = /\(&{1,2}(.)\)|&{1,2}(.)/; export const MENU_ESCAPED_MNEMONIC_REGEX: RegExp = /(?:&){1,2}(.)/; @@ -118,6 +119,22 @@ export class Menu extends ActionBar { })); } + if (isLinux) { + this._register(addDisposableListener(menuElement, EventType.KEY_DOWN, e => { + const event = new StandardKeyboardEvent(e); + + if (event.equals(KeyCode.Home) || event.equals(KeyCode.PageUp)) { + this.focusedItem = this.items.length - 1; + this.focusNext(); + EventHelper.stop(e, true); + } else if (event.equals(KeyCode.End) || event.equals(KeyCode.PageDown)) { + this.focusedItem = 0; + this.focusPrevious(); + EventHelper.stop(e, true); + } + })); + } + this._register(addDisposableListener(this.domNode, EventType.MOUSE_OUT, e => { let relatedTarget = e.relatedTarget as HTMLElement; if (!isAncestor(relatedTarget, this.domNode)) {