From c783b666729beff5b2654692d795285ba41b47ff Mon Sep 17 00:00:00 2001 From: Yuriy Puchkov Date: Wed, 2 Dec 2020 15:45:28 +0200 Subject: [PATCH] MacOS - QSystemTrayIcon does not show context menu on primary screen --- src/core/controller.cpp | 39 ++++++++++++++++++++++++++++----------- src/core/controller.h | 2 ++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/core/controller.cpp b/src/core/controller.cpp index 446f958e..cf4041f4 100644 --- a/src/core/controller.cpp +++ b/src/core/controller.cpp @@ -50,6 +50,7 @@ Controller::Controller() : m_captureWindow(nullptr) { m_history = nullptr; + m_trayIconMenu = nullptr; qApp->setQuitOnLastWindowClosed(false); @@ -87,6 +88,7 @@ Controller::Controller() Controller::~Controller() { delete m_history; + delete m_trayIconMenu; } Controller* Controller::getInstance() @@ -241,7 +243,7 @@ void Controller::enableTrayIcon() if (m_trayIcon) { return; } - QMenu* trayIconMenu = new QMenu(); + m_trayIconMenu = new QMenu(); ConfigHandler().setDisabledTrayIcon(false); QAction* captureAction = new QAction(tr("&Take Screenshot"), this); @@ -268,19 +270,22 @@ void Controller::enableTrayIcon() recentAction, SIGNAL(triggered()), this, SLOT(showRecentScreenshots())); // generate menu - trayIconMenu->addAction(captureAction); - trayIconMenu->addAction(launcherAction); - trayIconMenu->addSeparator(); - trayIconMenu->addAction(recentAction); - trayIconMenu->addSeparator(); - trayIconMenu->addAction(configAction); - trayIconMenu->addAction(infoAction); - trayIconMenu->addSeparator(); - trayIconMenu->addAction(quitAction); + m_trayIconMenu->addAction(captureAction); + m_trayIconMenu->addAction(launcherAction); + m_trayIconMenu->addSeparator(); + m_trayIconMenu->addAction(recentAction); + m_trayIconMenu->addSeparator(); + m_trayIconMenu->addAction(configAction); + m_trayIconMenu->addAction(infoAction); + m_trayIconMenu->addSeparator(); + m_trayIconMenu->addAction(quitAction); m_trayIcon = new QSystemTrayIcon(); m_trayIcon->setToolTip(QStringLiteral("Flameshot")); - m_trayIcon->setContextMenu(trayIconMenu); +#if not(defined(Q_OS_WIN) || defined(Q_OS_MAC) || defined(Q_OS_MAC64) || \ + defined(Q_OS_MACOS) || defined(Q_OS_MACX)) + m_trayIcon->setContextMenu(m_trayIconMenu); +#endif QIcon trayicon = QIcon::fromTheme("flameshot-tray", QIcon(":img/app/flameshot.png")); m_trayIcon->setIcon(trayicon); @@ -293,6 +298,18 @@ void Controller::enableTrayIcon() } }; connect(m_trayIcon, &QSystemTrayIcon::activated, this, trayIconActivated); +#else + // Because of the following issues: + // https://bugreports.qt.io/browse/QTBUG-86393 + // https://developer.apple.com/forums/thread/126072 + auto trayIconActivated = [this](QSystemTrayIcon::ActivationReason r) { + if (m_trayIconMenu->isVisible()) { + m_trayIconMenu->hide(); + } else { + m_trayIconMenu->popup(QPoint(QCursor::pos().x(), 0)); + } + }; + connect(m_trayIcon, &QSystemTrayIcon::activated, this, trayIconActivated); #endif #ifdef Q_OS_WIN diff --git a/src/core/controller.h b/src/core/controller.h index 54cca5cc..c061f6d8 100644 --- a/src/core/controller.h +++ b/src/core/controller.h @@ -19,6 +19,7 @@ #include "src/core/capturerequest.h" #include +#include #include #include #include @@ -92,4 +93,5 @@ private: QPointer m_trayIcon; HistoryWidget* m_history; + QMenu* m_trayIconMenu; };