Browse Source

feat: add tray.focus() (#19548)

Milan Burda 5 years ago
parent
commit
03debb4ef9

+ 7 - 0
docs/api/tray.md

@@ -240,6 +240,13 @@ Displays a tray balloon.
 
 Removes a tray balloon.
 
+#### `tray.focus()` _Windows_
+
+Returns focus to the taskbar notification area.
+Notification area icons should use this message when they have completed their UI operation.
+For example, if the icon displays a shortcut menu, but the user presses ESC to cancel it,
+use `tray.focus()` to return focus to the notification area.
+
 #### `tray.popUpContextMenu([menu, position])` _macOS_ _Windows_
 
 * `menu` Menu (optional)

+ 5 - 0
shell/browser/api/atom_api_tray.cc

@@ -221,6 +221,10 @@ void Tray::RemoveBalloon() {
   tray_icon_->RemoveBalloon();
 }
 
+void Tray::Focus() {
+  tray_icon_->Focus();
+}
+
 void Tray::PopUpContextMenu(mate::Arguments* args) {
   mate::Handle<Menu> menu;
   args->GetNext(&menu);
@@ -255,6 +259,7 @@ void Tray::BuildPrototype(v8::Isolate* isolate,
                  &Tray::GetIgnoreDoubleClickEvents)
       .SetMethod("displayBalloon", &Tray::DisplayBalloon)
       .SetMethod("removeBalloon", &Tray::RemoveBalloon)
+      .SetMethod("focus", &Tray::Focus)
       .SetMethod("popUpContextMenu", &Tray::PopUpContextMenu)
       .SetMethod("setContextMenu", &Tray::SetContextMenu)
       .SetMethod("getBounds", &Tray::GetBounds);

+ 1 - 0
shell/browser/api/atom_api_tray.h

@@ -74,6 +74,7 @@ class Tray : public mate::TrackableObject<Tray>, public TrayIconObserver {
   bool GetIgnoreDoubleClickEvents();
   void DisplayBalloon(mate::Arguments* args, const mate::Dictionary& options);
   void RemoveBalloon();
+  void Focus();
   void PopUpContextMenu(mate::Arguments* args);
   void SetContextMenu(v8::Isolate* isolate, mate::Handle<Menu> menu);
   gfx::Rect GetBounds();

+ 2 - 0
shell/browser/ui/tray_icon.cc

@@ -18,6 +18,8 @@ void TrayIcon::DisplayBalloon(const BalloonOptions& options) {}
 
 void TrayIcon::RemoveBalloon() {}
 
+void TrayIcon::Focus() {}
+
 void TrayIcon::PopUpContextMenu(const gfx::Point& pos,
                                 AtomMenuModel* menu_model) {}
 

+ 3 - 0
shell/browser/ui/tray_icon.h

@@ -74,6 +74,9 @@ class TrayIcon {
   // Removes the notification balloon.
   virtual void RemoveBalloon();
 
+  // Returns focus to the taskbar notification area.
+  virtual void Focus();
+
   // Popups the menu.
   virtual void PopUpContextMenu(const gfx::Point& pos,
                                 AtomMenuModel* menu_model);

+ 9 - 0
shell/browser/ui/win/notify_icon.cc

@@ -176,6 +176,15 @@ void NotifyIcon::RemoveBalloon() {
     LOG(WARNING) << "Unable to remove status tray balloon.";
 }
 
+void NotifyIcon::Focus() {
+  NOTIFYICONDATA icon_data;
+  InitIconData(&icon_data);
+
+  BOOL result = Shell_NotifyIcon(NIM_SETFOCUS, &icon_data);
+  if (!result)
+    LOG(WARNING) << "Unable to focus tray icon.";
+}
+
 void NotifyIcon::PopUpContextMenu(const gfx::Point& pos,
                                   AtomMenuModel* menu_model) {
   // Returns if context menu isn't set.

+ 1 - 0
shell/browser/ui/win/notify_icon.h

@@ -60,6 +60,7 @@ class NotifyIcon : public TrayIcon {
   void SetToolTip(const std::string& tool_tip) override;
   void DisplayBalloon(const BalloonOptions& options) override;
   void RemoveBalloon() override;
+  void Focus() override;
   void PopUpContextMenu(const gfx::Point& pos,
                         AtomMenuModel* menu_model) override;
   void SetContextMenu(AtomMenuModel* menu_model) override;