1 // Copyright (c) 2011-2013 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.
5 #include "macnotificationhandler.h"
8 #import <objc/runtime.h>
9 #include <Cocoa/Cocoa.h>
11 // Add an obj-c category (extension) to return the expected bundle identifier
12 @implementation NSBundle(returnCorrectIdentifier)
13 - (NSString *)__bundleIdentifier
15 if (self == [NSBundle mainBundle]) {
16 return @"org.bitcoinfoundation.Bitcoin-Qt";
18 return [self __bundleIdentifier];
23 void MacNotificationHandler::showNotification(const QString &title, const QString &text)
25 // check if users OS has support for NSUserNotification
26 if(this->hasUserNotificationCenterSupport()) {
27 // okay, seems like 10.8+
28 QByteArray utf8 = title.toUtf8();
29 char* cString = (char *)utf8.constData();
30 NSString *titleMac = [[NSString alloc] initWithUTF8String:cString];
33 cString = (char *)utf8.constData();
34 NSString *textMac = [[NSString alloc] initWithUTF8String:cString];
36 // do everything weak linked (because we will keep <10.8 compatibility)
37 id userNotification = [[NSClassFromString(@"NSUserNotification") alloc] init];
38 [userNotification performSelector:@selector(setTitle:) withObject:titleMac];
39 [userNotification performSelector:@selector(setInformativeText:) withObject:textMac];
41 id notificationCenterInstance = [NSClassFromString(@"NSUserNotificationCenter") performSelector:@selector(defaultUserNotificationCenter)];
42 [notificationCenterInstance performSelector:@selector(deliverNotification:) withObject:userNotification];
46 [userNotification release];
50 // sendAppleScript just take a QString and executes it as apple script
51 void MacNotificationHandler::sendAppleScript(const QString &script)
53 QByteArray utf8 = script.toUtf8();
54 char* cString = (char *)utf8.constData();
55 NSString *scriptApple = [[NSString alloc] initWithUTF8String:cString];
57 NSAppleScript *as = [[NSAppleScript alloc] initWithSource:scriptApple];
58 NSDictionary *err = nil;
59 [as executeAndReturnError:&err];
61 [scriptApple release];
64 bool MacNotificationHandler::hasUserNotificationCenterSupport(void)
66 Class possibleClass = NSClassFromString(@"NSUserNotificationCenter");
68 // check if users OS has support for NSUserNotification
69 if(possibleClass!=nil) {
76 MacNotificationHandler *MacNotificationHandler::instance()
78 static MacNotificationHandler *s_instance = nullptr;
80 s_instance = new MacNotificationHandler();
82 Class aPossibleClass = objc_getClass("NSBundle");
84 // change NSBundle -bundleIdentifier method to return a correct bundle identifier
85 // a bundle identifier is required to use OSXs User Notification Center
86 method_exchangeImplementations(class_getInstanceMethod(aPossibleClass, @selector(bundleIdentifier)),
87 class_getInstanceMethod(aPossibleClass, @selector(__bundleIdentifier)));