diff --git a/atom/browser/api/atom_api_app.cc b/atom/browser/api/atom_api_app.cc index 4ba87d9cfa7f..829fed189010 100644 --- a/atom/browser/api/atom_api_app.cc +++ b/atom/browser/api/atom_api_app.cc @@ -7,6 +7,7 @@ #include #include +#include "atom/browser/api/atom_api_menu.h" #include "atom/browser/atom_browser_context.h" #include "atom/browser/browser.h" #include "atom/common/native_mate_converters/file_path_converter.h" @@ -191,12 +192,15 @@ int DockBounce(const std::string& type) { request_id = Browser::Get()->DockBounce(Browser::BOUNCE_INFORMATIONAL); return request_id; } + +void DockSetMenu(atom::api::Menu* menu) { + Browser::Get()->DockSetMenu(menu->model()); +} #endif void Initialize(v8::Handle exports, v8::Handle unused, v8::Handle context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); - Browser* browser = Browser::Get(); CommandLine* command_line = CommandLine::ForCurrentProcess(); mate::Dictionary dict(isolate, exports); @@ -206,20 +210,17 @@ void Initialize(v8::Handle exports, v8::Handle unused, base::Bind(&CommandLine::AppendArg, base::Unretained(command_line))); #if defined(OS_MACOSX) + auto browser = base::Unretained(Browser::Get()); dict.SetMethod("dockBounce", &DockBounce); dict.SetMethod("dockCancelBounce", - base::Bind(&Browser::DockCancelBounce, - base::Unretained(browser))); + base::Bind(&Browser::DockCancelBounce, browser)); dict.SetMethod("dockSetBadgeText", - base::Bind(&Browser::DockSetBadgeText, - base::Unretained(browser))); + base::Bind(&Browser::DockSetBadgeText, browser)); dict.SetMethod("dockGetBadgeText", - base::Bind(&Browser::DockGetBadgeText, - base::Unretained(browser))); - dict.SetMethod("dockHide", - base::Bind(&Browser::DockHide, base::Unretained(browser))); - dict.SetMethod("dockShow", - base::Bind(&Browser::DockShow, base::Unretained(browser))); + base::Bind(&Browser::DockGetBadgeText, browser)); + dict.SetMethod("dockHide", base::Bind(&Browser::DockHide, browser)); + dict.SetMethod("dockShow", base::Bind(&Browser::DockShow, browser)); + dict.SetMethod("dockSetMenu", &DockSetMenu); #endif } diff --git a/atom/browser/api/lib/app.coffee b/atom/browser/api/lib/app.coffee index a9962ca9cf6a..51fd66098ac0 100644 --- a/atom/browser/api/lib/app.coffee +++ b/atom/browser/api/lib/app.coffee @@ -26,6 +26,7 @@ if process.platform is 'darwin' getBadge: bindings.dockGetBadgeText hide: bindings.dockHide show: bindings.dockShow + setMenu: bindings.dockSetMenu # Be compatible with old API. app.once 'ready', -> app.emit 'finish-launching' diff --git a/atom/browser/atom_browser_main_parts_mac.mm b/atom/browser/atom_browser_main_parts_mac.mm index 587c7a26a19e..564dd2cd54e3 100644 --- a/atom/browser/atom_browser_main_parts_mac.mm +++ b/atom/browser/atom_browser_main_parts_mac.mm @@ -20,7 +20,7 @@ void AtomBrowserMainParts::PreMainMessageLoopStart() { // Force the NSApplication subclass to be used. NSApplication* application = [AtomApplication sharedApplication]; - AtomApplicationDelegate* delegate = [AtomApplicationDelegate alloc]; + AtomApplicationDelegate* delegate = [[AtomApplicationDelegate alloc] init]; [NSApp setDelegate:(id)delegate]; base::FilePath frameworkPath = brightray::MainApplicationBundlePath() diff --git a/atom/browser/browser.h b/atom/browser/browser.h index c409ce45a900..5cc05d1a4fcc 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -13,6 +13,10 @@ #include "atom/browser/browser_observer.h" #include "atom/browser/window_list_observer.h" +namespace ui { +class MenuModel; +} + namespace atom { // This class is used for control application-wide operations. @@ -60,6 +64,9 @@ class Browser : public WindowListObserver { // Hide/Show dock. void DockHide(); void DockShow(); + + // Set docks' menu. + void DockSetMenu(ui::MenuModel* model); #endif // defined(OS_MACOSX) // Tell the application to open a file. diff --git a/atom/browser/browser_mac.mm b/atom/browser/browser_mac.mm index 0e5c46a37a78..3d1b293d2ffc 100644 --- a/atom/browser/browser_mac.mm +++ b/atom/browser/browser_mac.mm @@ -5,6 +5,7 @@ #include "atom/browser/browser.h" #import "atom/browser/mac/atom_application.h" +#import "atom/browser/mac/atom_application_delegate.h" #include "atom/browser/native_window.h" #include "atom/browser/window_list.h" #import "base/mac/bundle_locations.h" @@ -60,4 +61,9 @@ void Browser::DockShow() { TransformProcessType(&psn, kProcessTransformToForegroundApplication); } +void Browser::DockSetMenu(ui::MenuModel* model) { + AtomApplicationDelegate* delegate = [NSApp delegate]; + [delegate setApplicationDockMenu:model]; +} + } // namespace atom diff --git a/atom/browser/mac/atom_application_delegate.h b/atom/browser/mac/atom_application_delegate.h index 437d76a772ca..3e5c59c3ff3d 100644 --- a/atom/browser/mac/atom_application_delegate.h +++ b/atom/browser/mac/atom_application_delegate.h @@ -4,7 +4,16 @@ #import +#import "atom/browser/ui/cocoa/atom_menu_controller.h" + @interface AtomApplicationDelegate : NSObject { + @private + base::scoped_nsobject menu_controller_; } +- (id)init; + +// Sets the menu that will be returned in "applicationDockMenu:". +- (void)setApplicationDockMenu:(ui::MenuModel*)model; + @end diff --git a/atom/browser/mac/atom_application_delegate.mm b/atom/browser/mac/atom_application_delegate.mm index 3ffa4a7ae99c..16dcf6fd9523 100644 --- a/atom/browser/mac/atom_application_delegate.mm +++ b/atom/browser/mac/atom_application_delegate.mm @@ -10,6 +10,16 @@ @implementation AtomApplicationDelegate +- (id)init { + self = [super init]; + menu_controller_.reset([[AtomMenuController alloc] init]); + return self; +} + +- (void)setApplicationDockMenu:(ui::MenuModel*)model { + [menu_controller_ populateWithModel:model]; +} + - (void)applicationWillFinishLaunching:(NSNotification*)notify { atom::Browser::Get()->WillFinishLaunching(); } @@ -18,6 +28,10 @@ atom::Browser::Get()->DidFinishLaunching(); } +- (NSMenu*)applicationDockMenu:(NSApplication*)sender { + return [menu_controller_ menu]; +} + - (BOOL)application:(NSApplication*)sender openFile:(NSString*)filename { std::string filename_str(base::SysNSStringToUTF8(filename)); diff --git a/atom/browser/ui/cocoa/atom_menu_controller.mm b/atom/browser/ui/cocoa/atom_menu_controller.mm index 69a7b56826d7..176f2db7e145 100644 --- a/atom/browser/ui/cocoa/atom_menu_controller.mm +++ b/atom/browser/ui/cocoa/atom_menu_controller.mm @@ -70,7 +70,8 @@ int EventFlagsFromNSEvent(NSEvent* event) { @synthesize model = model_; - (id)init { - self = [super init]; + if ((self = [super init])) + [self menu]; return self; }