11#include <KConfigWatcher>
15#include "mirroredscreenstracker_p.h"
19#include "badgesettings.h"
20#include "donotdisturbsettings.h"
21#include "jobsettings.h"
22#include "notificationsettings.h"
24using namespace Qt::StringLiterals;
25using namespace NotificationManager;
30 explicit Private(Settings *q);
33 void setDirty(
bool dirty);
35 Settings::NotificationBehaviors groupBehavior(
const KConfigGroup &group)
const;
36 void setGroupBehavior(KConfigGroup &group,
const Settings::NotificationBehaviors &behavior);
38 KConfigGroup servicesGroup()
const;
39 KConfigGroup applicationsGroup()
const;
41 QStringList behaviorMatchesList(
const KConfigGroup &group, Settings::NotificationBehavior behavior,
bool on)
const;
45 KSharedConfig::Ptr config;
47 KConfigWatcher::Ptr watcher;
48 QMetaObject::Connection watcherConnection;
50 MirroredScreensTracker::Ptr mirroredScreensTracker;
52 DoNotDisturbSettings dndSettings;
53 NotificationSettings notificationSettings;
54 JobSettings jobSettings;
55 BadgeSettings badgeSettings;
61Settings::Private::Private(
Settings *q)
66Settings::Private::~Private() =
default;
68void Settings::Private::setDirty(
bool dirty)
70 if (this->dirty != dirty) {
76Settings::NotificationBehaviors Settings::Private::groupBehavior(
const KConfigGroup &group)
const
78 Settings::NotificationBehaviors behaviors;
79 behaviors.
setFlag(Settings::ShowPopups, group.
readEntry(
"ShowPopups",
true));
81 behaviors.
setFlag(Settings::ShowPopupsInDoNotDisturbMode, behaviors.
testFlag(Settings::ShowPopups) && group.
readEntry(
"ShowPopupsInDndMode",
false));
82 behaviors.
setFlag(Settings::ShowInHistory, group.
readEntry(
"ShowInHistory",
true));
83 behaviors.
setFlag(Settings::ShowBadges, group.
readEntry(
"ShowBadges",
true));
87void Settings::Private::setGroupBehavior(KConfigGroup &group,
const Settings::NotificationBehaviors &behavior)
89 if (groupBehavior(group) == behavior) {
93 const bool showPopups = behavior.
testFlag(Settings::ShowPopups);
94 if (showPopups && !group.
hasDefault(
"ShowPopups")) {
100 const bool showPopupsInDndMode = behavior.
testFlag(Settings::ShowPopupsInDoNotDisturbMode);
101 if (!showPopupsInDndMode && !group.
hasDefault(
"ShowPopupsInDndMode")) {
107 const bool showInHistory = behavior.
testFlag(Settings::ShowInHistory);
108 if (showInHistory && !group.
hasDefault(
"ShowInHistory")) {
114 const bool showBadges = behavior.
testFlag(Settings::ShowBadges);
115 if (showBadges && !group.
hasDefault(
"ShowBadges")) {
124KConfigGroup Settings::Private::servicesGroup()
const
126 return config->
group(QStringLiteral(
"Services"));
129KConfigGroup Settings::Private::applicationsGroup()
const
131 return config->
group(QStringLiteral(
"Applications"));
134QStringList Settings::Private::behaviorMatchesList(
const KConfigGroup &group, Settings::NotificationBehavior behavior,
bool on)
const
138 const QStringList apps = group.
groupList();
139 for (
const QString &app : apps) {
140 if (groupBehavior(group.
group(app)).testFlag(behavior) == on) {
150 , d(new Private(this))
159 if (d->dndSettings.whenScreensMirrored()) {
160 d->mirroredScreensTracker = MirroredScreensTracker::createTracker();
161 connect(d->mirroredScreensTracker.get(), &MirroredScreensTracker::screensMirroredChanged,
this, &Settings::screensMirroredChanged);
173 d->config->markAsClean();
176Settings::NotificationBehaviors Settings::applicationBehavior(
const QString &desktopEntry)
const
178 return d->groupBehavior(d->applicationsGroup().group(desktopEntry));
181void Settings::setApplicationBehavior(
const QString &desktopEntry, NotificationBehaviors behaviors)
183 KConfigGroup group(d->applicationsGroup().group(desktopEntry));
184 d->setGroupBehavior(group, behaviors);
187Settings::NotificationBehaviors Settings::serviceBehavior(
const QString ¬ifyRcName)
const
189 return d->groupBehavior(d->servicesGroup().group(notifyRcName));
192void Settings::setServiceBehavior(
const QString ¬ifyRcName, NotificationBehaviors behaviors)
194 KConfigGroup group(d->servicesGroup().group(notifyRcName));
195 d->setGroupBehavior(group, behaviors);
198void Settings::registerKnownApplication(
const QString &desktopEntry)
202 qCDebug(NOTIFICATIONMANAGER) <<
"Application" << desktopEntry <<
"cannot be registered as seen application since there is no service for it";
206 if (service->noDisplay()) {
207 qCDebug(NOTIFICATIONMANAGER) <<
"Application" << desktopEntry <<
"will not be registered as seen application since it's marked as NoDisplay";
215 d->applicationsGroup().group(desktopEntry).writeEntry(
"Seen",
true);
217 Q_EMIT knownApplicationsChanged();
220void Settings::forgetKnownApplication(
const QString &desktopEntry)
227 if (!d->applicationsGroup().group(desktopEntry).readEntry(
"Seen",
false)) {
228 qCDebug(NOTIFICATIONMANAGER) <<
"Application" << desktopEntry <<
"will not be removed from seen applications since it wasn't one.";
232 d->applicationsGroup().deleteGroup(desktopEntry);
234 Q_EMIT knownApplicationsChanged();
239 d->config->markAsClean();
240 d->config->reparseConfiguration();
241 d->dndSettings.load();
242 d->notificationSettings.load();
243 d->jobSettings.load();
244 d->badgeSettings.load();
251 d->dndSettings.save();
252 d->notificationSettings.save();
253 d->jobSettings.save();
254 d->badgeSettings.save();
260void Settings::defaults()
262 d->dndSettings.setDefaults();
263 d->notificationSettings.setDefaults();
264 d->jobSettings.setDefaults();
265 d->badgeSettings.setDefaults();
275void Settings::setLive(
bool live)
277 if (
live == d->live) {
288 if (group.name() == QLatin1String(
"DoNotDisturb")) {
289 d->dndSettings.load();
291 bool emitScreensMirroredChanged = false;
292 if (d->dndSettings.whenScreensMirrored()) {
293 if (!d->mirroredScreensTracker) {
294 d->mirroredScreensTracker = MirroredScreensTracker::createTracker();
295 emitScreensMirroredChanged = d->mirroredScreensTracker->screensMirrored();
296 connect(d->mirroredScreensTracker.get(), &MirroredScreensTracker::screensMirroredChanged, this, &Settings::screensMirroredChanged);
298 } else if (d->mirroredScreensTracker) {
299 emitScreensMirroredChanged = d->mirroredScreensTracker->screensMirrored();
300 d->mirroredScreensTracker.reset();
303 if (emitScreensMirroredChanged) {
304 Q_EMIT screensMirroredChanged();
306 }
else if (group.
name() == QLatin1String(
"Notifications")) {
307 d->notificationSettings.load();
308 }
else if (group.
name() == QLatin1String(
"Jobs")) {
309 d->jobSettings.load();
310 }
else if (group.
name() == QLatin1String(
"Badges")) {
311 d->badgeSettings.load();
317 disconnect(d->watcherConnection);
318 d->watcherConnection = QMetaObject::Connection();
322 Q_EMIT liveChanged();
334 return d->notificationSettings.criticalInDndMode();
337void Settings::setCriticalPopupsInDoNotDisturbMode(
bool enable)
342 d->notificationSettings.setCriticalInDndMode(enable);
348 return d->notificationSettings.normalAlwaysOnTop();
351void Settings::setKeepNormalAlwaysOnTop(
bool enable)
356 d->notificationSettings.setNormalAlwaysOnTop(enable);
362 return d->notificationSettings.lowPriorityPopups();
365void Settings::setLowPriorityPopups(
bool enable)
370 d->notificationSettings.setLowPriorityPopups(enable);
376 return d->notificationSettings.lowPriorityHistory();
379void Settings::setLowPriorityHistory(
bool enable)
384 d->notificationSettings.setLowPriorityHistory(enable);
390 return static_cast<Settings::PopupPosition
>(d->notificationSettings.popupPosition());
393void Settings::setPopupPosition(Settings::PopupPosition position)
398 d->notificationSettings.setPopupPosition(position);
404 return d->notificationSettings.popupTimeout();
407void Settings::setPopupTimeout(
int timeout)
412 d->notificationSettings.setPopupTimeout(timeout);
416void Settings::resetPopupTimeout()
418 setPopupTimeout(d->notificationSettings.defaultPopupTimeoutValue());
423 return d->jobSettings.inNotifications();
425void Settings::setJobsInNotifications(
bool enable)
430 d->jobSettings.setInNotifications(enable);
436 return d->jobSettings.permanentPopups();
439void Settings::setPermanentJobPopups(
bool enable)
444 d->jobSettings.setPermanentPopups(enable);
450 return d->badgeSettings.inTaskManager();
453void Settings::setBadgesInTaskManager(
bool enable)
458 d->badgeSettings.setInTaskManager(enable);
464 return d->applicationsGroup().groupList();
469 return d->behaviorMatchesList(d->applicationsGroup(), ShowPopups,
false);
474 return d->behaviorMatchesList(d->servicesGroup(), ShowPopups,
false);
479 return d->behaviorMatchesList(d->applicationsGroup(), ShowPopupsInDoNotDisturbMode,
true);
484 return d->behaviorMatchesList(d->servicesGroup(), ShowPopupsInDoNotDisturbMode,
true);
489 return d->behaviorMatchesList(d->applicationsGroup(), ShowInHistory,
false);
494 return d->behaviorMatchesList(d->servicesGroup(), ShowInHistory,
false);
499 return d->behaviorMatchesList(d->applicationsGroup(), ShowBadges,
false);
504 return d->dndSettings.until();
507void Settings::setNotificationsInhibitedUntil(
const QDateTime &time)
509 d->dndSettings.setUntil(time);
513void Settings::resetNotificationsInhibitedUntil()
515 setNotificationsInhibitedUntil(QDateTime());
520 return Server::self().inhibitedByApplication();
523QStringList Settings::notificationInhibitionApplications()
const
525 return Server::self().inhibitionApplications();
528QStringList Settings::notificationInhibitionReasons()
const
530 return Server::self().inhibitionReasons();
535 return d->dndSettings.whenScreensMirrored();
538void Settings::setInhibitNotificationsWhenScreensMirrored(
bool inhibit)
544 d->dndSettings.setWhenScreensMirrored(inhibit);
550 return d->mirroredScreensTracker && d->mirroredScreensTracker->screensMirrored();
553void Settings::setScreensMirrored(
bool mirrored)
556 qCWarning(NOTIFICATIONMANAGER) <<
"Cannot forcefully set screens mirrored";
560 if (d->mirroredScreensTracker) {
561 d->mirroredScreensTracker->setScreensMirrored(mirrored);
567 return d->dndSettings.whenScreenSharing();
570void Settings::setInhibitNotificationsWhenScreenSharing(
bool inhibit)
576 d->dndSettings.setWhenScreenSharing(inhibit);
582 Server::self().clearInhibitions();
587 return d->dndSettings.notificationSoundsMuted();
590void Settings::setNotificationSoundsInhibited(
bool inhibited)
596 d->dndSettings.setNotificationSoundsMuted(inhibited);
600#include "moc_settings.cpp"
KConfigGroup group(const QString &group)
void revertToDefault(const char *key, WriteConfigFlags pFlag=WriteConfigFlags())
bool hasDefault(const char *key) const
void writeEntry(const char *key, const char *value, WriteConfigFlags pFlags=Normal)
QString readEntry(const char *key, const char *aDefault=nullptr) const
QStringList groupList() const override
static Ptr create(const KSharedConfig::Ptr &config)
void configChanged(const KConfigGroup &group, const QByteArrayList &names)
static Ptr serviceByDesktopName(const QString &_name)
QExplicitlySharedDataPointer< KService > Ptr
static KSharedConfig::Ptr openConfig(const QString &fileName=QString(), OpenFlags mode=FullConfig, QStandardPaths::StandardLocation type=QStandardPaths::GenericConfigLocation)
void inhibitedByApplicationChanged(bool inhibited)
Emitted when inhibitions by application have been changed.
void inhibitionApplicationsChanged()
Emitted when the list of applications holding a notification inhibition changes.
Notification settings and state.
QStringList popupBlacklistedApplications
A list of desktop entries of applications for which no popups should be shown.
bool notificationsInhibitedByApplication
Whether an application currently requested do not disturb mode.
bool screensMirrored
Whether there currently are mirrored/overlapping screens.
bool inhibitNotificationsWhenScreensMirrored
Whether to enable do not disturb mode when screens are mirrored/overlapping.
bool jobsInNotifications
Whether to show application jobs as notifications.
QStringList badgeBlacklistedApplications
A list of desktop entries of applications which shouldn't show badges in task manager.
bool dirty
Whether the settings have changed and need to be saved.
QStringList doNotDisturbPopupWhitelistedServices
A list of notifyrc names of services for which a popup should be shown even in do not disturb mode.
QML_ELEMENTbool criticalPopupsInDoNotDisturbMode
Whether to show critical notification popups in do not disturb mode.
bool keepNormalAlwaysOnTop
Whether to keep normal notifications always on top.
bool notificationSoundsInhibited
Whether notification sounds should be disabled.
QDateTime notificationsInhibitedUntil
The date until which do not disturb mode is enabled.
int popupTimeout
The default timeout for notification popups that do not have an explicit timeout set,...
QStringList historyBlacklistedApplications
A list of desktop entries of applications which shouldn't be shown in the history.
QStringList knownApplications
A list of desktop entries of applications that have been seen sending a notification.
bool lowPriorityHistory
Whether to add low priority notifications to the history.
bool live
Whether to update the properties immediately when they are changed on disk.
Q_INVOKABLE void revokeApplicationInhibitions()
Revoke application notification inhibitions.
QStringList popupBlacklistedServices
A list of notifyrc names of services for which no popups should be shown.
QStringList historyBlacklistedServices
A list of notifyrc names of services which shouldn't be shown in the history.
PopupPosition popupPosition
The notification popup position on screen.
QStringList doNotDisturbPopupWhitelistedApplications
A list of desktop entries of applications for which a popup should be shown even in do not disturb mo...
bool inhibitNotificationsWhenScreenSharing
Whether to enable do not disturb mode while screen sharing.
bool badgesInTaskManager
Whether to show notification badges (numbers in circles) in task manager.
bool permanentJobPopups
Whether application jobs stay visible for the whole duration of the job.
bool lowPriorityPopups
Whether to show popups for low priority notifications.
QFlags< T > & setFlag(Enum flag, bool on)
bool testFlag(Enum flag) const const
void append(QList< T > &&value)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QObject * parent() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)