macdockiconhandler.mm raw

   1  // Copyright (c) 2011-present The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include "macdockiconhandler.h"
   6  
   7  #include <AppKit/AppKit.h>
   8  #include <objc/runtime.h>
   9  
  10  static MacDockIconHandler *s_instance = nullptr;
  11  
  12  bool dockClickHandler(id self, SEL _cmd, ...) {
  13      Q_UNUSED(self)
  14      Q_UNUSED(_cmd)
  15  
  16      Q_EMIT s_instance->dockIconClicked();
  17  
  18      // Return NO (false) to suppress the default macOS actions
  19      return false;
  20  }
  21  
  22  void setupDockClickHandler() {
  23      Class delClass = (Class)[[[NSApplication sharedApplication] delegate] class];
  24      SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:");
  25      class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:");
  26  }
  27  
  28  MacDockIconHandler::MacDockIconHandler() : QObject()
  29  {
  30      setupDockClickHandler();
  31  }
  32  
  33  MacDockIconHandler *MacDockIconHandler::instance()
  34  {
  35      if (!s_instance)
  36          s_instance = new MacDockIconHandler();
  37      return s_instance;
  38  }
  39  
  40  void MacDockIconHandler::cleanup()
  41  {
  42      delete s_instance;
  43  }
  44  
  45  /**
  46   * Force application activation on macOS. With Qt 5.5.1 this is required when
  47   * an action in the Dock menu is triggered.
  48   * TODO: Define a Qt version where it's no-longer necessary.
  49   */
  50  void ForceActivation()
  51  {
  52      [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
  53  }
  54