mac: Implement the "click" event of TrayIcon.
authorCheng Zhao <zcbenz@gmail.com>
Mon, 2 Jun 2014 03:28:23 +0000 (11:28 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Mon, 2 Jun 2014 03:28:23 +0000 (11:28 +0800)
atom/browser/api/atom_api_tray.cc
atom/browser/ui/tray_icon_cocoa.h
atom/browser/ui/tray_icon_cocoa.mm

index 1fc6aa9..49d9540 100644 (file)
@@ -21,6 +21,7 @@ namespace api {
 Tray::Tray(const gfx::ImageSkia& image)
     : tray_icon_(TrayIcon::Create()) {
   tray_icon_->SetImage(image);
+  tray_icon_->AddObserver(this);
 }
 
 Tray::~Tray() {
index c030a1f..b6a710c 100644 (file)
@@ -13,6 +13,7 @@
 #include "base/mac/scoped_nsobject.h"
 
 @class AtomMenuController;
+@class StatusItemController;
 
 namespace atom {
 
@@ -29,6 +30,8 @@ class TrayIconCocoa : public TrayIcon {
  private:
   base::scoped_nsobject<NSStatusItem> item_;
 
+  base::scoped_nsobject<StatusItemController> controller_;
+
   // Status menu shown when right-clicking the system icon.
   base::scoped_nsobject<AtomMenuController> menu_;
 
index f490015..0346163 100644 (file)
@@ -8,16 +8,44 @@
 #include "base/strings/sys_string_conversions.h"
 #include "skia/ext/skia_utils_mac.h"
 
+@interface StatusItemController : NSObject {
+  atom::TrayIconCocoa* trayIcon_; // weak
+}
+- (id)initWithIcon:(atom::TrayIconCocoa*)icon;
+- (void)handleClick:(id)sender;
+
+@end // @interface StatusItemController
+
+@implementation StatusItemController
+
+- (id)initWithIcon:(atom::TrayIconCocoa*)icon {
+  trayIcon_ = icon;
+  return self;
+}
+
+- (void)handleClick:(id)sender {
+  DCHECK(trayIcon_);
+  trayIcon_->NotifyClicked();
+}
+
+@end
+
 namespace atom {
 
 TrayIconCocoa::TrayIconCocoa() {
+  controller_.reset([[StatusItemController alloc] initWithIcon:this]);
+
   item_.reset([[[NSStatusBar systemStatusBar]
                 statusItemWithLength:NSVariableStatusItemLength] retain]);
   [item_ setEnabled:YES];
+  [item_ setTarget:controller_];
+  [item_ setAction:@selector(handleClick:)];
   [item_ setHighlightMode:YES];
 }
 
 TrayIconCocoa::~TrayIconCocoa() {
+  // Remove the status item from the status bar.
+  [[NSStatusBar systemStatusBar] removeStatusItem:item_];
 }
 
 void TrayIconCocoa::SetImage(const gfx::ImageSkia& image) {