diff options
Diffstat (limited to 'src/daemon.vala')
-rw-r--r-- | src/daemon.vala | 86 |
1 files changed, 57 insertions, 29 deletions
diff --git a/src/daemon.vala b/src/daemon.vala index fe38364..b8fb598 100644 --- a/src/daemon.vala +++ b/src/daemon.vala @@ -1,30 +1,39 @@ -namespace AstalNotifd { -public enum ClosedReason { - EXPIRED = 1, - DISMISSED_BY_USER = 2, - CLOSED = 3, - UNDEFINED = 4, -} - [DBus (name = "org.freedesktop.Notifications")] -internal class Daemon : Object { +internal class AstalNotifd.Daemon : Object { public static string name = "notifd"; public static string vendor = "astal"; public static string version = "0.1"; - private string cache_file; + private string state_file; + private string state_directory; private string cache_directory; private uint n_id = 1; private HashTable<uint, Notification> notifs = new HashTable<uint, Notification>((i) => i, (a, b) => a == b); - public bool ignore_timeout { get; set; } - public bool dont_disturb { get; set; } + private bool _ignore_timeout; + public bool ignore_timeout { + get { return _ignore_timeout; } + set { + _ignore_timeout = value; + write_state(); + } + } + + private bool _dont_disturb; + public bool dont_disturb { + get { return _dont_disturb; } + set { + _dont_disturb = value; + write_state(); + } + } public signal void notified(uint id, bool replaced); public signal void resolved(uint id, ClosedReason reason); public signal void action_invoked(uint id, string action); + public signal void prop_changed(string prop); // emitting an event from proxy doesn't seem to work public void emit_resolved(uint id, ClosedReason reason) { resolved(id, reason); } @@ -32,24 +41,31 @@ internal class Daemon : Object { construct { cache_directory = Environment.get_user_cache_dir() + "/astal/notifd"; - cache_file = cache_directory + "/notifications.json"; + state_directory = Environment.get_user_state_dir() + "/astal/notifd"; + state_file = state_directory + "/notifications.json"; - if (FileUtils.test(cache_file, FileTest.EXISTS)) { + if (FileUtils.test(state_file, FileTest.EXISTS)) { try { uint8[] json; - File.new_for_path(cache_file).load_contents(null, out json, null); - var parser = new Json.Parser(); - parser.load_from_data((string)json); - var list = parser.get_root().get_array(); + File.new_for_path(state_file).load_contents(null, out json, null); + + var obj = Json.from_string((string)json); + + var list = obj.get_object().get_array_member("notifications"); for (var i = 0; i < list.get_length(); ++i) { add_notification(new Notification.from_json(list.get_object_element(i))); } n_id = list.get_length() + 1; + + _dont_disturb = obj.get_object().get_boolean_member("dont_disturb"); + _ignore_timeout = obj.get_object().get_boolean_member("ignore_timeout"); } catch (Error err) { warning("failed to load cache: %s", err.message); } } + notify.connect((prop) => prop_changed(prop.name)); + notified.connect(() => { notify_property("notifications"); }); @@ -57,7 +73,7 @@ internal class Daemon : Object { resolved.connect((id, reason) => { notifs.get(id).resolved(reason); notifs.remove(id); - cache(); + write_state(); notify_property("notifications"); notification_closed(id, reason); }); @@ -123,7 +139,7 @@ internal class Daemon : Object { notified(id, replaced); - cache(); + write_state(); return id; } @@ -135,21 +151,25 @@ internal class Daemon : Object { return replaced; } - private void cache() { + private void write_state() { var list = new Json.Builder().begin_array(); foreach (var n in notifications) { list.add_value(n.to_json()); } list.end_array(); - var generator = new Json.Generator(); - generator.set_root(list.get_root()); - var json = generator.to_data(null); + + var obj = new Json.Builder() + .begin_object() + .set_member_name("notifications").add_value(list.get_root()) + .set_member_name("ignore_timeout").add_boolean_value(ignore_timeout) + .set_member_name("dont_disturb").add_boolean_value(dont_disturb) + .end_object(); try { - if (!FileUtils.test(cache_directory, FileTest.EXISTS)) - File.new_for_path(cache_directory).make_directory_with_parents(null); + if (!FileUtils.test(state_directory, FileTest.EXISTS)) + File.new_for_path(state_directory).make_directory_with_parents(null); - FileUtils.set_contents_full(cache_file, json); + FileUtils.set_contents_full(state_file, Json.to_string(obj.get_root(), false)); } catch (Error err) { warning("failed to cache notifications: %s", err.message); } @@ -201,6 +221,9 @@ internal class Daemon : Object { var file_name = cache_directory + "/" + data.hash().to_string("%u.png"); try { + if (!FileUtils.test(cache_directory, FileTest.EXISTS)) + File.new_for_path(cache_directory).make_directory_with_parents(null); + var output_stream = File.new_for_path(file_name) .replace(null, false, FileCreateFlags.NONE, null); @@ -214,8 +237,7 @@ internal class Daemon : Object { return file_name; } - [DBus (visible = false)] - public Daemon register(DBusConnection conn) { + internal Daemon register(DBusConnection conn) { try { conn.register_object("/org/freedesktop/Notifications", this); } catch (Error err) { @@ -224,4 +246,10 @@ internal class Daemon : Object { return this; } } + +public enum AstalNotifd.ClosedReason { + EXPIRED = 1, + DISMISSED_BY_USER = 2, + CLOSED = 3, + UNDEFINED = 4, } |