Fix: Prevent menu update while it's open (#12809)
* Update application menu on default runloop Menu change should be prevented while the menu is open * Fix code style * Memory safety
This commit is contained in:
parent
f068ed9ee7
commit
d2653e8192
1 changed files with 18 additions and 1 deletions
|
@ -16,6 +16,12 @@
|
||||||
|
|
||||||
using content::BrowserThread;
|
using content::BrowserThread;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
static scoped_nsobject<NSMenu> applicationMenu_;
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
namespace api {
|
namespace api {
|
||||||
|
@ -132,7 +138,18 @@ void Menu::SetApplicationMenu(Menu* base_menu) {
|
||||||
base::scoped_nsobject<AtomMenuController> menu_controller([
|
base::scoped_nsobject<AtomMenuController> menu_controller([
|
||||||
[AtomMenuController alloc] initWithModel:menu->model_.get()
|
[AtomMenuController alloc] initWithModel:menu->model_.get()
|
||||||
useDefaultAccelerator:YES]);
|
useDefaultAccelerator:YES]);
|
||||||
[NSApp setMainMenu:[menu_controller menu]];
|
|
||||||
|
NSRunLoop* currentRunLoop = [NSRunLoop currentRunLoop];
|
||||||
|
[currentRunLoop cancelPerformSelector:@selector(setMainMenu:)
|
||||||
|
target:NSApp
|
||||||
|
argument:applicationMenu_];
|
||||||
|
applicationMenu_.reset([[menu_controller menu] retain]);
|
||||||
|
[[NSRunLoop currentRunLoop]
|
||||||
|
performSelector:@selector(setMainMenu:)
|
||||||
|
target:NSApp
|
||||||
|
argument:applicationMenu_
|
||||||
|
order:0
|
||||||
|
modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]];
|
||||||
|
|
||||||
// Ensure the menu_controller_ is destroyed after main menu is set.
|
// Ensure the menu_controller_ is destroyed after main menu is set.
|
||||||
menu_controller.swap(menu->menu_controller_);
|
menu_controller.swap(menu->menu_controller_);
|
||||||
|
|
Loading…
Reference in a new issue