diff --git a/build_scripts/OSX/MacOS_X_InstallGuide.md b/build_scripts/OSX/MacOS_X_InstallGuide.md index b3dc0e88d..4afa90e2c 100644 --- a/build_scripts/OSX/MacOS_X_InstallGuide.md +++ b/build_scripts/OSX/MacOS_X_InstallGuide.md @@ -66,7 +66,6 @@ Install MacPort following this guide: [MacPort](http://guide.macports.org/#insta $ sudo port -v selfupdate $ sudo port install openssl $ sudo port install miniupnpc - $ sudo port install libmicrohttpd For VOIP Plugin: @@ -83,9 +82,12 @@ Install HomeBrew following this guide: [HomeBrew](http://brew.sh/) $ brew install openssl $ brew install miniupnpc - $ brew install libmicrohttpd $ brew install rapidjson $ brew install sqlcipher + +#### Install CMake + + $ brew install cmake If you have error in linking, run this: @@ -101,7 +103,7 @@ For VOIP Plugin: For FeedReader Plugin: $ brew install libxslt - + $ brew install libxml2 ## Last Settings @@ -153,6 +155,9 @@ alternative via Terminal CONFIG+=release \ .. +For FeedReader Plugin: + + INCLUDEPATH += "/usr/local/opt/libxml2/include/libxml2" With plugins: @@ -207,3 +212,13 @@ For Qt Creator -> QtCreator Projects -> Build -> Build Settings -> Build Steps - ./plugins/VOIP/lib/libVOIP.dylib \ ./plugins/RetroChess/lib/libRetroChess.dylib \ ./retroshare-gui/src/RetroShare.app/Contents/Resources/ + +### Compile Retroshare-Service & Webui with CMake +before you can compile overwrite the file "asio/include/asio/detail/config.hpp" here is a fix for macos [ +asio fix](https://github.com/chriskohlhoff/asio/commit/68df16d560c68944809bb2947360fe8035e9ae0a) + + $ cd retroshare-service + $ mkdir build-dir + $ cd build-dir + $ cmake -DRS_WEBUI=ON -DCMAKE_BUILD_TYPE=Release .. + $ make diff --git a/build_scripts/OSX/makeOSXPackage.sh b/build_scripts/OSX/makeOSXPackage.sh index b599df3c3..24808d487 100644 --- a/build_scripts/OSX/makeOSXPackage.sh +++ b/build_scripts/OSX/makeOSXPackage.sh @@ -18,7 +18,7 @@ rm -rf obj rm -rf qrc # This sets the CFBundleVersion & CFBundleShortVersionString string -#/usr/libexec/PlistBuddy -c "Delete :CFBundleGetInfoString" retroshare.app/Contents/Info.plist +/usr/libexec/PlistBuddy -c "Delete :CFBundleGetInfoString" retroshare.app/Contents/Info.plist /usr/libexec/PlistBuddy -c "Add :CFBundleVersion string $RSVERSION" retroshare.app/Contents/Info.plist /usr/libexec/PlistBuddy -c "Add :CFBundleShortVersionString string $RSVERSION" retroshare.app/Contents/Info.plist diff --git a/retroshare-gui/src/gui/MainWindow.cpp b/retroshare-gui/src/gui/MainWindow.cpp index 31fa13467..d69e2bb42 100644 --- a/retroshare-gui/src/gui/MainWindow.cpp +++ b/retroshare-gui/src/gui/MainWindow.cpp @@ -33,6 +33,10 @@ #include #include +#if defined(Q_OS_DARWIN) +#include "gui/common/MacDockIconHandler.h" +#endif + #ifdef MESSENGER_WINDOW #include "MessengerWindow.h" #endif @@ -381,6 +385,7 @@ MainWindow::~MainWindow() #if defined(Q_OS_DARWIN) delete menuBar; delete dockMenu; + MacDockIconHandler::cleanup(); #endif // delete notifyMenu; // already deleted by the deletion of trayMenu StatisticsWindow::releaseInstance(); @@ -656,6 +661,15 @@ void MainWindow::createTrayIcon() trayIcon->setContextMenu(trayMenu); trayIcon->setIcon(QIcon(IMAGE_NOONLINE)); +#if defined(Q_OS_DARWIN) + // Note: On macOS, the Dock icon is used to provide the tray's functionality. + MacDockIconHandler* dockIconHandler = MacDockIconHandler::instance(); + connect(dockIconHandler, &MacDockIconHandler::dockIconClicked, [this] { + show(); + activateWindow(); + }); +#endif + #if defined(Q_OS_DARWIN) createMenuBar(); #endif @@ -673,24 +687,27 @@ void MainWindow::createMenuBar() actionMinimize->setShortcutContext(Qt::ApplicationShortcut); actionMinimize->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); actionMinimize->setShortcutVisibleInContextMenu(true); - connect(actionMinimize,SIGNAL(triggered()),this,SLOT(showMinimized())) ; + connect(actionMinimize,SIGNAL(triggered()),this,SLOT(minimizeWindow())) ; + + actionCloseWindow = new QAction(tr("Close window"),this); + actionCloseWindow->setShortcutContext(Qt::ApplicationShortcut); + actionCloseWindow->setShortcut(QKeySequence::Close); + actionCloseWindow->setShortcutVisibleInContextMenu(true); + connect(actionCloseWindow,SIGNAL(triggered()),this,SLOT(closeWindow())) ; menuBar = new QMenuBar(this); QMenu *fileMenu = menuBar->addMenu(""); fileMenu->addAction(actionMinimize); + fileMenu->addAction(actionCloseWindow); dockMenu = new QMenu(this); dockMenu->setAsDockMenu(); - dockMenu->addAction(tr("Open Messages"), this, SLOT(Mess())); + dockMenu->addAction(tr("Open Messages"), this, SLOT(showMess())); dockMenu->addAction(tr("Bandwidth Graph"), this, SLOT(showBandwidthGraph())); dockMenu->addAction(tr("Statistics"), this, SLOT(showStatisticsWindow())); dockMenu->addAction(tr("Options"), this, SLOT(showSettings())); dockMenu->addAction(tr("Help"), this, SLOT(showHelpDialog())); - dockMenu->addSeparator(); - QObject::connect(dockMenu, SIGNAL(aboutToShow()), this, SLOT(updateMenu())); - toggleVisibilityAction = dockMenu->addAction(tr("Show/Hide"), this, SLOT(toggleVisibilitycontextmenu())); - dockMenu->addSeparator(); QMenu *statusMenu = dockMenu->addMenu(tr("Status")); initializeStatusObject(statusMenu, true); @@ -698,6 +715,21 @@ void MainWindow::createMenuBar() } #endif +#if defined(Q_OS_DARWIN) +void MainWindow::minimizeWindow() +{ + setWindowState(windowState() | Qt::WindowMinimized); +} +#endif + +#if defined(Q_OS_DARWIN) +void MainWindow::closeWindow() +{ + // On macOS window close is basically equivalent to window hide. + close(); +} +#endif + void MainWindow::showBandwidthGraph() { if(_bandwidthGraph == NULL) diff --git a/retroshare-gui/src/gui/MainWindow.h b/retroshare-gui/src/gui/MainWindow.h index 692d7ed55..64211d67d 100644 --- a/retroshare-gui/src/gui/MainWindow.h +++ b/retroshare-gui/src/gui/MainWindow.h @@ -265,6 +265,11 @@ private slots: void toggleVisibility(QSystemTrayIcon::ActivationReason e); void toggleVisibilitycontextmenu(); +#if defined(Q_OS_DARWIN) + void minimizeWindow(); + void closeWindow(); +#endif + /** Toolbar fns. */ void addFriend(); //void newRsCollection(); @@ -333,6 +338,7 @@ private: QMenuBar *menuBar; QMenu *dockMenu; QAction* actionMinimize; + QAction* actionCloseWindow; #endif QSystemTrayIcon *trayIcon; diff --git a/retroshare-gui/src/gui/common/MacDockIconHandler.h b/retroshare-gui/src/gui/common/MacDockIconHandler.h new file mode 100644 index 000000000..d9d4d41f5 --- /dev/null +++ b/retroshare-gui/src/gui/common/MacDockIconHandler.h @@ -0,0 +1,27 @@ +// Copyright (c) 2011-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef MACDOCKICONHANDLER_H +#define MACDOCKICONHANDLER_H + +#include + +/** macOS-specific Dock icon handler. + */ +class MacDockIconHandler : public QObject +{ + Q_OBJECT + +public: + static MacDockIconHandler *instance(); + static void cleanup(); + +Q_SIGNALS: + void dockIconClicked(); + +private: + MacDockIconHandler(); +}; + +#endif // MACDOCKICONHANDLER_H diff --git a/retroshare-gui/src/gui/common/MacDockIconHandler.mm b/retroshare-gui/src/gui/common/MacDockIconHandler.mm new file mode 100644 index 000000000..51a26135d --- /dev/null +++ b/retroshare-gui/src/gui/common/MacDockIconHandler.mm @@ -0,0 +1,53 @@ +// Copyright (c) 2011-2019 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 "MacDockIconHandler.h" + +#include +#include + +static MacDockIconHandler *s_instance = nullptr; + +bool dockClickHandler(id self, SEL _cmd, ...) { + Q_UNUSED(self) + Q_UNUSED(_cmd) + + Q_EMIT s_instance->dockIconClicked(); + + // Return NO (false) to suppress the default macOS actions + return false; +} + +void setupDockClickHandler() { + Class delClass = (Class)[[[NSApplication sharedApplication] delegate] class]; + SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:"); + class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:"); +} + +MacDockIconHandler::MacDockIconHandler() : QObject() +{ + setupDockClickHandler(); +} + +MacDockIconHandler *MacDockIconHandler::instance() +{ + if (!s_instance) + s_instance = new MacDockIconHandler(); + return s_instance; +} + +void MacDockIconHandler::cleanup() +{ + delete s_instance; +} + +/** + * Force application activation on macOS. With Qt 5.5.1 this is required when + * an action in the Dock menu is triggered. + * TODO: Define a Qt version where it's no-longer necessary. + */ +void ForceActivation() +{ + [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; +} diff --git a/retroshare-gui/src/gui/settings/rsharesettings.cpp b/retroshare-gui/src/gui/settings/rsharesettings.cpp index 586d4df4f..28a29300c 100644 --- a/retroshare-gui/src/gui/settings/rsharesettings.cpp +++ b/retroshare-gui/src/gui/settings/rsharesettings.cpp @@ -109,7 +109,7 @@ void RshareSettings::initSettings() setDefault(SETTING_STYLE, "GTK+"); #else #if defined(Q_OS_MAC) - setDefault(SETTING_STYLE, "macintosh (aqua)"); + setDefault(SETTING_STYLE, "Fusion"); #else static QStringList styles = QStyleFactory::keys(); #if defined(Q_OS_WIN) diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index 93734b454..b27102d42 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -304,6 +304,9 @@ macx { #DEFINES *= MAC_IDLE # for idle feature CONFIG -= uitools + + OBJECTIVE_SOURCES += gui/common/MacDockIconHandler.mm + OBJECTIVE_HEADERS += gui/common/MacDockIconHandler.h } ##################################### FreeBSD ######################################