linux-presets/gui/gnome/autocustom-gnome-macos/res/extensions/dash-to-dock@micxgx.gmail.com/notificationsMonitor.js

121 lines
3.8 KiB
JavaScript
Executable File

// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
import {Gio} from './dependencies/gi.js';
import {Main} from './dependencies/shell/ui.js';
import {
Docking,
Utils,
} from './imports.js';
const {signals: Signals} = imports;
const Labels = Object.freeze({
SOURCES: Symbol('sources'),
NOTIFICATIONS: Symbol('notifications'),
});
export class NotificationsMonitor {
constructor() {
this._settings = new Gio.Settings({
schema_id: 'org.gnome.desktop.notifications',
});
this._appNotifications = Object.create(null);
this._signalsHandler = new Utils.GlobalSignalsHandler(this);
const getIsEnabled = () => !this.dndMode &&
Docking.DockManager.settings.showIconsNotificationsCounter;
this._isEnabled = getIsEnabled();
const checkIsEnabled = () => {
const isEnabled = getIsEnabled();
if (isEnabled !== this._isEnabled) {
this._isEnabled = isEnabled;
this.emit('state-changed');
this._updateState();
}
};
this._dndMode = !this._settings.get_boolean('show-banners');
this._signalsHandler.add(this._settings, 'changed::show-banners', () => {
this._dndMode = !this._settings.get_boolean('show-banners');
checkIsEnabled();
});
this._signalsHandler.add(Docking.DockManager.settings,
'changed::show-icons-notifications-counter', checkIsEnabled);
this._updateState();
}
destroy() {
this.emit('destroy');
this._signalsHandler.destroy();
this._signalsHandler = null;
this._appNotifications = null;
this._settings = null;
}
get enabled() {
return this._isEnabled;
}
get dndMode() {
return this._dndMode;
}
getAppNotificationsCount(appId) {
return this._appNotifications[appId] ?? 0;
}
_updateState() {
if (this.enabled) {
this._signalsHandler.addWithLabel(Labels.SOURCES, Main.messageTray,
'source-added', () => this._checkNotifications());
this._signalsHandler.addWithLabel(Labels.SOURCES, Main.messageTray,
'source-removed', () => this._checkNotifications());
} else {
this._signalsHandler.removeWithLabel(Labels.SOURCES);
}
this._checkNotifications();
}
_checkNotifications() {
this._appNotifications = Object.create(null);
this._signalsHandler.removeWithLabel(Labels.NOTIFICATIONS);
if (this.enabled) {
Main.messageTray.getSources().forEach(source => {
this._signalsHandler.addWithLabel(Labels.NOTIFICATIONS, source,
'notification-added', () => this._checkNotifications());
source.notifications.forEach(notification => {
const app = notification.source?.app ?? notification.source?._app;
if (app?.id) {
if (notification.resident) {
if (notification.acknowledged)
return;
this._signalsHandler.addWithLabel(Labels.NOTIFICATIONS,
notification, 'notify::acknowledged',
() => this._checkNotifications());
}
this._signalsHandler.addWithLabel(Labels.NOTIFICATIONS,
notification, 'destroy', () => this._checkNotifications());
this._appNotifications[app.id] =
(this._appNotifications[app.id] ?? 0) + 1;
}
});
});
}
this.emit('changed');
}
}
Signals.addSignalMethods(NotificationsMonitor.prototype);