diff --git a/src/app/application.cpp b/src/app/application.cpp index ab595cdfb..a45c7e16a 100644 --- a/src/app/application.cpp +++ b/src/app/application.cpp @@ -803,7 +803,6 @@ try disconnect(m_desktopIntegration, &DesktopIntegration::activationRequested, this, &Application::createStartupProgressDialog); // we must not delete menu while it is used by DesktopIntegration - auto *oldMenu = m_desktopIntegration->menu(); #ifndef Q_OS_MACOS const WindowState windowState = !m_startupProgressDialog ? WindowState::Hidden : (m_startupProgressDialog->windowState() & Qt::WindowMinimized) ? WindowState::Minimized @@ -813,7 +812,6 @@ try ? WindowState::Minimized : WindowState::Normal; #endif m_window = new MainWindow(this, windowState); - delete oldMenu; delete m_startupProgressDialog; #ifdef Q_OS_WIN auto *pref = Preferences::instance(); diff --git a/src/gui/desktopintegration.cpp b/src/gui/desktopintegration.cpp index ee0950924..ae28c494f 100644 --- a/src/gui/desktopintegration.cpp +++ b/src/gui/desktopintegration.cpp @@ -99,6 +99,12 @@ DesktopIntegration::DesktopIntegration(QObject *parent) connect(Preferences::instance(), &Preferences::changed, this, &DesktopIntegration::onPreferencesChanged); } +DesktopIntegration::~DesktopIntegration() +{ + if (m_menu) + delete m_menu; +} + bool DesktopIntegration::isActive() const { #ifdef Q_OS_MACOS @@ -135,12 +141,36 @@ void DesktopIntegration::setMenu(QMenu *menu) if (menu == m_menu) return; +#if defined Q_OS_MACOS + if (m_menu) + delete m_menu; + m_menu = menu; -#ifdef Q_OS_MACOS if (m_menu) m_menu->setAsDockMenu(); +#elif defined Q_OS_UNIX + const bool systemTrayEnabled = m_systrayIcon; + if (m_menu) + { + if (m_systrayIcon) + { + delete m_systrayIcon; + m_systrayIcon = nullptr; + } + delete m_menu; + } + + m_menu = menu; + + if (systemTrayEnabled && !m_systrayIcon) + createTrayIcon(); #else + if (m_menu) + delete m_menu; + + m_menu = menu; + if (m_systrayIcon) m_systrayIcon->setContextMenu(m_menu); #endif diff --git a/src/gui/desktopintegration.h b/src/gui/desktopintegration.h index 2c2b7f9a3..726165c96 100644 --- a/src/gui/desktopintegration.h +++ b/src/gui/desktopintegration.h @@ -49,6 +49,7 @@ class DesktopIntegration final : public QObject public: explicit DesktopIntegration(QObject *parent = nullptr); + ~DesktopIntegration() override; bool isActive() const; diff --git a/src/gui/mainwindow.cpp b/src/gui/mainwindow.cpp index 3054d2180..af033ec50 100644 --- a/src/gui/mainwindow.cpp +++ b/src/gui/mainwindow.cpp @@ -460,7 +460,6 @@ MainWindow::MainWindow(IGUIApplication *app, WindowState initialState) MainWindow::~MainWindow() { - app()->desktopIntegration()->setMenu(nullptr); delete m_ui; } @@ -1570,7 +1569,7 @@ void MainWindow::downloadFromURLList(const QStringList &urlList) QMenu *MainWindow::createDesktopIntegrationMenu() { - auto *menu = new QMenu(this); + auto *menu = new QMenu; #ifndef Q_OS_MACOS connect(menu, &QMenu::aboutToShow, this, [this]()