From 6c7fe80ec5846bd17e5ff29e05a5061f1d110bec Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Fri, 30 May 2014 23:57:54 +0800 Subject: [PATCH] Bind TrayIcon to JS. --- atom.gyp | 5 ++ atom/browser/api/atom_api_menu.h | 2 + atom/browser/api/atom_api_tray.cc | 76 ++++++++++++++++++++++++++++++ atom/browser/api/atom_api_tray.h | 49 +++++++++++++++++++ atom/browser/api/lib/tray.coffee | 10 ++++ atom/browser/ui/tray_icon.h | 3 +- atom/browser/ui/tray_icon_cocoa.h | 6 +-- atom/browser/ui/tray_icon_cocoa.mm | 6 ++- atom/browser/ui/tray_icon_gtk.cc | 5 ++ atom/browser/ui/tray_icon_gtk.h | 6 +-- atom/browser/ui/tray_icon_win.cc | 5 ++ atom/browser/ui/tray_icon_win.h | 6 +-- atom/common/api/atom_extensions.h | 1 + 13 files changed, 169 insertions(+), 11 deletions(-) create mode 100644 atom/browser/api/atom_api_tray.cc create mode 100644 atom/browser/api/atom_api_tray.h create mode 100644 atom/browser/api/lib/tray.coffee diff --git a/atom.gyp b/atom.gyp index 426d9bf05431..3e0113632450 100644 --- a/atom.gyp +++ b/atom.gyp @@ -24,6 +24,7 @@ 'atom/browser/api/lib/menu-item.coffee', 'atom/browser/api/lib/power-monitor.coffee', 'atom/browser/api/lib/protocol.coffee', + 'atom/browser/api/lib/tray.coffee', 'atom/browser/api/lib/web-contents.coffee', 'atom/browser/lib/init.coffee', 'atom/browser/lib/objects-registry.coffee', @@ -62,6 +63,8 @@ 'atom/browser/api/atom_api_power_monitor.h', 'atom/browser/api/atom_api_protocol.cc', 'atom/browser/api/atom_api_protocol.h', + 'atom/browser/api/atom_api_tray.cc', + 'atom/browser/api/atom_api_tray.h', 'atom/browser/api/atom_api_web_contents.cc', 'atom/browser/api/atom_api_web_contents.h', 'atom/browser/api/atom_api_window.cc', @@ -184,6 +187,8 @@ 'atom/common/native_mate_converters/file_path_converter.h', 'atom/common/native_mate_converters/function_converter.h', 'atom/common/native_mate_converters/gurl_converter.h', + 'atom/common/native_mate_converters/image_converter.cc', + 'atom/common/native_mate_converters/image_converter.h', 'atom/common/native_mate_converters/string16_converter.h', 'atom/common/native_mate_converters/v8_value_converter.cc', 'atom/common/native_mate_converters/v8_value_converter.h', diff --git a/atom/browser/api/atom_api_menu.h b/atom/browser/api/atom_api_menu.h index a309e1b1eb40..2a212d0145a1 100644 --- a/atom/browser/api/atom_api_menu.h +++ b/atom/browser/api/atom_api_menu.h @@ -34,6 +34,8 @@ class Menu : public mate::Wrappable, static void SendActionToFirstResponder(const std::string& action); #endif + ui::SimpleMenuModel* model() const { return model_.get(); } + protected: Menu(); virtual ~Menu(); diff --git a/atom/browser/api/atom_api_tray.cc b/atom/browser/api/atom_api_tray.cc new file mode 100644 index 000000000000..41e1d180be31 --- /dev/null +++ b/atom/browser/api/atom_api_tray.cc @@ -0,0 +1,76 @@ +// Copyright (c) 2014 GitHub, Inc. All rights reserved. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/browser/api/atom_api_tray.h" + +#include "atom/browser/api/atom_api_menu.h" +#include "atom/browser/ui/tray_icon.h" +#include "atom/common/native_mate_converters/image_converter.h" +#include "native_mate/constructor.h" +#include "native_mate/dictionary.h" + +#include "atom/common/node_includes.h" + +namespace atom { + +namespace api { + +Tray::Tray(const gfx::ImageSkia& image) + : tray_icon_(TrayIcon::Create()) { + tray_icon_->SetImage(image); +} + +Tray::~Tray() { +} + +// static +mate::Wrappable* Tray::New(const gfx::ImageSkia& image) { + return new Tray(image); +} + +void Tray::SetImage(const gfx::ImageSkia& image) { + tray_icon_->SetImage(image); +} + +void Tray::SetPressedImage(const gfx::ImageSkia& image) { + tray_icon_->SetPressedImage(image); +} + +void Tray::SetToolTip(const std::string& tool_tip) { + tray_icon_->SetToolTip(tool_tip); +} + +void Tray::SetContextMenu(Menu* menu) { + tray_icon_->SetContextMenu(menu->model()); +} + +// static +void Tray::BuildPrototype(v8::Isolate* isolate, + v8::Handle prototype) { + mate::ObjectTemplateBuilder(isolate, prototype) + .SetMethod("setImage", &Tray::SetImage) + .SetMethod("setPressedImage", &Tray::SetPressedImage) + .SetMethod("setToolTip", &Tray::SetToolTip) + .SetMethod("_setContextMenu", &Tray::SetContextMenu); +} + +} // namespace api + +} // namespace atom + + +namespace { + +void Initialize(v8::Handle exports) { + using atom::api::Tray; + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::Handle constructor = mate::CreateConstructor( + isolate, "Tray", base::Bind(&Tray::New)); + mate::Dictionary dict(isolate, exports); + dict.Set("Tray", static_cast>(constructor)); +} + +} // namespace + +NODE_MODULE(atom_browser_tray, Initialize) diff --git a/atom/browser/api/atom_api_tray.h b/atom/browser/api/atom_api_tray.h new file mode 100644 index 000000000000..1ea95d92a3ef --- /dev/null +++ b/atom/browser/api/atom_api_tray.h @@ -0,0 +1,49 @@ +// Copyright (c) 2014 GitHub, Inc. All rights reserved. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_BROWSER_API_ATOM_API_TRAY_H_ +#define ATOM_BROWSER_API_ATOM_API_TRAY_H_ + +#include "atom/browser/api/event_emitter.h" +#include "base/memory/scoped_ptr.h" + +namespace gfx { +class ImageSkia; +} + +namespace atom { + +class TrayIcon; + +namespace api { + +class Menu; + +class Tray : public mate::EventEmitter { + public: + static mate::Wrappable* New(const gfx::ImageSkia& image); + + static void BuildPrototype(v8::Isolate* isolate, + v8::Handle prototype); + + protected: + Tray(const gfx::ImageSkia& image); + virtual ~Tray(); + + void SetImage(const gfx::ImageSkia& image); + void SetPressedImage(const gfx::ImageSkia& image); + void SetToolTip(const std::string& tool_tip); + void SetContextMenu(Menu* menu); + + private: + scoped_ptr tray_icon_; + + DISALLOW_COPY_AND_ASSIGN(Tray); +}; + +} // namespace api + +} // namespace atom + +#endif // ATOM_BROWSER_API_ATOM_API_TRAY_H_ diff --git a/atom/browser/api/lib/tray.coffee b/atom/browser/api/lib/tray.coffee new file mode 100644 index 000000000000..7d158a9a0104 --- /dev/null +++ b/atom/browser/api/lib/tray.coffee @@ -0,0 +1,10 @@ +EventEmitter = require('events').EventEmitter +bindings = process.atomBinding 'tray' + +Tray = bindings.Tray +Tray::__proto__ = EventEmitter.prototype +Tray::setContextMenu = (menu) -> + @_setContextMenu menu + @menu = menu # Keep a strong reference of menu. + +module.exports = Tray diff --git a/atom/browser/ui/tray_icon.h b/atom/browser/ui/tray_icon.h index ed96653bcdab..67f3150d40e2 100644 --- a/atom/browser/ui/tray_icon.h +++ b/atom/browser/ui/tray_icon.h @@ -15,6 +15,8 @@ class TrayIcon { public: static TrayIcon* Create(); + virtual ~TrayIcon(); + // Sets the image associated with this status icon. virtual void SetImage(const gfx::ImageSkia& image) = 0; @@ -32,7 +34,6 @@ class TrayIcon { protected: TrayIcon(); - virtual ~TrayIcon(); private: DISALLOW_COPY_AND_ASSIGN(TrayIcon); diff --git a/atom/browser/ui/tray_icon_cocoa.h b/atom/browser/ui/tray_icon_cocoa.h index eb18c15db1ee..c030a1f98445 100644 --- a/atom/browser/ui/tray_icon_cocoa.h +++ b/atom/browser/ui/tray_icon_cocoa.h @@ -18,15 +18,15 @@ namespace atom { class TrayIconCocoa : public TrayIcon { public: + TrayIconCocoa(); + virtual ~TrayIconCocoa(); + virtual void SetImage(const gfx::ImageSkia& image) OVERRIDE; virtual void SetPressedImage(const gfx::ImageSkia& image) OVERRIDE; virtual void SetToolTip(const std::string& tool_tip) OVERRIDE; virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) OVERRIDE; private: - TrayIconCocoa(); - virtual ~TrayIconCocoa(); - base::scoped_nsobject item_; // Status menu shown when right-clicking the system icon. diff --git a/atom/browser/ui/tray_icon_cocoa.mm b/atom/browser/ui/tray_icon_cocoa.mm index ee42c69e44de..f490015c97ee 100644 --- a/atom/browser/ui/tray_icon_cocoa.mm +++ b/atom/browser/ui/tray_icon_cocoa.mm @@ -41,9 +41,13 @@ void TrayIconCocoa::SetToolTip(const std::string& tool_tip) { } void TrayIconCocoa::SetContextMenu(ui::SimpleMenuModel* menu_model) { - TrayIcon::SetContextMenu(menu_model); menu_.reset([[AtomMenuController alloc] initWithModel:menu_model]); [item_ setMenu:[menu_ menu]]; } +// static +TrayIcon* TrayIcon::Create() { + return new TrayIconCocoa; +} + } // namespace atom diff --git a/atom/browser/ui/tray_icon_gtk.cc b/atom/browser/ui/tray_icon_gtk.cc index 40c5bbbb4abb..9069c0749b3b 100644 --- a/atom/browser/ui/tray_icon_gtk.cc +++ b/atom/browser/ui/tray_icon_gtk.cc @@ -24,4 +24,9 @@ void TrayIconGtk::SetToolTip(const std::string& tool_tip) { void TrayIconGtk::SetContextMenu(ui::SimpleMenuModel* menu_model) { } +// static +TrayIcon* TrayIcon::Create() { + return new TrayIconGtk; +} + } // namespace atom diff --git a/atom/browser/ui/tray_icon_gtk.h b/atom/browser/ui/tray_icon_gtk.h index da398e4eee94..cc66819cab29 100644 --- a/atom/browser/ui/tray_icon_gtk.h +++ b/atom/browser/ui/tray_icon_gtk.h @@ -13,15 +13,15 @@ namespace atom { class TrayIconGtk : public TrayIcon { public: + TrayIconGtk(); + virtual ~TrayIconGtk(); + virtual void SetImage(const gfx::ImageSkia& image) OVERRIDE; virtual void SetPressedImage(const gfx::ImageSkia& image) OVERRIDE; virtual void SetToolTip(const std::string& tool_tip) OVERRIDE; virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) OVERRIDE; private: - TrayIconGtk(); - virtual ~TrayIconGtk(); - DISALLOW_COPY_AND_ASSIGN(TrayIconGtk); }; diff --git a/atom/browser/ui/tray_icon_win.cc b/atom/browser/ui/tray_icon_win.cc index 0ef5b0fdef79..3c8e36ebc910 100644 --- a/atom/browser/ui/tray_icon_win.cc +++ b/atom/browser/ui/tray_icon_win.cc @@ -24,4 +24,9 @@ void TrayIconWin::SetToolTip(const std::string& tool_tip) { void TrayIconWin::SetContextMenu(ui::SimpleMenuModel* menu_model) { } +// static +TrayIcon* TrayIcon::Create() { + return new TrayIconWin; +} + } // namespace atom diff --git a/atom/browser/ui/tray_icon_win.h b/atom/browser/ui/tray_icon_win.h index b7077037d404..dcff1c480791 100644 --- a/atom/browser/ui/tray_icon_win.h +++ b/atom/browser/ui/tray_icon_win.h @@ -13,15 +13,15 @@ namespace atom { class TrayIconWin : public TrayIcon { public: + TrayIconWin(); + virtual ~TrayIconWin(); + virtual void SetImage(const gfx::ImageSkia& image) OVERRIDE; virtual void SetPressedImage(const gfx::ImageSkia& image) OVERRIDE; virtual void SetToolTip(const std::string& tool_tip) OVERRIDE; virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) OVERRIDE; private: - TrayIconWin(); - virtual ~TrayIconWin(); - DISALLOW_COPY_AND_ASSIGN(TrayIconWin); }; diff --git a/atom/common/api/atom_extensions.h b/atom/common/api/atom_extensions.h index 6d0a9166c191..39a4159c555e 100644 --- a/atom/common/api/atom_extensions.h +++ b/atom/common/api/atom_extensions.h @@ -15,6 +15,7 @@ NODE_EXT_LIST_ITEM(atom_browser_dialog) NODE_EXT_LIST_ITEM(atom_browser_menu) NODE_EXT_LIST_ITEM(atom_browser_power_monitor) NODE_EXT_LIST_ITEM(atom_browser_protocol) +NODE_EXT_LIST_ITEM(atom_browser_tray) NODE_EXT_LIST_ITEM(atom_browser_window) // Module names start with `atom_renderer_` can only be used by renderer