diff --git a/resources/schemas/org.gnome.shell.extensions.do-not-disturb-while-screen-sharing-or-recording.gschema.xml b/resources/schemas/org.gnome.shell.extensions.do-not-disturb-while-screen-sharing-or-recording.gschema.xml index 803325d..a52d903 100644 --- a/resources/schemas/org.gnome.shell.extensions.do-not-disturb-while-screen-sharing-or-recording.gschema.xml +++ b/resources/schemas/org.gnome.shell.extensions.do-not-disturb-while-screen-sharing-or-recording.gschema.xml @@ -1,6 +1,6 @@ - @@ -15,5 +15,9 @@ true Internal state informing prefs if Wayland session is running + + false + DND status when the automatic DND was activated (internal state) + \ No newline at end of file diff --git a/src/dnd-manager.ts b/src/dnd-manager.ts index 029fc62..ff62826 100644 --- a/src/dnd-manager.ts +++ b/src/dnd-manager.ts @@ -1,28 +1,41 @@ import Gio from "@gi-ts/gio2"; +import { SettingsManager } from "settings-manager"; const showBannersSetting = "show-banners"; -const schemaId = "org.gnome.desktop.notifications"; +const notificationsSchemaId = "org.gnome.desktop.notifications"; export class DoNotDisturbManager { - private _settings: Gio.Settings | null = null; + private _notificationsSettings: Gio.Settings | null = null; + private _settingsManager: SettingsManager | null = null; - private getSettings() { - if (!this._settings) { - this._settings = new Gio.Settings({ schema_id: schemaId }); + constructor(settingsManager: SettingsManager) { + this._settingsManager = settingsManager; + } + + private getNotificationsSettings() { + if (!this._notificationsSettings) { + this._notificationsSettings = new Gio.Settings({ + schema_id: notificationsSchemaId, + }); } - return this._settings; + return this._notificationsSettings; } turnDndOn() { - this.getSettings().set_boolean(showBannersSetting, false); + this._settingsManager?.setWasDoNotDisturbActive( + !this.getNotificationsSettings().get_boolean(showBannersSetting) + ); + this.getNotificationsSettings().set_boolean(showBannersSetting, false); } turnDndOff() { - this.getSettings().set_boolean(showBannersSetting, true); + if (!this._settingsManager?.getWasDoNotDisturbActive()) { + this.getNotificationsSettings().set_boolean(showBannersSetting, true); + } } dispose() { - this._settings = null; + this._notificationsSettings = null; } } diff --git a/src/extension.ts b/src/extension.ts index 6088865..cf250f2 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,7 +3,12 @@ import { Extension } from "gnomejs://extension.js"; import Meta from "@gi-types/meta10"; import { DoNotDisturbManager } from "dnd-manager"; -import { ScreenRecordingNotifier, ScreenRecordingStatus, ScreenSharingNotifier, ScreenSharingStatus } from "./notifiers"; +import { + ScreenRecordingNotifier, + ScreenRecordingStatus, + ScreenSharingNotifier, + ScreenSharingStatus, +} from "./notifiers"; import { SettingsManager, SettingsPath } from "settings-manager"; export default class DoNotDisturbWhileScreenSharingOrRecordingExtension extends Extension { @@ -24,7 +29,7 @@ export default class DoNotDisturbWhileScreenSharingOrRecordingExtension extends this._screenRecordingNotifier = new ScreenRecordingNotifier(); this._screenSharingNotifier = new ScreenSharingNotifier(); - this._dndManager = new DoNotDisturbManager(); + this._dndManager = new DoNotDisturbManager(this._settings); this._screenRecordingSubId = this._screenRecordingNotifier.subscribe( this.handleScreenRecording.bind(this) diff --git a/src/settings-manager.ts b/src/settings-manager.ts index 7af253a..6d0ca8a 100644 --- a/src/settings-manager.ts +++ b/src/settings-manager.ts @@ -6,11 +6,13 @@ export const SettingsPath = const DoNotDisturbOnScreenSharingSetting = "dnd-on-screen-sharing"; const DoNotDisturbOnScreenRecordingSetting = "dnd-on-screen-recording"; const IsWaylandSetting = "is-wayland"; +const WasDoNotDisturbActiveSetting = "was-dnd-active"; type AvailableSettings = | "dnd-on-screen-sharing" | "dnd-on-screen-recording" - | "is-wayland"; + | "is-wayland" + | "was-dnd-active"; export class SettingsManager { private settings: Gio.Settings; @@ -43,6 +45,14 @@ export class SettingsManager { this.settings.set_boolean(IsWaylandSetting, value); } + getWasDoNotDisturbActive(): boolean { + return this.settings.get_boolean(WasDoNotDisturbActiveSetting); + } + + setWasDoNotDisturbActive(value: boolean) { + this.settings.set_boolean(WasDoNotDisturbActiveSetting, value); + } + connectToChanges(settingName: AvailableSettings, func: () => void): number { return this.settings.connect(`changed::${settingName}`, func); }