diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 2ed0a7d3c..18a42d15e 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -296,7 +296,10 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") programupdater.h programupdater.cpp ) - target_link_libraries(qbt_gui PRIVATE objc) + target_link_libraries(qbt_gui PRIVATE + objc + "-framework UserNotifications" + ) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Windows") diff --git a/src/gui/desktopintegration.cpp b/src/gui/desktopintegration.cpp index b927633d9..e413990e5 100644 --- a/src/gui/desktopintegration.cpp +++ b/src/gui/desktopintegration.cpp @@ -80,6 +80,7 @@ DesktopIntegration::DesktopIntegration(QObject *parent) { #ifdef Q_OS_MACOS desktopIntegrationInstance = this; + MacUtils::askForNotificationPermission(); MacUtils::overrideDockClickHandler(handleDockClicked); m_menu->setAsDockMenu(); #else diff --git a/src/gui/macutilities.h b/src/gui/macutilities.h index 2ad3210bd..b27eeb177 100644 --- a/src/gui/macutilities.h +++ b/src/gui/macutilities.h @@ -40,6 +40,7 @@ namespace MacUtils { QPixmap pixmapForExtension(const QString &ext, const QSize &size); void overrideDockClickHandler(bool (*dockClickHandler)(id, SEL, ...)); + void askForNotificationPermission(); void displayNotification(const QString &title, const QString &message); void openFiles(const PathList &pathList); diff --git a/src/gui/macutilities.mm b/src/gui/macutilities.mm index 868590cb8..d4c643ce5 100644 --- a/src/gui/macutilities.mm +++ b/src/gui/macutilities.mm @@ -29,13 +29,17 @@ #include "macutilities.h" #import +#import #import +#import #include +#include #include #include #include +#include "base/logger.h" #include "base/path.h" QImage qt_mac_toQImage(CGImageRef image); @@ -85,16 +89,36 @@ namespace MacUtils } } + void askForNotificationPermission() + { + @autoreleasepool + { + [UNUserNotificationCenter.currentNotificationCenter requestAuthorizationWithOptions: + (UNAuthorizationOptionAlert + UNAuthorizationOptionSound) + completionHandler:^([[maybe_unused]] BOOL granted, NSError * _Nullable error) + { + if (error) + { + LogMsg(QCoreApplication::translate("MacUtils", "Permission for notifications not granted. Error: \"%1\"").arg + (QString::fromNSString(error.localizedDescription)), Log::WARNING); + } + }]; + } + } + void displayNotification(const QString &title, const QString &message) { @autoreleasepool { - NSUserNotification *notification = [[NSUserNotification alloc] init]; - notification.title = title.toNSString(); - notification.informativeText = message.toNSString(); - notification.soundName = NSUserNotificationDefaultSoundName; - - [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; + UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; + content.title = title.toNSString(); + content.body = message.toNSString(); + content.sound = [UNNotificationSound defaultSound]; + UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier: + [[NSUUID UUID] UUIDString] content:content + trigger:nil]; + [UNUserNotificationCenter.currentNotificationCenter + addNotificationRequest:request withCompletionHandler:nil]; } }