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.
137 lines
3.7 KiB
137 lines
3.7 KiB
// Copyright (c) 2011-2013 The Bitcoin Core developers |
|
// Distributed under the MIT/X11 software license, see the accompanying |
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php. |
|
|
|
#include "macdockiconhandler.h" |
|
|
|
#include <QImageWriter> |
|
#include <QMenu> |
|
#include <QBuffer> |
|
#include <QWidget> |
|
|
|
#undef slots |
|
#include <Cocoa/Cocoa.h> |
|
|
|
#if QT_VERSION < 0x050000 |
|
extern void qt_mac_set_dock_menu(QMenu *); |
|
#endif |
|
|
|
@interface DockIconClickEventHandler : NSObject |
|
{ |
|
MacDockIconHandler* dockIconHandler; |
|
} |
|
|
|
@end |
|
|
|
@implementation DockIconClickEventHandler |
|
|
|
- (id)initWithDockIconHandler:(MacDockIconHandler *)aDockIconHandler |
|
{ |
|
self = [super init]; |
|
if (self) { |
|
dockIconHandler = aDockIconHandler; |
|
|
|
[[NSAppleEventManager sharedAppleEventManager] |
|
setEventHandler:self |
|
andSelector:@selector(handleDockClickEvent:withReplyEvent:) |
|
forEventClass:kCoreEventClass |
|
andEventID:kAEReopenApplication]; |
|
} |
|
return self; |
|
} |
|
|
|
- (void)handleDockClickEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent |
|
{ |
|
Q_UNUSED(event) |
|
Q_UNUSED(replyEvent) |
|
|
|
if (dockIconHandler) { |
|
dockIconHandler->handleDockIconClickEvent(); |
|
} |
|
} |
|
|
|
@end |
|
|
|
MacDockIconHandler::MacDockIconHandler() : QObject() |
|
{ |
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; |
|
|
|
this->m_dockIconClickEventHandler = [[DockIconClickEventHandler alloc] initWithDockIconHandler:this]; |
|
this->m_dummyWidget = new QWidget(); |
|
this->m_dockMenu = new QMenu(this->m_dummyWidget); |
|
this->setMainWindow(NULL); |
|
#if QT_VERSION < 0x050000 |
|
qt_mac_set_dock_menu(this->m_dockMenu); |
|
#elif QT_VERSION >= 0x050200 |
|
this->m_dockMenu->setAsDockMenu(); |
|
#endif |
|
[pool release]; |
|
} |
|
|
|
void MacDockIconHandler::setMainWindow(QMainWindow *window) { |
|
this->mainWindow = window; |
|
} |
|
|
|
MacDockIconHandler::~MacDockIconHandler() |
|
{ |
|
[this->m_dockIconClickEventHandler release]; |
|
delete this->m_dummyWidget; |
|
this->setMainWindow(NULL); |
|
} |
|
|
|
QMenu *MacDockIconHandler::dockMenu() |
|
{ |
|
return this->m_dockMenu; |
|
} |
|
|
|
void MacDockIconHandler::setIcon(const QIcon &icon) |
|
{ |
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; |
|
NSImage *image = nil; |
|
if (icon.isNull()) |
|
image = [[NSImage imageNamed:@"NSApplicationIcon"] retain]; |
|
else { |
|
// generate NSImage from QIcon and use this as dock icon. |
|
QSize size = icon.actualSize(QSize(128, 128)); |
|
QPixmap pixmap = icon.pixmap(size); |
|
|
|
// Write image into a R/W buffer from raw pixmap, then save the image. |
|
QBuffer notificationBuffer; |
|
if (!pixmap.isNull() && notificationBuffer.open(QIODevice::ReadWrite)) { |
|
QImageWriter writer(¬ificationBuffer, "PNG"); |
|
if (writer.write(pixmap.toImage())) { |
|
NSData* macImgData = [NSData dataWithBytes:notificationBuffer.buffer().data() |
|
length:notificationBuffer.buffer().size()]; |
|
image = [[NSImage alloc] initWithData:macImgData]; |
|
} |
|
} |
|
|
|
if(!image) { |
|
// if testnet image could not be created, load std. app icon |
|
image = [[NSImage imageNamed:@"NSApplicationIcon"] retain]; |
|
} |
|
} |
|
|
|
[NSApp setApplicationIconImage:image]; |
|
[image release]; |
|
[pool release]; |
|
} |
|
|
|
MacDockIconHandler *MacDockIconHandler::instance() |
|
{ |
|
static MacDockIconHandler *s_instance = NULL; |
|
if (!s_instance) |
|
s_instance = new MacDockIconHandler(); |
|
return s_instance; |
|
} |
|
|
|
void MacDockIconHandler::handleDockIconClickEvent() |
|
{ |
|
if (this->mainWindow) |
|
{ |
|
this->mainWindow->activateWindow(); |
|
this->mainWindow->show(); |
|
} |
|
|
|
emit this->dockIconClicked(); |
|
}
|
|
|