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