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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
namespace AstalNotifd {
public enum ActiveType {
DAEMON,
PROXY,
}
public class Notifd : Object {
private Daemon daemon;
private DaemonProxy proxy;
private HashTable<uint, Notification> notifs =
new HashTable<uint, Notification>((i) => i, (a, b) => a == b);
public signal void active(ActiveType type);
public string cache_directory {
owned get {
return proxy != null ? proxy.cache_directory : daemon.cache_directory;
}
set {
if (proxy != null)
proxy.cache_directory = value;
else
daemon.cache_directory = value;
}
}
public bool ignore_timeout {
get {
return proxy != null ? proxy.ignore_timeout : daemon.ignore_timeout;
}
set {
if (proxy != null)
proxy.ignore_timeout = value;
else
daemon.ignore_timeout = value;
}
}
public bool dont_disturb {
get {
return proxy != null ? proxy.dont_disturb : daemon.dont_disturb;
}
set {
if (proxy != null)
proxy.dont_disturb = value;
else
daemon.dont_disturb = value;
}
}
public List<weak Notification> notifications {
owned get { return notifs.get_values(); }
}
public uint[] notification_ids() throws Error {
return proxy != null ? proxy.notification_ids() : daemon.notification_ids();
}
public Notification get_notification(uint id) {
return notifs.get(id);
}
public string get_notification_json(uint id) {
return notifs.get(id).to_json_string();
}
public signal void notified(uint id) {
add_notification(id);
}
public signal void resolved(uint id, ClosedReason reason) {
notifs.remove(id);
}
private void add_notification(uint id) {
try {
if (proxy != null) {
var json = proxy.get_notification_json(id);
notifs.set(id, Notification.from_json_string(json));
} else {
notifs.set(id, daemon.get_notification(id));
}
} catch (Error err) {
warning("could not add notification: %s", err.message);
}
}
construct {
Bus.own_name(
BusType.SESSION,
"org.freedesktop.Notifications",
BusNameOwnerFlags.NONE,
try_daemon,
() => {
if (proxy != null) {
proxy.stop();
proxy = null;
}
active(ActiveType.DAEMON);
},
try_proxy
);
}
private void try_daemon(DBusConnection conn) {
daemon = new Daemon().register(conn);
daemon.notified.connect((id) => notified(id));
daemon.resolved.connect((id, reason) => resolved(id, reason));
daemon.notify.connect((prop) => {
if (get_class().find_property(prop.name) != null) {
notify_property(prop.name);
}
});
foreach (var n in daemon.notifications) {
notifs.set(n.id, n);
}
}
private void try_proxy() {
proxy = new DaemonProxy();
if (proxy.start()) {
try {
foreach (var id in proxy.notification_ids()) {
add_notification(id);
}
}
catch (Error err) {
warning("could not get notification ids: %s", err.message);
}
active(ActiveType.PROXY);
} else {
return;
}
proxy.notified.connect((id) => notified(id));
proxy.resolved.connect((id, reason) => resolved(id, reason));
proxy.notify.connect((prop) => {
if (get_class().find_property(prop.name) != null) {
notify_property(prop.name);
}
});
}
}
}
|