-
Notifications
You must be signed in to change notification settings - Fork 30.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
enable dynamic menu on linux/windows #59936
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -36,6 +36,9 @@ export class Menubar { | |
private closedLastWindow: boolean; | ||
|
||
private menuUpdater: RunOnceScheduler; | ||
private menuGC: RunOnceScheduler; | ||
|
||
private oldMenus: Menu[]; | ||
|
||
private menubarMenus: IMenubarData; | ||
|
||
|
@@ -56,6 +59,8 @@ export class Menubar { | |
) { | ||
this.menuUpdater = new RunOnceScheduler(() => this.doUpdateMenu(), 0); | ||
|
||
this.menuGC = new RunOnceScheduler(() => { this.oldMenus = this.oldMenus.slice(this.oldMenus.length - 1); }, 10000); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @sbatten I am not sure it helps to always keep the last menu around, I would probably empty the entire array after 10 seconds. Reason is that the user might be lucky to open the menu very early, then we got 2-3 updates and so the last menu in this array will not be the one the user had opened anyways. |
||
|
||
this.menubarMenus = this.stateService.getItem<IMenubarData>(Menubar.lastKnownMenubarStorageKey) || Object.create(null); | ||
|
||
this.keybindings = this.stateService.getItem<IMenubarData>(Menubar.lastKnownAdditionalKeybindings) || Object.create(null); | ||
|
@@ -64,6 +69,8 @@ export class Menubar { | |
|
||
this.closedLastWindow = false; | ||
|
||
this.oldMenus = []; | ||
|
||
this.install(); | ||
|
||
this.registerListeners(); | ||
|
@@ -203,6 +210,11 @@ export class Menubar { | |
|
||
private install(): void { | ||
|
||
const oldMenu = Menu.getApplicationMenu(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @sbatten again, comment to explain why |
||
if (oldMenu) { | ||
this.oldMenus.push(oldMenu); | ||
} | ||
|
||
// If we don't have a menu yet, set it to null to avoid the electron menu. | ||
// This should only happen on the first launch ever | ||
if (Object.keys(this.menubarMenus).length === 0) { | ||
|
@@ -293,15 +305,6 @@ export class Menubar { | |
menubar.append(macWindowMenuItem); | ||
} | ||
|
||
// Preferences | ||
sbatten marked this conversation as resolved.
Show resolved
Hide resolved
|
||
if (!isMacintosh) { | ||
const preferencesMenu = new Menu(); | ||
const preferencesMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mPreferences', comment: ['&& denotes a mnemonic'] }, "&&Preferences")), submenu: preferencesMenu }); | ||
|
||
this.setMenuById(preferencesMenu, 'Preferences'); | ||
menubar.append(preferencesMenuItem); | ||
} | ||
|
||
// Help | ||
const helpMenu = new Menu(); | ||
const helpMenuItem = new MenuItem({ label: this.mnemonicLabel(nls.localize({ key: 'mHelp', comment: ['&& denotes a mnemonic'] }, "&&Help")), submenu: helpMenu, role: 'help' }); | ||
|
@@ -314,6 +317,9 @@ export class Menubar { | |
} else { | ||
Menu.setApplicationMenu(null); | ||
} | ||
|
||
// Dispose of older menus after some time | ||
this.menuGC.schedule(); | ||
} | ||
|
||
private setMacApplicationMenu(macApplicationMenu: Electron.Menu): void { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@sbatten this needs a comment at least why we are doing it with a reference to the electron issue and a TODO to remove this when Electron fixed it!