mac: Add tray.getBounds() API
This commit is contained in:
		
					parent
					
						
							
								9993aab5b1
							
						
					
				
			
			
				commit
				
					
						db98e256f2
					
				
			
		
					 6 changed files with 29 additions and 11 deletions
				
			
		|  | @ -159,6 +159,10 @@ void Tray::SetContextMenu(v8::Isolate* isolate, mate::Handle<Menu> menu) { | |||
|   tray_icon_->SetContextMenu(menu->model()); | ||||
| } | ||||
| 
 | ||||
| gfx::Rect Tray::GetBounds() { | ||||
|   return tray_icon_->GetBounds(); | ||||
| } | ||||
| 
 | ||||
| v8::Local<v8::Object> Tray::ModifiersToObject(v8::Isolate* isolate, | ||||
|                                               int modifiers) { | ||||
|   mate::Dictionary obj(isolate, v8::Object::New(isolate)); | ||||
|  | @ -181,7 +185,8 @@ void Tray::BuildPrototype(v8::Isolate* isolate, | |||
|       .SetMethod("setHighlightMode", &Tray::SetHighlightMode) | ||||
|       .SetMethod("displayBalloon", &Tray::DisplayBalloon) | ||||
|       .SetMethod("popUpContextMenu", &Tray::PopUpContextMenu) | ||||
|       .SetMethod("setContextMenu", &Tray::SetContextMenu); | ||||
|       .SetMethod("setContextMenu", &Tray::SetContextMenu) | ||||
|       .SetMethod("getBounds", &Tray::GetBounds); | ||||
| } | ||||
| 
 | ||||
| }  // namespace api
 | ||||
|  |  | |||
|  | @ -65,6 +65,7 @@ class Tray : public mate::TrackableObject<Tray>, | |||
|   void DisplayBalloon(mate::Arguments* args, const mate::Dictionary& options); | ||||
|   void PopUpContextMenu(mate::Arguments* args); | ||||
|   void SetContextMenu(v8::Isolate* isolate, mate::Handle<Menu> menu); | ||||
|   gfx::Rect GetBounds(); | ||||
| 
 | ||||
|  private: | ||||
|   v8::Local<v8::Object> ModifiersToObject(v8::Isolate* isolate, int modifiers); | ||||
|  |  | |||
|  | @ -30,6 +30,10 @@ void TrayIcon::PopUpContextMenu(const gfx::Point& pos, | |||
|                                 ui::SimpleMenuModel* menu_model) { | ||||
| } | ||||
| 
 | ||||
| gfx::Rect TrayIcon::GetBounds() { | ||||
|   return gfx::Rect(); | ||||
| } | ||||
| 
 | ||||
| void TrayIcon::NotifyClicked(const gfx::Rect& bounds, int modifiers) { | ||||
|   FOR_EACH_OBSERVER(TrayIconObserver, observers_, OnClicked(bounds, modifiers)); | ||||
| } | ||||
|  |  | |||
|  | @ -60,8 +60,12 @@ class TrayIcon { | |||
|   // Set the context menu for this icon.
 | ||||
|   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 RemoveObserver(TrayIconObserver* obs) { observers_.RemoveObserver(obs); } | ||||
| 
 | ||||
|   void NotifyClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0); | ||||
|   void NotifyDoubleClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0); | ||||
|   void NotifyBalloonShow(); | ||||
|  |  | |||
|  | @ -32,6 +32,7 @@ class TrayIconCocoa : public TrayIcon, | |||
|   void PopUpContextMenu(const gfx::Point& pos, | ||||
|                         ui::SimpleMenuModel* menu_model) override; | ||||
|   void SetContextMenu(ui::SimpleMenuModel* menu_model) override; | ||||
|   gfx::Rect GetBounds() override; | ||||
| 
 | ||||
|  protected: | ||||
|   // AtomMenuModel::Observer:
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ | |||
| #include "base/strings/sys_string_conversions.h" | ||||
| #include "ui/events/cocoa/cocoa_event_utils.h" | ||||
| #include "ui/gfx/image/image.h" | ||||
| #include "ui/gfx/mac/coordinate_conversion.h" | ||||
| #include "ui/gfx/screen.h" | ||||
| 
 | ||||
| namespace { | ||||
|  | @ -236,13 +237,13 @@ const CGFloat kVerticalTitleMargin = 2; | |||
|   // Single click event. | ||||
|   if (event.clickCount == 1) | ||||
|     trayIcon_->NotifyClicked( | ||||
|         [self getBoundsFromEvent:event], | ||||
|         gfx::ScreenRectFromNSRect(event.window.frame), | ||||
|         ui::EventFlagsFromModifiers([event modifierFlags])); | ||||
| 
 | ||||
|   // Double click event. | ||||
|   if (event.clickCount == 2) | ||||
|     trayIcon_->NotifyDoubleClicked( | ||||
|         [self getBoundsFromEvent:event], | ||||
|         gfx::ScreenRectFromNSRect(event.window.frame), | ||||
|         ui::EventFlagsFromModifiers([event modifierFlags])); | ||||
| 
 | ||||
|   [self setNeedsDisplay:YES]; | ||||
|  | @ -273,7 +274,7 @@ const CGFloat kVerticalTitleMargin = 2; | |||
| 
 | ||||
| - (void)rightMouseUp:(NSEvent*)event { | ||||
|   trayIcon_->NotifyRightClicked( | ||||
|       [self getBoundsFromEvent:event], | ||||
|       gfx::ScreenRectFromNSRect(event.window.frame), | ||||
|       ui::EventFlagsFromModifiers([event modifierFlags])); | ||||
| } | ||||
| 
 | ||||
|  | @ -324,13 +325,6 @@ const CGFloat kVerticalTitleMargin = 2; | |||
|   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 | ||||
| 
 | ||||
| namespace atom { | ||||
|  | @ -386,6 +380,15 @@ void TrayIconCocoa::SetContextMenu(ui::SimpleMenuModel* menu_model) { | |||
|   [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() { | ||||
|   [status_item_view_ setNeedsDisplay:YES]; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cheng Zhao
				Cheng Zhao