[plasma/plasma-workspace] /: applets/notifications: enable DND while fullscreen app is focused

Nate Graham null at kde.org
Wed Apr 23 23:16:58 BST 2025


Git commit 6d3aa1d007293fd550f178d8c39b95f5c9b3911d by Nate Graham, on behalf of Kristen McWilliam.
Committed on 23/04/2025 at 22:16.
Pushed by ngraham into branch 'master'.

applets/notifications: enable DND while fullscreen app is focused

Resolves https://invent.kde.org/plasma/plasma-workspace/-/issues/119.

There is currently a setting to allow normal-priority notifications to
appear in full-screen windows, which doesn't actually affect the DND mode.
This change replaces that setting with a more intuitive behavior: while a
full-screen window is focused, DND mode is enabled, and when the focus is
no longer on the full-screen window, DND mode is disabled. Benefits:

- Notifications appearing or not is less magic, and the user can easily
  understand why they are appearing or not.
- DND mode is actually activated when inhibiting notifications, which
  allows the rest of the system to know that the user is busy with
  something, and apps can read the `org.freedesktop.Notifications.Inhibited`
  property to check the status of DND mode.

M  +6    -0    applets/notifications/package/contents/ui/FullRepresentation.qml
M  +6    -1    applets/notifications/package/contents/ui/global/Globals.qml
M  +5    -0    doc/kcontrol/notifications/index.docbook
M  +11   -13   kcms/notifications/ui/main.qml
M  +4    -0    libnotificationmanager/CMakeLists.txt
A  +61   -0    libnotificationmanager/fullscreentracker.cpp     [License: LGPL(3+eV) LGPL(v3.0) LGPL(v2.1)]
A  +45   -0    libnotificationmanager/fullscreentracker_p.h     [License: LGPL(3+eV) LGPL(v3.0) LGPL(v2.1)]
M  +4    -0    libnotificationmanager/kcfg/donotdisturbsettings.kcfg
M  +0    -3    libnotificationmanager/kcfg/notificationsettings.kcfg
A  +8    -0    libnotificationmanager/kconf_update/CMakeLists.txt
A  +51   -0    libnotificationmanager/kconf_update/plasma6.4-migrate-fullscreen-notifications-to-dnd.cpp     [License: LGPL(3+eV) LGPL(v3.0) LGPL(v2.1)]
A  +7    -0    libnotificationmanager/kconf_update/plasma6.4-migrate-fullscreen-notifications-to-dnd.upd
M  +56   -14   libnotificationmanager/settings.cpp
M  +29   -7    libnotificationmanager/settings.h

https://invent.kde.org/plasma/plasma-workspace/-/commit/6d3aa1d007293fd550f178d8c39b95f5c9b3911d

diff --git a/applets/notifications/package/contents/ui/FullRepresentation.qml b/applets/notifications/package/contents/ui/FullRepresentation.qml
index 060c6c48e6f..18707ed5a2e 100644
--- a/applets/notifications/package/contents/ui/FullRepresentation.qml
+++ b/applets/notifications/package/contents/ui/FullRepresentation.qml
@@ -202,6 +202,8 @@ PlasmaExtras.Representation {
                     var inhibitedByApp = notificationSettings.notificationsInhibitedByApplication;
                     var inhibitedByMirroredScreens = notificationSettings.inhibitNotificationsWhenScreensMirrored
                                                         && notificationSettings.screensMirrored;
+                    var inhibitedByFullscreen = notificationSettings.inhibitNotificationsWhenFullscreen
+                                                        && notificationSettings.fullscreenFocused;
                     var dateNow = Date.now();
 
                     var sections = [];
@@ -234,6 +236,10 @@ PlasmaExtras.Representation {
                         sections.push(i18nc("Do not disturb because external mirrored screens connected", "Screens are mirrored"))
                     }
 
+                    if (inhibitedByFullscreen) {
+                        sections.push(i18nc("Do not disturb because fullscreen app is focused", "Fullscreen app is focused"))
+                    }
+
                     return sections.join(" ยท ");
                 }
                 visible: text !== ""
