Browse Source

Merge pull request #5880

8b60808 [QT] some mac specifiy cleanup (memory handling, unnecessary code) (Jonas Schnelli)
89e70e9 [QT] fix OSX dock icon window reopening (Jonas Schnelli)
0.13
Wladimir J. van der Laan 10 years ago
parent
commit
226f880498
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 2
      src/qt/bitcoingui.cpp
  2. 9
      src/qt/macdockiconhandler.h
  3. 55
      src/qt/macdockiconhandler.mm

2
src/qt/bitcoingui.cpp

@ -237,7 +237,7 @@ BitcoinGUI::~BitcoinGUI()
trayIcon->hide(); trayIcon->hide();
#ifdef Q_OS_MAC #ifdef Q_OS_MAC
delete appMenuBar; delete appMenuBar;
MacDockIconHandler::instance()->setMainWindow(NULL); MacDockIconHandler::cleanup();
#endif #endif
delete rpcConsole; delete rpcConsole;

9
src/qt/macdockiconhandler.h

@ -14,12 +14,6 @@ class QMenu;
class QWidget; class QWidget;
QT_END_NAMESPACE QT_END_NAMESPACE
#ifdef __OBJC__
@class DockIconClickEventHandler;
#else
class DockIconClickEventHandler;
#endif
/** Macintosh-specific dock icon handler. /** Macintosh-specific dock icon handler.
*/ */
class MacDockIconHandler : public QObject class MacDockIconHandler : public QObject
@ -33,7 +27,7 @@ public:
void setIcon(const QIcon &icon); void setIcon(const QIcon &icon);
void setMainWindow(QMainWindow *window); void setMainWindow(QMainWindow *window);
static MacDockIconHandler *instance(); static MacDockIconHandler *instance();
static void cleanup();
void handleDockIconClickEvent(); void handleDockIconClickEvent();
signals: signals:
@ -42,7 +36,6 @@ signals:
private: private:
MacDockIconHandler(); MacDockIconHandler();
DockIconClickEventHandler *m_dockIconClickEventHandler;
QWidget *m_dummyWidget; QWidget *m_dummyWidget;
QMenu *m_dockMenu; QMenu *m_dockMenu;
QMainWindow *mainWindow; QMainWindow *mainWindow;

55
src/qt/macdockiconhandler.mm

@ -11,52 +11,46 @@
#undef slots #undef slots
#include <Cocoa/Cocoa.h> #include <Cocoa/Cocoa.h>
#include <objc/objc.h>
#include <objc/message.h>
#if QT_VERSION < 0x050000 #if QT_VERSION < 0x050000
extern void qt_mac_set_dock_menu(QMenu *); extern void qt_mac_set_dock_menu(QMenu *);
#endif #endif
@interface DockIconClickEventHandler : NSObject static MacDockIconHandler *s_instance = NULL;
{
MacDockIconHandler* dockIconHandler;
}
@end
@implementation DockIconClickEventHandler bool dockClickHandler(id self,SEL _cmd,...) {
Q_UNUSED(self)
Q_UNUSED(_cmd)
- (id)initWithDockIconHandler:(MacDockIconHandler *)aDockIconHandler s_instance->handleDockIconClickEvent();
{
self = [super init];
if (self) {
dockIconHandler = aDockIconHandler;
[[NSAppleEventManager sharedAppleEventManager] // Return NO (false) to suppress the default OS X actions
setEventHandler:self return false;
andSelector:@selector(handleDockClickEvent:withReplyEvent:)
forEventClass:kCoreEventClass
andEventID:kAEReopenApplication];
}
return self;
} }
- (void)handleDockClickEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent void setupDockClickHandler() {
{ Class cls = objc_getClass("NSApplication");
Q_UNUSED(event) id appInst = objc_msgSend((id)cls, sel_registerName("sharedApplication"));
Q_UNUSED(replyEvent)
if (dockIconHandler) { if (appInst != NULL) {
dockIconHandler->handleDockIconClickEvent(); id delegate = objc_msgSend(appInst, sel_registerName("delegate"));
Class delClass = (Class)objc_msgSend(delegate, sel_registerName("class"));
SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:");
if (class_getInstanceMethod(delClass, shouldHandle))
class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:");
else
class_addMethod(delClass, shouldHandle, (IMP)dockClickHandler,"B@:");
} }
} }
@end
MacDockIconHandler::MacDockIconHandler() : QObject() MacDockIconHandler::MacDockIconHandler() : QObject()
{ {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
this->m_dockIconClickEventHandler = [[DockIconClickEventHandler alloc] initWithDockIconHandler:this]; setupDockClickHandler();
this->m_dummyWidget = new QWidget(); this->m_dummyWidget = new QWidget();
this->m_dockMenu = new QMenu(this->m_dummyWidget); this->m_dockMenu = new QMenu(this->m_dummyWidget);
this->setMainWindow(NULL); this->setMainWindow(NULL);
@ -74,7 +68,6 @@ void MacDockIconHandler::setMainWindow(QMainWindow *window) {
MacDockIconHandler::~MacDockIconHandler() MacDockIconHandler::~MacDockIconHandler()
{ {
[this->m_dockIconClickEventHandler release];
delete this->m_dummyWidget; delete this->m_dummyWidget;
this->setMainWindow(NULL); this->setMainWindow(NULL);
} }
@ -119,12 +112,16 @@ void MacDockIconHandler::setIcon(const QIcon &icon)
MacDockIconHandler *MacDockIconHandler::instance() MacDockIconHandler *MacDockIconHandler::instance()
{ {
static MacDockIconHandler *s_instance = NULL;
if (!s_instance) if (!s_instance)
s_instance = new MacDockIconHandler(); s_instance = new MacDockIconHandler();
return s_instance; return s_instance;
} }
void MacDockIconHandler::cleanup()
{
delete s_instance;
}
void MacDockIconHandler::handleDockIconClickEvent() void MacDockIconHandler::handleDockIconClickEvent()
{ {
if (this->mainWindow) if (this->mainWindow)

Loading…
Cancel
Save