#include "macdockiconhandler.h" #include #include #include #include #undef slots #include @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); [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 temp file hack (could also be done through QIODevice [memory]) QTemporaryFile notificationIconFile; if (!pixmap.isNull() && notificationIconFile.open()) { QImageWriter writer(¬ificationIconFile, "PNG"); if (writer.write(pixmap.toImage())) { const char *cString = notificationIconFile.fileName().toUtf8().data(); NSString *macString = [NSString stringWithCString:cString encoding:NSUTF8StringEncoding]; image = [[NSImage alloc] initWithContentsOfFile:macString]; } } 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(); }