12#include <KConfigWatcher>
16#include "fullscreentracker_p.h"
17#include "mirroredscreenstracker_p.h"
21#include "badgesettings.h"
22#include "donotdisturbsettings.h"
23#include "jobsettings.h"
24#include "notificationsettings.h"
26using namespace Qt::StringLiterals;
27using namespace NotificationManager;
32 explicit Private(Settings *q);
35 void setDirty(
bool dirty);
37 Settings::NotificationBehaviors groupBehavior(
const KConfigGroup &group)
const;
38 void setGroupBehavior(KConfigGroup &group,
const Settings::NotificationBehaviors &behavior);
40 KConfigGroup servicesGroup()
const;
41 KConfigGroup applicationsGroup()
const;
43 QStringList behaviorMatchesList(
const KConfigGroup &group, Settings::NotificationBehavior behavior,
bool on)
const;
47 KSharedConfig::Ptr config;
49 KConfigWatcher::Ptr watcher;
50 QMetaObject::Connection watcherConnection;
52 FullscreenTracker::Ptr fullscreenTracker;
53 MirroredScreensTracker::Ptr mirroredScreensTracker;
55 DoNotDisturbSettings dndSettings;
56 NotificationSettings notificationSettings;
57 JobSettings jobSettings;
58 BadgeSettings badgeSettings;
64Settings::Private::Private(
Settings *q)
69Settings::Private::~Private() =
default;
71void Settings::Private::setDirty(
bool dirty)
73 if (this->dirty != dirty) {
79Settings::NotificationBehaviors Settings::Private::groupBehavior(
const KConfigGroup &group)
const
81 Settings::NotificationBehaviors behaviors;
82 behaviors.
setFlag(Settings::ShowPopups, group.
readEntry(
"ShowPopups",
true));
84 behaviors.
setFlag(Settings::ShowPopupsInDoNotDisturbMode, behaviors.
testFlag(Settings::ShowPopups) && group.
readEntry(
"ShowPopupsInDndMode",
false));
85 behaviors.
setFlag(Settings::ShowInHistory, group.
readEntry(
"ShowInHistory",
true));
86 behaviors.
setFlag(Settings::ShowBadges, group.
readEntry(
"ShowBadges",
true));
90void Settings::Private::setGroupBehavior(KConfigGroup &group,
const Settings::NotificationBehaviors &behavior)
92 if (groupBehavior(group) == behavior) {
96 const bool showPopups = behavior.
testFlag(Settings::ShowPopups);
97 if (showPopups && !group.
hasDefault(
"ShowPopups")) {
103 const bool showPopupsInDndMode = behavior.
testFlag(Settings::ShowPopupsInDoNotDisturbMode);
104 if (!showPopupsInDndMode && !group.
hasDefault(
"ShowPopupsInDndMode")) {
110 const bool showInHistory = behavior.
testFlag(Settings::ShowInHistory);
111 if (showInHistory && !group.
hasDefault(
"ShowInHistory")) {
117 const bool showBadges = behavior.
testFlag(Settings::ShowBadges);
118 if (showBadges && !group.
hasDefault(
"ShowBadges")) {
127KConfigGroup Settings::Private::servicesGroup()
const
129 return config->
group(QStringLiteral(
"Services"));
132KConfigGroup Settings::Private::applicationsGroup()
const
134 return config->
group(QStringLiteral(
"Applications"));
137QStringList Settings::Private::behaviorMatchesList(
const KConfigGroup &group, Settings::NotificationBehavior behavior,
bool on)
const
141 const QStringList apps = group.
groupList();
142 for (
const QString &app : apps) {
143 if (groupBehavior(group.
group(app)).testFlag(behavior) == on) {
153 , d(new Private(this))
162 if (d->dndSettings.whenFullscreen()) {
163 d->fullscreenTracker = FullscreenTracker::createTracker();
164 connect(d->fullscreenTracker.get(), &FullscreenTracker::fullscreenFocusedChanged,
this, &Settings::fullscreenFocusedChanged);
167 if (d->dndSettings.whenScreensMirrored()) {
168 d->mirroredScreensTracker = MirroredScreensTracker::createTracker();
169 connect(d->mirroredScreensTracker.get(), &MirroredScreensTracker::screensMirroredChanged,
this, &Settings::screensMirroredChanged);
181 d->config->markAsClean();
184Settings::NotificationBehaviors Settings::applicationBehavior(
const QString &desktopEntry)
const
186 return d->groupBehavior(d->applicationsGroup().group(desktopEntry));
189void Settings::setApplicationBehavior(
const QString &desktopEntry, NotificationBehaviors behaviors)
191 KConfigGroup group(d->applicationsGroup().group(desktopEntry));
192 d->setGroupBehavior(group, behaviors);
195Settings::NotificationBehaviors Settings::serviceBehavior(
const QString ¬ifyRcName)
const
197 return d->groupBehavior(d->servicesGroup().group(notifyRcName));
200void Settings::setServiceBehavior(
const QString ¬ifyRcName, NotificationBehaviors behaviors)
202 KConfigGroup group(d->servicesGroup().group(notifyRcName));
203 d->setGroupBehavior(group, behaviors);
206void Settings::registerKnownApplication(
const QString &desktopEntry)
210 qCDebug(NOTIFICATIONMANAGER) <<
"Application" << desktopEntry <<
"cannot be registered as seen application since there is no service for it";
214 if (service->noDisplay()) {
215 qCDebug(NOTIFICATIONMANAGER) <<
"Application" << desktopEntry <<
"will not be registered as seen application since it's marked as NoDisplay";
223 d->applicationsGroup().group(desktopEntry).writeEntry(
"Seen",
true);
225 Q_EMIT knownApplicationsChanged();
228void Settings::forgetKnownApplication(
const QString &desktopEntry)
235 if (!d->applicationsGroup().group(desktopEntry).readEntry(
"Seen",
false)) {
236 qCDebug(NOTIFICATIONMANAGER) <<
"Application" << desktopEntry <<
"will not be removed from seen applications since it wasn't one.";
240 d->applicationsGroup().deleteGroup(desktopEntry);
242 Q_EMIT knownApplicationsChanged();
247 d->config->markAsClean();
248 d->config->reparseConfiguration();
249 d->dndSettings.load();
250 d->notificationSettings.load();
251 d->jobSettings.load();
252 d->badgeSettings.load();
259 d->dndSettings.save();
260 d->notificationSettings.save();
261 d->jobSettings.save();
262 d->badgeSettings.save();
268void Settings::defaults()
270 d->dndSettings.setDefaults();
271 d->notificationSettings.setDefaults();
272 d->jobSettings.setDefaults();
273 d->badgeSettings.setDefaults();
283void Settings::setLive(
bool live)
285 if (
live == d->live) {
296 if (group.name() == QLatin1String(
"DoNotDisturb")) {
297 d->dndSettings.load();
299 bool emitScreensMirroredChanged = false;
300 if (d->dndSettings.whenScreensMirrored()) {
301 if (!d->mirroredScreensTracker) {
302 d->mirroredScreensTracker = MirroredScreensTracker::createTracker();
303 emitScreensMirroredChanged = d->mirroredScreensTracker->screensMirrored();
304 connect(d->mirroredScreensTracker.get(), &MirroredScreensTracker::screensMirroredChanged, this, &Settings::screensMirroredChanged);
306 } else if (d->mirroredScreensTracker) {
307 emitScreensMirroredChanged = d->mirroredScreensTracker->screensMirrored();
308 d->mirroredScreensTracker.reset();
311 if (emitScreensMirroredChanged) {
312 Q_EMIT screensMirroredChanged();
315 bool emitFullscreenChanged = false;
316 if (d->dndSettings.whenFullscreen()) {
317 if (!d->fullscreenTracker) {
318 d->fullscreenTracker = FullscreenTracker::createTracker();
319 emitFullscreenChanged = d->fullscreenTracker->fullscreenFocused();
320 connect(d->fullscreenTracker.get(), &FullscreenTracker::fullscreenFocusedChanged, this, &Settings::fullscreenFocusedChanged);
322 } else if (d->fullscreenTracker) {
323 emitFullscreenChanged = d->fullscreenTracker->fullscreenFocused();
324 d->fullscreenTracker.reset();
327 if (emitFullscreenChanged) {
328 Q_EMIT fullscreenFocusedChanged();
330 }
else if (group.
name() == QLatin1String(
"Notifications")) {
331 d->notificationSettings.load();
332 }
else if (group.
name() == QLatin1String(
"Jobs")) {
333 d->jobSettings.load();
334 }
else if (group.
name() == QLatin1String(
"Badges")) {
335 d->badgeSettings.load();
341 disconnect(d->watcherConnection);
342 d->watcherConnection = QMetaObject::Connection();
346 Q_EMIT liveChanged();
358 return d->notificationSettings.criticalInDndMode();
361void Settings::setCriticalPopupsInDoNotDisturbMode(
bool enable)
366 d->notificationSettings.setCriticalInDndMode(enable);
372 return d->notificationSettings.lowPriorityPopups();
375void Settings::setLowPriorityPopups(
bool enable)
380 d->notificationSettings.setLowPriorityPopups(enable);
386 return d->notificationSettings.lowPriorityHistory();
389void Settings::setLowPriorityHistory(
bool enable)
394 d->notificationSettings.setLowPriorityHistory(enable);
400 return static_cast<Settings::PopupPosition
>(d->notificationSettings.popupPosition());
403void Settings::setPopupPosition(Settings::PopupPosition position)
408 d->notificationSettings.setPopupPosition(position);
414 return d->notificationSettings.popupTimeout();
417void Settings::setPopupTimeout(
int timeout)
422 d->notificationSettings.setPopupTimeout(timeout);
426void Settings::resetPopupTimeout()
428 setPopupTimeout(d->notificationSettings.defaultPopupTimeoutValue());
433 return d->jobSettings.inNotifications();
435void Settings::setJobsInNotifications(
bool enable)
440 d->jobSettings.setInNotifications(enable);
446 return d->jobSettings.permanentPopups();
449void Settings::setPermanentJobPopups(
bool enable)
454 d->jobSettings.setPermanentPopups(enable);
460 return d->badgeSettings.inTaskManager();
463void Settings::setBadgesInTaskManager(
bool enable)
468 d->badgeSettings.setInTaskManager(enable);
474 return d->applicationsGroup().groupList();
479 return d->behaviorMatchesList(d->applicationsGroup(), ShowPopups,
false);
484 return d->behaviorMatchesList(d->servicesGroup(), ShowPopups,
false);
489 return d->behaviorMatchesList(d->applicationsGroup(), ShowPopupsInDoNotDisturbMode,
true);
494 return d->behaviorMatchesList(d->servicesGroup(), ShowPopupsInDoNotDisturbMode,
true);
499 return d->behaviorMatchesList(d->applicationsGroup(), ShowInHistory,
false);
504 return d->behaviorMatchesList(d->servicesGroup(), ShowInHistory,
false);
509 return d->behaviorMatchesList(d->applicationsGroup(), ShowBadges,
false);
514 return d->dndSettings.until();
517void Settings::setNotificationsInhibitedUntil(
const QDateTime &time)
519 d->dndSettings.setUntil(time);
523void Settings::resetNotificationsInhibitedUntil()
525 setNotificationsInhibitedUntil(QDateTime());
530 return Server::self().inhibitedByApplication();
533QStringList Settings::notificationInhibitionApplications()
const
535 return Server::self().inhibitionApplications();
538QStringList Settings::notificationInhibitionReasons()
const
540 return Server::self().inhibitionReasons();
545 return d->dndSettings.whenScreensMirrored();
548void Settings::setInhibitNotificationsWhenScreensMirrored(
bool inhibit)
554 d->dndSettings.setWhenScreensMirrored(inhibit);
560 return d->mirroredScreensTracker && d->mirroredScreensTracker->screensMirrored();
563void Settings::setScreensMirrored(
bool mirrored)
566 qCWarning(NOTIFICATIONMANAGER) <<
"Cannot forcefully set screens mirrored";
570 if (d->mirroredScreensTracker) {
571 d->mirroredScreensTracker->setScreensMirrored(mirrored);
577 return d->dndSettings.whenScreenSharing();
580void Settings::setInhibitNotificationsWhenScreenSharing(
bool inhibit)
586 d->dndSettings.setWhenScreenSharing(inhibit);
592 return d->dndSettings.whenFullscreen();
595void Settings::setInhibitNotificationsWhenFullscreen(
bool inhibit)
601 d->dndSettings.setWhenFullscreen(inhibit);
607 return d->fullscreenTracker && d->fullscreenTracker->fullscreenFocused();
610void Settings::setFullscreenFocused(
bool focused)
613 qCWarning(NOTIFICATIONMANAGER) <<
"Cannot forcefully set fullscreen focused";
617 if (d->fullscreenTracker) {
618 d->fullscreenTracker->setFullscreenFocused(focused);
624 Server::self().clearInhibitions();
629 return d->dndSettings.notificationSoundsMuted();
632void Settings::setNotificationSoundsInhibited(
bool inhibited)
638 d->dndSettings.setNotificationSoundsMuted(inhibited);
642#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 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.
bool inhibitNotificationsWhenFullscreen
Whether to enable do not disturb mode when a fullscreen window is focused.
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 fullscreenFocused
Whether a fullscreen window is currently focused.
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)