You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.3 KiB
91 lines
3.3 KiB
// Copyright (c) 2011-2013 The Bitcoin Core developers |
|
// Distributed under the MIT software license, see the accompanying |
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|
|
|
#include "macnotificationhandler.h" |
|
|
|
#undef slots |
|
#import <objc/runtime.h> |
|
#include <Cocoa/Cocoa.h> |
|
|
|
// Add an obj-c category (extension) to return the expected bundle identifier |
|
@implementation NSBundle(returnCorrectIdentifier) |
|
- (NSString *)__bundleIdentifier |
|
{ |
|
if (self == [NSBundle mainBundle]) { |
|
return @"org.bitcoinfoundation.Bitcoin-Qt"; |
|
} else { |
|
return [self __bundleIdentifier]; |
|
} |
|
} |
|
@end |
|
|
|
void MacNotificationHandler::showNotification(const QString &title, const QString &text) |
|
{ |
|
// check if users OS has support for NSUserNotification |
|
if(this->hasUserNotificationCenterSupport()) { |
|
// okay, seems like 10.8+ |
|
QByteArray utf8 = title.toUtf8(); |
|
char* cString = (char *)utf8.constData(); |
|
NSString *titleMac = [[NSString alloc] initWithUTF8String:cString]; |
|
|
|
utf8 = text.toUtf8(); |
|
cString = (char *)utf8.constData(); |
|
NSString *textMac = [[NSString alloc] initWithUTF8String:cString]; |
|
|
|
// do everything weak linked (because we will keep <10.8 compatibility) |
|
id userNotification = [[NSClassFromString(@"NSUserNotification") alloc] init]; |
|
[userNotification performSelector:@selector(setTitle:) withObject:titleMac]; |
|
[userNotification performSelector:@selector(setInformativeText:) withObject:textMac]; |
|
|
|
id notificationCenterInstance = [NSClassFromString(@"NSUserNotificationCenter") performSelector:@selector(defaultUserNotificationCenter)]; |
|
[notificationCenterInstance performSelector:@selector(deliverNotification:) withObject:userNotification]; |
|
|
|
[titleMac release]; |
|
[textMac release]; |
|
[userNotification release]; |
|
} |
|
} |
|
|
|
// sendAppleScript just take a QString and executes it as apple script |
|
void MacNotificationHandler::sendAppleScript(const QString &script) |
|
{ |
|
QByteArray utf8 = script.toUtf8(); |
|
char* cString = (char *)utf8.constData(); |
|
NSString *scriptApple = [[NSString alloc] initWithUTF8String:cString]; |
|
|
|
NSAppleScript *as = [[NSAppleScript alloc] initWithSource:scriptApple]; |
|
NSDictionary *err = nil; |
|
[as executeAndReturnError:&err]; |
|
[as release]; |
|
[scriptApple release]; |
|
} |
|
|
|
bool MacNotificationHandler::hasUserNotificationCenterSupport(void) |
|
{ |
|
Class possibleClass = NSClassFromString(@"NSUserNotificationCenter"); |
|
|
|
// check if users OS has support for NSUserNotification |
|
if(possibleClass!=nil) { |
|
return true; |
|
} |
|
return false; |
|
} |
|
|
|
|
|
MacNotificationHandler *MacNotificationHandler::instance() |
|
{ |
|
static MacNotificationHandler *s_instance = NULL; |
|
if (!s_instance) { |
|
s_instance = new MacNotificationHandler(); |
|
|
|
Class aPossibleClass = objc_getClass("NSBundle"); |
|
if (aPossibleClass) { |
|
// change NSBundle -bundleIdentifier method to return a correct bundle identifier |
|
// a bundle identifier is required to use OSXs User Notification Center |
|
method_exchangeImplementations(class_getInstanceMethod(aPossibleClass, @selector(bundleIdentifier)), |
|
class_getInstanceMethod(aPossibleClass, @selector(__bundleIdentifier))); |
|
} |
|
} |
|
return s_instance; |
|
}
|
|
|