aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2015-03-16 13:54:07 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2015-03-16 13:55:35 +0100
commit226f880498f82aee0d59974142dea3eeec2a12ee (patch)
treeff6de21e2297f16b54780a38e9d2236176865d1f
parentf238add26ae1281481c15bdc252d2e4ef8f5a491 (diff)
parent8b60808c1eaddb402a699ba53d865932e08109ec (diff)
downloadbitcoin-226f880498f82aee0d59974142dea3eeec2a12ee.tar.xz
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)
-rw-r--r--src/qt/bitcoingui.cpp2
-rw-r--r--src/qt/macdockiconhandler.h9
-rw-r--r--src/qt/macdockiconhandler.mm61
3 files changed, 31 insertions, 41 deletions
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index 1ec968ff2b..58c005ae75 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -237,7 +237,7 @@ BitcoinGUI::~BitcoinGUI()
trayIcon->hide();
#ifdef Q_OS_MAC
delete appMenuBar;
- MacDockIconHandler::instance()->setMainWindow(NULL);
+ MacDockIconHandler::cleanup();
#endif
delete rpcConsole;
diff --git a/src/qt/macdockiconhandler.h b/src/qt/macdockiconhandler.h
index 1217bd8e88..15a6583ca4 100644
--- a/src/qt/macdockiconhandler.h
+++ b/src/qt/macdockiconhandler.h
@@ -14,12 +14,6 @@ class QMenu;
class QWidget;
QT_END_NAMESPACE
-#ifdef __OBJC__
-@class DockIconClickEventHandler;
-#else
-class DockIconClickEventHandler;
-#endif
-
/** Macintosh-specific dock icon handler.
*/
class MacDockIconHandler : public QObject
@@ -33,7 +27,7 @@ public:
void setIcon(const QIcon &icon);
void setMainWindow(QMainWindow *window);
static MacDockIconHandler *instance();
-
+ static void cleanup();
void handleDockIconClickEvent();
signals:
@@ -42,7 +36,6 @@ signals:
private:
MacDockIconHandler();
- DockIconClickEventHandler *m_dockIconClickEventHandler;
QWidget *m_dummyWidget;
QMenu *m_dockMenu;
QMainWindow *mainWindow;
diff --git a/src/qt/macdockiconhandler.mm b/src/qt/macdockiconhandler.mm
index e7b58b9cc0..58a0365d3d 100644
--- a/src/qt/macdockiconhandler.mm
+++ b/src/qt/macdockiconhandler.mm
@@ -11,52 +11,46 @@
#undef slots
#include <Cocoa/Cocoa.h>
+#include <objc/objc.h>
+#include <objc/message.h>
#if QT_VERSION < 0x050000
extern void qt_mac_set_dock_menu(QMenu *);
#endif
-@interface DockIconClickEventHandler : NSObject
-{
- MacDockIconHandler* dockIconHandler;
-}
-
-@end
+static MacDockIconHandler *s_instance = NULL;
-@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;
+bool dockClickHandler(id self,SEL _cmd,...) {
+ Q_UNUSED(self)
+ Q_UNUSED(_cmd)
+
+ s_instance->handleDockIconClickEvent();
+
+ // Return NO (false) to suppress the default OS X actions
+ return false;
}
-- (void)handleDockClickEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent
-{
- Q_UNUSED(event)
- Q_UNUSED(replyEvent)
-
- if (dockIconHandler) {
- dockIconHandler->handleDockIconClickEvent();
+void setupDockClickHandler() {
+ Class cls = objc_getClass("NSApplication");
+ id appInst = objc_msgSend((id)cls, sel_registerName("sharedApplication"));
+
+ if (appInst != NULL) {
+ 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()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- this->m_dockIconClickEventHandler = [[DockIconClickEventHandler alloc] initWithDockIconHandler:this];
+ setupDockClickHandler();
this->m_dummyWidget = new QWidget();
this->m_dockMenu = new QMenu(this->m_dummyWidget);
this->setMainWindow(NULL);
@@ -74,7 +68,6 @@ void MacDockIconHandler::setMainWindow(QMainWindow *window) {
MacDockIconHandler::~MacDockIconHandler()
{
- [this->m_dockIconClickEventHandler release];
delete this->m_dummyWidget;
this->setMainWindow(NULL);
}
@@ -119,12 +112,16 @@ void MacDockIconHandler::setIcon(const QIcon &icon)
MacDockIconHandler *MacDockIconHandler::instance()
{
- static MacDockIconHandler *s_instance = NULL;
if (!s_instance)
s_instance = new MacDockIconHandler();
return s_instance;
}
+void MacDockIconHandler::cleanup()
+{
+ delete s_instance;
+}
+
void MacDockIconHandler::handleDockIconClickEvent()
{
if (this->mainWindow)