mac: Add tray.getBounds() API

This commit is contained in:
Cheng Zhao 2016-06-21 15:40:30 +09:00
parent 9993aab5b1
commit db98e256f2
6 changed files with 29 additions and 11 deletions

View file

@ -159,6 +159,10 @@ void Tray::SetContextMenu(v8::Isolate* isolate, mate::Handle<Menu> menu) {
tray_icon_->SetContextMenu(menu->model()); tray_icon_->SetContextMenu(menu->model());
} }
gfx::Rect Tray::GetBounds() {
return tray_icon_->GetBounds();
}
v8::Local<v8::Object> Tray::ModifiersToObject(v8::Isolate* isolate, v8::Local<v8::Object> Tray::ModifiersToObject(v8::Isolate* isolate,
int modifiers) { int modifiers) {
mate::Dictionary obj(isolate, v8::Object::New(isolate)); mate::Dictionary obj(isolate, v8::Object::New(isolate));
@ -181,7 +185,8 @@ void Tray::BuildPrototype(v8::Isolate* isolate,
.SetMethod("setHighlightMode", &Tray::SetHighlightMode) .SetMethod("setHighlightMode", &Tray::SetHighlightMode)
.SetMethod("displayBalloon", &Tray::DisplayBalloon) .SetMethod("displayBalloon", &Tray::DisplayBalloon)
.SetMethod("popUpContextMenu", &Tray::PopUpContextMenu) .SetMethod("popUpContextMenu", &Tray::PopUpContextMenu)
.SetMethod("setContextMenu", &Tray::SetContextMenu); .SetMethod("setContextMenu", &Tray::SetContextMenu)
.SetMethod("getBounds", &Tray::GetBounds);
} }
} // namespace api } // namespace api

View file

@ -65,6 +65,7 @@ class Tray : public mate::TrackableObject<Tray>,
void DisplayBalloon(mate::Arguments* args, const mate::Dictionary& options); void DisplayBalloon(mate::Arguments* args, const mate::Dictionary& options);
void PopUpContextMenu(mate::Arguments* args); void PopUpContextMenu(mate::Arguments* args);
void SetContextMenu(v8::Isolate* isolate, mate::Handle<Menu> menu); void SetContextMenu(v8::Isolate* isolate, mate::Handle<Menu> menu);
gfx::Rect GetBounds();
private: private:
v8::Local<v8::Object> ModifiersToObject(v8::Isolate* isolate, int modifiers); v8::Local<v8::Object> ModifiersToObject(v8::Isolate* isolate, int modifiers);

View file

@ -30,6 +30,10 @@ void TrayIcon::PopUpContextMenu(const gfx::Point& pos,
ui::SimpleMenuModel* menu_model) { ui::SimpleMenuModel* menu_model) {
} }
gfx::Rect TrayIcon::GetBounds() {
return gfx::Rect();
}
void TrayIcon::NotifyClicked(const gfx::Rect& bounds, int modifiers) { void TrayIcon::NotifyClicked(const gfx::Rect& bounds, int modifiers) {
FOR_EACH_OBSERVER(TrayIconObserver, observers_, OnClicked(bounds, modifiers)); FOR_EACH_OBSERVER(TrayIconObserver, observers_, OnClicked(bounds, modifiers));
} }

View file

@ -60,8 +60,12 @@ class TrayIcon {
// Set the context menu for this icon. // Set the context menu for this icon.
virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) = 0; virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) = 0;
// Returns the bounds of tray icon.
virtual gfx::Rect GetBounds();
void AddObserver(TrayIconObserver* obs) { observers_.AddObserver(obs); } void AddObserver(TrayIconObserver* obs) { observers_.AddObserver(obs); }
void RemoveObserver(TrayIconObserver* obs) { observers_.RemoveObserver(obs); } void RemoveObserver(TrayIconObserver* obs) { observers_.RemoveObserver(obs); }
void NotifyClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0); void NotifyClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0);
void NotifyDoubleClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0); void NotifyDoubleClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0);
void NotifyBalloonShow(); void NotifyBalloonShow();

View file

