#include "trayicon.h" #include "src/core/flameshot.h" #include "src/core/flameshotdaemon.h" #include "src/utils/globalvalues.h" #include "src/utils/confighandler.h" #include #include #include #include #include #if defined(Q_OS_MACOS) #include #endif TrayIcon::TrayIcon(QObject* parent) : QSystemTrayIcon(parent) { initMenu(); setToolTip(QStringLiteral("Flameshot")); #if defined(Q_OS_MACOS) // Because of the following issues on MacOS "Catalina": // https://bugreports.qt.io/browse/QTBUG-86393 // https://developer.apple.com/forums/thread/126072 auto currentMacOsVersion = QOperatingSystemVersion::current(); if (currentMacOsVersion >= currentMacOsVersion.MacOSBigSur) { setContextMenu(m_menu); } #else setContextMenu(m_menu); #endif QIcon icon = QIcon::fromTheme("flameshot-tray", QIcon(GlobalValues::iconPathPNG())); setIcon(icon); #if defined(Q_OS_MACOS) if (currentMacOsVersion < currentMacOsVersion.MacOSBigSur) { // Because of the following issues on MacOS "Catalina": // https://bugreports.qt.io/browse/QTBUG-86393 // https://developer.apple.com/forums/thread/126072 auto trayIconActivated = [this](QSystemTrayIcon::ActivationReason r) { if (m_menu->isVisible()) { m_menu->hide(); } else { m_menu->popup(QCursor::pos()); } }; connect(this, &QSystemTrayIcon::activated, this, trayIconActivated); } #else connect(this, &TrayIcon::activated, this, [this](ActivationReason r) { if (r == Trigger) { startGuiCapture(); } }); #endif #ifdef Q_OS_WIN // Ensure proper removal of tray icon when program quits on Windows. connect(qApp, &QCoreApplication::aboutToQuit, this, &TrayIcon::hide); #endif show(); // TODO needed? if (ConfigHandler().showStartupLaunchMessage()) { showMessage( "Flameshot", QObject::tr( "Hello, I'm here! Click icon in the tray to take a screenshot or " "click with a right button to see more options."), icon, 3000); } connect(ConfigHandler::getInstance(), &ConfigHandler::fileChanged, this, [this]() {}); } TrayIcon::~TrayIcon() { delete m_menu; } #if !defined(DISABLE_UPDATE_CHECKER) QAction* TrayIcon::appUpdates() { return m_appUpdates; } #endif void TrayIcon::initMenu() { m_menu = new QMenu(); auto* captureAction = new QAction(tr("&Take Screenshot"), this); connect(captureAction, &QAction::triggered, this, [this]() { #if defined(Q_OS_MACOS) auto currentMacOsVersion = QOperatingSystemVersion::current(); if (currentMacOsVersion >= currentMacOsVersion.MacOSBigSur) { startGuiCapture(); } else { // It seems it is not relevant for MacOS BigSur (Wait 400 ms to hide // the QMenu) QTimer::singleShot(400, this, [this]() { startGuiCapture(); }); } #else // Wait 400 ms to hide the QMenu QTimer::singleShot(400, this, [this]() { startGuiCapture(); }); #endif }); auto* launcherAction = new QAction(tr("&Open Launcher"), this); connect(launcherAction, &QAction::triggered, Flameshot::instance(), &Flameshot::launcher); auto* configAction = new QAction(tr("&Configuration"), this); connect(configAction, &QAction::triggered, Flameshot::instance(), &Flameshot::config); auto* infoAction = new QAction(tr("&About"), this); connect( infoAction, &QAction::triggered, Flameshot::instance(), &Flameshot::info); #if !defined(DISABLE_UPDATE_CHECKER) m_appUpdates = new QAction(tr("Check for updates"), this); connect(m_appUpdates, &QAction::triggered, FlameshotDaemon::instance(), &FlameshotDaemon::checkForUpdates); connect(FlameshotDaemon::instance(), &FlameshotDaemon::newVersionAvailable, this, [this](const QVersionNumber& version) { QString newVersion = tr("New version %1 is available").arg(version.toString()); m_appUpdates->setText(newVersion); }); #endif QAction* quitAction = new QAction(tr("&Quit"), this); connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit); // recent screenshots QAction* recentAction = new QAction(tr("&Latest Uploads"), this); connect(recentAction, &QAction::triggered, Flameshot::instance(), &Flameshot::history); m_menu->addAction(captureAction); m_menu->addAction(launcherAction); m_menu->addSeparator(); m_menu->addAction(recentAction); m_menu->addSeparator(); m_menu->addAction(configAction); m_menu->addSeparator(); #if !defined(DISABLE_UPDATE_CHECKER) m_menu->addAction(m_appUpdates); #endif m_menu->addAction(infoAction); m_menu->addSeparator(); m_menu->addAction(quitAction); } #if !defined(DISABLE_UPDATE_CHECKER) void TrayIcon::enableCheckUpdatesAction(bool enable) { if (m_appUpdates != nullptr) { m_appUpdates->setVisible(enable); m_appUpdates->setEnabled(enable); } if (enable) { FlameshotDaemon::instance()->getLatestAvailableVersion(); } } #endif void TrayIcon::startGuiCapture() { auto* widget = Flameshot::instance()->gui(); #if !defined(DISABLE_UPDATE_CHECKER) FlameshotDaemon::instance()->showUpdateNotificationIfAvailable(widget); #endif }