diff --git a/applets/notifications/package/contents/ui/global/Globals.qml b/applets/notifications/package/contents/ui/global/Globals.qml
index 7b4ce363936..1bec4b56284 100644
--- a/applets/notifications/package/contents/ui/global/Globals.qml
+++ b/applets/notifications/package/contents/ui/global/Globals.qml
@@ -277,6 +277,10 @@ QtObject {
                 inhibited |= true;
             }
 
+            if (notificationSettings.inhibitNotificationsWhenFullscreen) {
+                inhibited |= notificationSettings.fullscreenFocused;
+            }
+
             if (notificationSettings.inhibitNotificationsWhenScreensMirrored) {
                 inhibited |= notificationSettings.screensMirrored;
             }
@@ -288,6 +292,7 @@ QtObject {
     function revokeInhibitions() {
         notificationSettings.notificationsInhibitedUntil = undefined;
         notificationSettings.revokeApplicationInhibitions();
+        notificationSettings.fullscreenFocused = false;
         // overrules current mirrored screen setup, updates again when screen configuration changes
         notificationSettings.screensMirrored = false;
 
@@ -477,7 +482,7 @@ QtObject {
 
             popupWidth: globals.popupWidth
 
-            isCritical: model.urgency === NotificationManager.Notifications.CriticalUrgency || (model.urgency === NotificationManager.Notifications.NormalUrgency && notificationSettings.keepNormalAlwaysOnTop)
+            isCritical: model.urgency === NotificationManager.Notifications.CriticalUrgency || (model.urgency === NotificationManager.Notifications.NormalUrgency && !notificationSettings.inhibitNotificationsWhenFullscreen)
 
             modelTimeout: model.timeout
             // Increase default timeout for notifications with a URL so you have enough time
diff --git a/doc/kcontrol/notifications/index.docbook b/doc/kcontrol/notifications/index.docbook
index c82f223777a..efd7f56c117 100644
--- a/doc/kcontrol/notifications/index.docbook
+++ b/doc/kcontrol/notifications/index.docbook
@@ -57,6 +57,11 @@ each event.</para>
     <listitem><para>Automatically enable do not disturb mode when you share your screens, for example during an online lecture.</para></listitem>
     </varlistentry>
 
+    <varlistentry>
+    <term><guiicon>Enable while a fullscreen application is focused</guiicon></term>
+    <listitem><para>Automatically enable do not disturb mode while you are using a fullscreen application, for example watching a video.</para></listitem>
+    </varlistentry>
+
     <varlistentry>
     <term><guiicon>Show critical notifications</guiicon></term>
     <listitem><para>Whether to show critical notifications, such as your battery is almost empty, to show even when in do not disturb mode.</para></listitem>
diff --git a/kcms/notifications/ui/main.qml b/kcms/notifications/ui/main.qml
index fd34a88c03f..c661b78a5d2 100644
--- a/kcms/notifications/ui/main.qml
+++ b/kcms/notifications/ui/main.qml
@@ -133,6 +133,17 @@ KCM.SimpleKCM {
             }
         }
 
+        QtControls.CheckBox {
+            text: i18nc("Automatically enable Do Not Disturb mode while a fullscreen application is focused", "While a fullscreen application is focused")
+            checked: kcm.dndSettings.whenFullscreen
+            onClicked: kcm.dndSettings.whenFullscreen = checked
+
+            KCM.SettingStateBinding {
+                configObject: kcm.dndSettings
+                settingName: "WhenFullscreen"
+                extraEnabledConditions: root.notificationsAvailable
+            }
+        }
 
         KQuickControls.KeySequenceItem {
             Kirigami.FormData.label: i18nc("Keyboard shortcut to turn Do Not Disturb mode on and off", "Manually toggle with shortcut:")
@@ -159,19 +170,6 @@ KCM.SimpleKCM {
             }
         }
 
-        QtControls.CheckBox {
-            Kirigami.FormData.label: i18n("Normal notifications:")
-            text: i18n("Show over full screen windows")
-            checked: kcm.notificationSettings.normalAlwaysOnTop
-            onClicked: kcm.notificationSettings.normalAlwaysOnTop = checked
-
-            KCM.SettingStateBinding {
-                configObject: kcm.notificationSettings
-                settingName: "NormalAlwaysOnTop"
-                extraEnabledConditions: root.notificationsAvailable
-            }
-        }
-
         QtControls.CheckBox {
             Kirigami.FormData.label: i18n("Low priority notifications:")
             text: i18n("Show popup")
diff --git a/libnotificationmanager/CMakeLists.txt b/libnotificationmanager/CMakeLists.txt
index 6d26cf015b4..0121827ecb9 100644
--- a/libnotificationmanager/CMakeLists.txt
+++ b/libnotificationmanager/CMakeLists.txt
@@ -10,6 +10,7 @@ set(notificationmanager_LIB_SRCS
     serverinfo.cpp
     settings.cpp
     mirroredscreenstracker.cpp
+    fullscreentracker.cpp
     notifications.cpp
     notification.cpp
 
@@ -87,6 +88,7 @@ target_link_libraries(notificationmanager
         KF6::Notifications # Inhibition summary
         KF6::KIOFileWidgets
         Plasma::Plasma
+        PW::LibTaskManager
         KF6::Screen
         KF6::Service
         Canberra::Canberra
@@ -140,3 +142,5 @@ install(FILES plasmanotifyrc
 
 install(FILES libnotificationmanager.notifyrc
     DESTINATION ${KDE_INSTALL_KNOTIFYRCDIR})
+
+add_subdirectory(kconf_update)
diff --git a/libnotificationmanager/fullscreentracker.cpp b/libnotificationmanager/fullscreentracker.cpp
new file mode 100644
index 00000000000..b5757ef3a10
--- /dev/null
+++ b/libnotificationmanager/fullscreentracker.cpp
@@ -0,0 +1,61 @@
+/*
+    SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic at gmail.com>
+
+    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#include "abstracttasksmodel.h"
+#include "fullscreentracker_p.h"
+
+using namespace NotificationManager;
+
+FullscreenTracker::FullscreenTracker(QObject *parent)
+    : TaskManager::TasksModel(parent)
+{
+    setFilterMinimized(true);
+    setFilterHidden(true);
+
+    checkFullscreenFocused();
+
+    connect(this, &TaskManager::TasksModel::activeTaskChanged, this, &FullscreenTracker::checkFullscreenFocused);
+    connect(this, &TaskManager::TasksModel::dataChanged, this, &FullscreenTracker::checkFullscreenFocused);
+}
+
+FullscreenTracker::~FullscreenTracker() = default;
+
+FullscreenTracker::Ptr FullscreenTracker::createTracker()
+{
+    static std::weak_ptr<FullscreenTracker> s_instance;
+    if (s_instance.expired()) {
+        std::shared_ptr<FullscreenTracker> ptr(new FullscreenTracker(nullptr));
+        s_instance = ptr;
+        return ptr;
+    }
+    return s_instance.lock();
+}
+
+bool FullscreenTracker::fullscreenFocused() const
+{
+    return m_fullscreenFocused;
+}
+
+void FullscreenTracker::setFullscreenFocused(bool focused)
+{
+    if (m_fullscreenFocused != focused) {
+        m_fullscreenFocused = focused;
+        Q_EMIT fullscreenFocusedChanged(focused);
+    }
+}
+
+void FullscreenTracker::checkFullscreenFocused()
+{
+    QModelIndex activeTaskIndex = activeTask();
+    if (!activeTaskIndex.isValid()) {
+        setFullscreenFocused(false);
+        return;
+    }
+
+    bool isFullscreen = activeTaskIndex.data(TaskManager::AbstractTasksModel::IsFullScreen).toBool();
+
+    setFullscreenFocused(isFullscreen);
+}
diff --git a/libnotificationmanager/fullscreentracker_p.h b/libnotificationmanager/fullscreentracker_p.h
new file mode 100644
index 00000000000..77e080dffde
--- /dev/null
+++ b/libnotificationmanager/fullscreentracker_p.h
@@ -0,0 +1,45 @@
+/*
+    SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic at gmail.com>
+
+    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#pragma once
+
+#include <QObject>
+
+#include <tasksmodel.h>
+
+namespace NotificationManager
+{
+
+/**
+ * Tracks whether a fullscreen window is focused.
+ *
+ * It is used to determine whether to automatically enable Do Not Disturb mode when a fullscreen window is focused.
+ *
+ **/
+class FullscreenTracker : public TaskManager::TasksModel
+{
+    Q_OBJECT
+
+public:
+    FullscreenTracker(QObject *parent = nullptr);
+    ~FullscreenTracker() override;
+
+    using Ptr = std::shared_ptr<FullscreenTracker>;
+    static Ptr createTracker();
+
+    bool fullscreenFocused() const;
+    void setFullscreenFocused(bool focused);
+    Q_SIGNAL void fullscreenFocusedChanged(bool focused);
+
+private:
+    FullscreenTracker();
+    Q_DISABLE_COPY(FullscreenTracker)
+
+    void checkFullscreenFocused();
+    bool m_fullscreenFocused = false;
+};
+
+}
diff --git a/libnotificationmanager/kcfg/donotdisturbsettings.kcfg b/libnotificationmanager/kcfg/donotdisturbsettings.kcfg
index 0e15d632c03..dcc7a44fccc 100644
--- a/libnotificationmanager/kcfg/donotdisturbsettings.kcfg
+++ b/libnotificationmanager/kcfg/donotdisturbsettings.kcfg
@@ -18,6 +18,10 @@
             <default>true</default>
         </entry>
 
+        <entry name="WhenFullscreen" type="Bool">
+            <default>true</default>
+        </entry>
+
         <entry name="NotificationSoundsMuted" type="Bool">
             <default>false</default>
         </entry>
diff --git a/libnotificationmanager/kcfg/notificationsettings.kcfg b/libnotificationmanager/kcfg/notificationsettings.kcfg
index bd29d2927b5..d9c6b0afd81 100644
--- a/libnotificationmanager/kcfg/notificationsettings.kcfg
+++ b/libnotificationmanager/kcfg/notificationsettings.kcfg
@@ -9,9 +9,6 @@
         <entry name="CriticalInDndMode" type="Bool">
             <default>true</default>
         </entry>
-        <entry name="NormalAlwaysOnTop" type="Bool">
-            <default>false</default>
-        </entry>
         <entry name="LowPriorityPopups" type="Bool">
             <default>true</default>
         </entry>
diff --git a/libnotificationmanager/kconf_update/CMakeLists.txt b/libnotificationmanager/kconf_update/CMakeLists.txt
new file mode 100644
index 00000000000..235b188f5c1
--- /dev/null
+++ b/libnotificationmanager/kconf_update/CMakeLists.txt
@@ -0,0 +1,8 @@
+# SPDX-FileCopyrightText: 2025 Kristen McWilliam <kmcwilliampublic at gmail.com>
+# SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+
+add_executable(plasma6.4-migrate-fullscreen-notifications-to-dnd)
+target_sources(plasma6.4-migrate-fullscreen-notifications-to-dnd PRIVATE plasma6.4-migrate-fullscreen-notifications-to-dnd.cpp)
+target_link_libraries(plasma6.4-migrate-fullscreen-notifications-to-dnd PRIVATE KF6::ConfigCore Qt::Core)
+install(FILES plasma6.4-migrate-fullscreen-notifications-to-dnd.upd DESTINATION ${KDE_INSTALL_KCONFUPDATEDIR})
+install(TARGETS plasma6.4-migrate-fullscreen-notifications-to-dnd DESTINATION ${KDE_INSTALL_LIBDIR}/kconf_update_bin/)
diff --git a/libnotificationmanager/kconf_update/plasma6.4-migrate-fullscreen-notifications-to-dnd.cpp b/libnotificationmanager/kconf_update/plasma6.4-migrate-fullscreen-notifications-to-dnd.cpp
new file mode 100644
index 00000000000..498e465dfb5
--- /dev/null
+++ b/libnotificationmanager/kconf_update/plasma6.4-migrate-fullscreen-notifications-to-dnd.cpp
@@ -0,0 +1,51 @@
+/*
+    SPDX-FileCopyrightText: 2025 Kristen McWilliam <kmcwilliampublic at gmail.com>
+
+    SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+*/
+
+#include <iostream>
+
+#include <KConfigGroup>
+#include <KSharedConfig>
+
+#include <QStringLiteral>
+
+/**
+ * If the user has enabled the "Show over full screen windows" option,
+ * this script will migrate that preference by setting the new
+ * "Do Not Disturb when full screen windows are present" false.
+ *
+ * @since 6.4
+ */
+int main()
+{
+    const KSharedConfigPtr configPtr = KSharedConfig::openConfig(QStringLiteral("plasmanotifyrc"), KConfig::SimpleConfig);
+    KConfigGroup notificationsGroup(configPtr, QStringLiteral("Notifications"));
+    if (!notificationsGroup.exists()) {
+        std::cout << "plasmanotifyrc doesn't have a Notifications group. No need to update config." << std::endl;
+        return EXIT_SUCCESS;
+    }
+
+    // Check if the legacy "Show over full screen windows" option is enabled.
+    bool showOverFullScreen = notificationsGroup.readEntry("NormalAlwaysOnTop", false);
+    if (!showOverFullScreen) {
+        std::cout << "The 'Show over full screen windows' option is not enabled. No need to update config." << std::endl;
+        return EXIT_SUCCESS;
+    }
+
+    // Remove the old setting.
+    notificationsGroup.deleteEntry("NormalAlwaysOnTop");
+
+    // Disable the new setting to preserve the old behavior.
+    KConfigGroup dndGroup(configPtr, QStringLiteral("DoNotDisturb"));
+    dndGroup.writeEntry("WhenFullscreen", false);
+
+    // Save the changes to the configuration file.
+    if (!configPtr->sync()) {
+        std::cerr << "Failed to save changes to plasmanotifyrc." << std::endl;
+        return EXIT_FAILURE;
+    }
+
+    return EXIT_SUCCESS;
+}
diff --git a/libnotificationmanager/kconf_update/plasma6.4-migrate-fullscreen-notifications-to-dnd.upd b/libnotificationmanager/kconf_update/plasma6.4-migrate-fullscreen-notifications-to-dnd.upd
new file mode 100644
index 00000000000..6783efb9979
--- /dev/null
+++ b/libnotificationmanager/kconf_update/plasma6.4-migrate-fullscreen-notifications-to-dnd.upd
@@ -0,0 +1,7 @@
+# SPDX-FileCopyrightText: 2025 Kristen McWilliam <kmcwilliampublic at gmail.com>
+# SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
+
+Version=6
+
+Id=plasma6.4-migrate-fullscreen-notifications-to-dnd
+Script=plasma6.4-migrate-fullscreen-notifications-to-dnd
diff --git a/libnotificationmanager/settings.cpp b/libnotificationmanager/settings.cpp
index 84991dfd607..94fb0ada813 100644
--- a/libnotificationmanager/settings.cpp
+++ b/libnotificationmanager/settings.cpp
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2019 Kai Uwe Broulik <kde at privat.broulik.de>
+    SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic at gmail.com>
 
     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
 */
@@ -12,6 +13,7 @@
 #include <KService>
 
 #include "debug.h"
+#include "fullscreentracker_p.h"
 #include "mirroredscreenstracker_p.h"
 #include "server.h"
 
@@ -47,6 +49,7 @@ public:
     KConfigWatcher::Ptr watcher;
     QMetaObject::Connection watcherConnection;
 
+    FullscreenTracker::Ptr fullscreenTracker;
     MirroredScreensTracker::Ptr mirroredScreensTracker;
 
     DoNotDisturbSettings dndSettings;
@@ -156,6 +159,11 @@ Settings::Settings(QObject *parent)
     connect(&Server::self(), &Server::inhibitedByApplicationChanged, this, &Settings::notificationsInhibitedByApplicationChanged);
     connect(&Server::self(), &Server::inhibitionApplicationsChanged, this, &Settings::notificationInhibitionApplicationsChanged);
 
+    if (d->dndSettings.whenFullscreen()) {
+        d->fullscreenTracker = FullscreenTracker::createTracker();
+        connect(d->fullscreenTracker.get(), &FullscreenTracker::fullscreenFocusedChanged, this, &Settings::fullscreenFocusedChanged);
+    }
+
     if (d->dndSettings.whenScreensMirrored()) {
         d->mirroredScreensTracker = MirroredScreensTracker::createTracker();
         connect(d->mirroredScreensTracker.get(), &MirroredScreensTracker::screensMirroredChanged, this, &Settings::screensMirroredChanged);
@@ -303,6 +311,22 @@ void Settings::setLive(bool live)
                 if (emitScreensMirroredChanged) {
                     Q_EMIT screensMirroredChanged();
                 }
+
+                bool emitFullscreenChanged = false;
+                if (d->dndSettings.whenFullscreen()) {
+                    if (!d->fullscreenTracker) {
+                        d->fullscreenTracker = FullscreenTracker::createTracker();
+                        emitFullscreenChanged = d->fullscreenTracker->fullscreenFocused();
+                        connect(d->fullscreenTracker.get(), &FullscreenTracker::fullscreenFocusedChanged, this, &Settings::fullscreenFocusedChanged);
+                    }
+                } else if (d->fullscreenTracker) {
+                    emitFullscreenChanged = d->fullscreenTracker->fullscreenFocused();
+                    d->fullscreenTracker.reset();
+                }
+
+                if (emitFullscreenChanged) {
+                    Q_EMIT fullscreenFocusedChanged();
+                }
             } else if (group.name() == QLatin1String("Notifications")) {
                 d->notificationSettings.load();
             } else if (group.name() == QLatin1String("Jobs")) {
@@ -343,20 +367,6 @@ void Settings::setCriticalPopupsInDoNotDisturbMode(bool enable)
     d->setDirty(true);
 }
 
-bool Settings::keepNormalAlwaysOnTop() const
-{
-    return d->notificationSettings.normalAlwaysOnTop();
-}
-
-void Settings::setKeepNormalAlwaysOnTop(bool enable)
-{
-    if (this->keepNormalAlwaysOnTop() == enable) {
-        return;
-    }
-    d->notificationSettings.setNormalAlwaysOnTop(enable);
-    d->setDirty(true);
-}
-
 bool Settings::lowPriorityPopups() const
 {
     return d->notificationSettings.lowPriorityPopups();
@@ -577,6 +587,38 @@ void Settings::setInhibitNotificationsWhenScreenSharing(bool inhibit)
     d->setDirty(true);
 }
 
+bool Settings::inhibitNotificationsWhenFullscreen() const
+{
+    return d->dndSettings.whenFullscreen();
+}
+
+void Settings::setInhibitNotificationsWhenFullscreen(bool inhibit)
+{
+    if (inhibit == inhibitNotificationsWhenFullscreen()) {
+        return;
+    }
+
+    d->dndSettings.setWhenFullscreen(inhibit);
+    d->setDirty(true);
+}
+
+bool Settings::fullscreenFocused() const
+{
+    return d->fullscreenTracker && d->fullscreenTracker->fullscreenFocused();
+}
+
+void Settings::setFullscreenFocused(bool focused)
+{
+    if (focused) {
+        qCWarning(NOTIFICATIONMANAGER) << "Cannot forcefully set fullscreen focused";
+        return;
+    }
+
+    if (d->fullscreenTracker) {
+        d->fullscreenTracker->setFullscreenFocused(focused);
+    }
+}
+
 void Settings::revokeApplicationInhibitions()
 {
     Server::self().clearInhibitions();
diff --git a/libnotificationmanager/settings.h b/libnotificationmanager/settings.h
index 19f5b940e66..dd9f9ab16e6 100644
--- a/libnotificationmanager/settings.h
+++ b/libnotificationmanager/settings.h
@@ -1,5 +1,6 @@
 /*
     SPDX-FileCopyrightText: 2019 Kai Uwe Broulik <kde at privat.broulik.de>
+    SPDX-FileCopyrightText: 2024 Kristen McWilliam <kmcwilliampublic at gmail.com>
 
     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
 */
@@ -40,10 +41,6 @@ class NOTIFICATIONMANAGER_EXPORT Settings : public QObject
      * Whether to show critical notification popups in do not disturb mode.
      */
     Q_PROPERTY(bool criticalPopupsInDoNotDisturbMode READ criticalPopupsInDoNotDisturbMode WRITE setCriticalPopupsInDoNotDisturbMode NOTIFY settingsChanged)
-    /**
-     * Whether to keep normal notifications always on top.
-     */
-    Q_PROPERTY(bool keepNormalAlwaysOnTop READ keepNormalAlwaysOnTop WRITE setKeepNormalAlwaysOnTop NOTIFY settingsChanged)
     /**
      * Whether to show popups for low priority notifications.
      */
@@ -168,6 +165,26 @@ class NOTIFICATIONMANAGER_EXPORT Settings : public QObject
     Q_PROPERTY(bool inhibitNotificationsWhenScreenSharing READ inhibitNotificationsWhenScreenSharing WRITE setInhibitNotificationsWhenScreenSharing NOTIFY
                    settingsChanged)
 
+    /**
+     * Whether to enable do not disturb mode when a fullscreen window is focused
+     *
+     * @since 6.4
+     */
+    Q_PROPERTY(
+        bool inhibitNotificationsWhenFullscreen READ inhibitNotificationsWhenFullscreen WRITE setInhibitNotificationsWhenFullscreen NOTIFY settingsChanged)
+
+    /**
+     * Whether a fullscreen window is currently focused
+     *
+     * This property is only updated when @c inhibitNotificationsWhenFullscreen
+     * is set to true, otherwise it is always false.
+     * You can assign false to this property if you want to temporarily revoke automatic do not disturb
+     * mode when a fullscreen window is focused until the window is no longer fullscreen.
+     *
+     * @since 6.4
+     */
+    Q_PROPERTY(bool fullscreenFocused READ fullscreenFocused WRITE setFullscreenFocused NOTIFY fullscreenFocusedChanged)
+
     /**
      * Whether notification sounds should be disabled
      *
@@ -249,9 +266,6 @@ public:
     bool criticalPopupsInDoNotDisturbMode() const;
     void setCriticalPopupsInDoNotDisturbMode(bool enable);
 
-    bool keepNormalAlwaysOnTop() const;
-    void setKeepNormalAlwaysOnTop(bool enable);
-
     bool lowPriorityPopups() const;
     void setLowPriorityPopups(bool enable);
 
@@ -304,6 +318,12 @@ public:
     bool inhibitNotificationsWhenScreenSharing() const;
     void setInhibitNotificationsWhenScreenSharing(bool inhibit);
 
+    bool inhibitNotificationsWhenFullscreen() const;
+    void setInhibitNotificationsWhenFullscreen(bool inhibit);
+
+    bool fullscreenFocused() const;
+    void setFullscreenFocused(bool focused);
+
     bool notificationSoundsInhibited() const;
     void setNotificationSoundsInhibited(bool inhibited);
 
@@ -328,6 +348,8 @@ Q_SIGNALS:
 
     void screensMirroredChanged();
 
+    void fullscreenFocusedChanged();
+
 private:
     class Private;
     std::unique_ptr<Private> d;


More information about the kde-doc-english mailing list