macdockiconhandler.mm
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 }