-
Notifications
You must be signed in to change notification settings - Fork 460
/
notificationsMonitor.js
121 lines (96 loc) · 3.86 KB
/
notificationsMonitor.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// -*- 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;
const appId = app?.id ?? app?._appId;
if (appId) {
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[appId] =
(this._appNotifications[appId] ?? 0) + 1;
}
});
});
}
this.emit('changed');
}
}
Signals.addSignalMethods(NotificationsMonitor.prototype);