diff --git a/src/QtTrayMenu.cpp b/src/QtTrayMenu.cpp index 621bc10..eeb7930 100644 --- a/src/QtTrayMenu.cpp +++ b/src/QtTrayMenu.cpp @@ -112,7 +112,7 @@ void QtTrayMenu::onUpdate(struct tray *tray, const bool notify) { } } -int QtTrayMenu::loop(int blocking) const { +int QtTrayMenu::loop(int blocking) { if (!running) { return -1; } @@ -121,9 +121,11 @@ int QtTrayMenu::loop(int blocking) const { return -1; } if (blocking) { + blockingEventLoop = true; QApplication::exec(); return -1; } else { + blockingEventLoop = false; QApplication::processEvents(); return 0; } @@ -149,6 +151,11 @@ void QtTrayMenu::onExitRequested() { } // Unset tray structure trayStruct = nullptr; + + // If we run in a blocking event loop break said loop by quitting the QApplication + if (blockingEventLoop) { + QApplication::quit(); + } } void QtTrayMenu::updateMenu(struct tray_menu *items) { diff --git a/src/QtTrayMenu.h b/src/QtTrayMenu.h index 38a8bd4..85ec7c8 100644 --- a/src/QtTrayMenu.h +++ b/src/QtTrayMenu.h @@ -60,7 +60,7 @@ class QtTrayMenu: public QObject { * @param blocking if true the function call will block until QtTrayMenu exits * @return 0 on successful processing if non-blocking, -1 otherwise */ - int loop(int blocking) const; + int loop(int blocking); /** * @brief Configure metadata for QApplication @@ -135,6 +135,7 @@ class QtTrayMenu: public QObject { QMenu *trayTopMenu = nullptr; struct tray *trayStruct = nullptr; bool running = false; + bool blockingEventLoop = false; struct tray_menu *getTrayMenuItem(QAction *action); std::function notificationCallback = nullptr;