@ -32,6 +32,7 @@ class TrayIconCocoa : public TrayIcon,
void PopUpContextMenu(const gfx::Point& pos, void PopUpContextMenu(const gfx::Point& pos,
ui::SimpleMenuModel* menu_model) override; ui::SimpleMenuModel* menu_model) override;
void SetContextMenu(ui::SimpleMenuModel* menu_model) override; void SetContextMenu(ui::SimpleMenuModel* menu_model) override;
gfx::Rect GetBounds() override;
protected: protected:
// AtomMenuModel::Observer: // AtomMenuModel::Observer:

View file

@ -8,6 +8,7 @@
#include "base/strings/sys_string_conversions.h" #include "base/strings/sys_string_conversions.h"
#include "ui/events/cocoa/cocoa_event_utils.h" #include "ui/events/cocoa/cocoa_event_utils.h"
#include "ui/gfx/image/image.h" #include "ui/gfx/image/image.h"
#include "ui/gfx/mac/coordinate_conversion.h"
#include "ui/gfx/screen.h" #include "ui/gfx/screen.h"
namespace { namespace {
@ -236,13 +237,13 @@ const CGFloat kVerticalTitleMargin = 2;
// Single click event. // Single click event.
if (event.clickCount == 1) if (event.clickCount == 1)
trayIcon_->NotifyClicked( trayIcon_->NotifyClicked(
[self getBoundsFromEvent:event], gfx::ScreenRectFromNSRect(event.window.frame),
ui::EventFlagsFromModifiers([event modifierFlags])); ui::EventFlagsFromModifiers([event modifierFlags]));
// Double click event. // Double click event.
if (event.clickCount == 2) if (event.clickCount == 2)
trayIcon_->NotifyDoubleClicked( trayIcon_->NotifyDoubleClicked(
[self getBoundsFromEvent:event], gfx::ScreenRectFromNSRect(event.window.frame),
ui::EventFlagsFromModifiers([event modifierFlags])); ui::EventFlagsFromModifiers([event modifierFlags]));
[self setNeedsDisplay:YES]; [self setNeedsDisplay:YES];
@ -273,7 +274,7 @@ const CGFloat kVerticalTitleMargin = 2;
- (void)rightMouseUp:(NSEvent*)event { - (void)rightMouseUp:(NSEvent*)event {
trayIcon_->NotifyRightClicked( trayIcon_->NotifyRightClicked(
[self getBoundsFromEvent:event], gfx::ScreenRectFromNSRect(event.window.frame),
ui::EventFlagsFromModifiers([event modifierFlags])); ui::EventFlagsFromModifiers([event modifierFlags]));
} }
@ -324,13 +325,6 @@ const CGFloat kVerticalTitleMargin = 2;
return isHighlightEnable_ && (inMouseEventSequence_ || isMenuOpen); return isHighlightEnable_ && (inMouseEventSequence_ || isMenuOpen);
} }
- (gfx::Rect)getBoundsFromEvent:(NSEvent*)event {
NSRect frame = event.window.frame;
gfx::Rect bounds(frame.origin.x, 0, NSWidth(frame), NSHeight(frame));
NSScreen* screen = [[NSScreen screens] objectAtIndex:0];
bounds.set_y(NSHeight([screen frame]) - NSMaxY(frame));
return bounds;
}
@end @end
namespace atom { namespace atom {
@ -386,6 +380,15 @@ void TrayIconCocoa::SetContextMenu(ui::SimpleMenuModel* menu_model) {
[status_item_view_ setMenuController:menu_.get()]; [status_item_view_ setMenuController:menu_.get()];
} }
gfx::Rect TrayIconCocoa::GetBounds() {
auto bounds = gfx::ScreenRectFromNSRect([status_item_view_ window].frame);
// Calling [window frame] immediately after the view gets created will have
// negative |y| sometimes.
if (bounds.y() < 0)
bounds.set_y(0);
return bounds;
}
void TrayIconCocoa::MenuClosed() { void TrayIconCocoa::MenuClosed() {
[status_item_view_ setNeedsDisplay:YES]; [status_item_view_ setNeedsDisplay:YES];
} }