diff options
author | Rahix <rahix@rahix.de> | 2018-02-17 21:45:44 +0100 |
---|---|---|
committer | Rahix <rahix@rahix.de> | 2018-02-17 21:51:02 +0100 |
commit | 08c8b9c6d63784f3db1fa3423e629db3ca461b94 (patch) | |
tree | a2a2cc5667e3c10f5d4f5314c253fba2e0b335c6 | |
parent | 5436d716c0f508eb8ab70f322da862f996ce421e (diff) | |
download | dino-08c8b9c6d63784f3db1fa3423e629db3ca461b94.tar.gz dino-08c8b9c6d63784f3db1fa3423e629db3ca461b94.zip |
Implement notification sounds
Add a new setting to toggle notification sounds on or off. Plays the
systems default instant messaging message sound (message-new-instant)
whenever a notification is shown if toggled on.
-rw-r--r-- | cmake/FindCanberra.cmake | 10 | ||||
-rw-r--r-- | libdino/src/entity/conversation.vala | 4 | ||||
-rw-r--r-- | libdino/src/entity/settings.vala | 10 | ||||
-rw-r--r-- | main/CMakeLists.txt | 1 | ||||
-rw-r--r-- | main/data/settings_dialog.ui | 14 | ||||
-rw-r--r-- | main/src/ui/notifications.vala | 8 | ||||
-rw-r--r-- | main/src/ui/settings_dialog.vala | 3 |
7 files changed, 49 insertions, 1 deletions
diff --git a/cmake/FindCanberra.cmake b/cmake/FindCanberra.cmake new file mode 100644 index 00000000..fbbe1fef --- /dev/null +++ b/cmake/FindCanberra.cmake @@ -0,0 +1,10 @@ +include(PkgConfigWithFallback) +find_pkg_config_with_fallback(Canberra + PKG_CONFIG_NAME libcanberra + LIB_NAMES canberra + INCLUDE_NAMES canberra.h +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Canberra + REQUIRED_VARS Canberra_LIBRARY) diff --git a/libdino/src/entity/conversation.vala b/libdino/src/entity/conversation.vala index 9026e33f..0dfa64f2 100644 --- a/libdino/src/entity/conversation.vala +++ b/libdino/src/entity/conversation.vala @@ -101,6 +101,10 @@ public class Conversation : Object { return notify_setting != NotifySetting.DEFAULT ? notify_setting : get_notification_default_setting(stream_interactor); } + public bool get_sound_setting(StreamInteractor stream_interactor) { + return Application.get_default().settings.sound; + } + public NotifySetting get_notification_default_setting(StreamInteractor stream_interactor) { Xmpp.XmppStream? stream = stream_interactor.get_stream(account); if (!Application.get_default().settings.notifications) return NotifySetting.OFF; diff --git a/libdino/src/entity/settings.vala b/libdino/src/entity/settings.vala index f94a92ca..32d38c90 100644 --- a/libdino/src/entity/settings.vala +++ b/libdino/src/entity/settings.vala @@ -10,6 +10,7 @@ public class Settings : Object { send_typing_ = col_to_bool_or_default("send_typing", true); send_marker_ = col_to_bool_or_default("send_marker", true); notifications_ = col_to_bool_or_default("notifications", true); + sound_ = col_to_bool_or_default("sound", true); convert_utf8_smileys_ = col_to_bool_or_default("convert_utf8_smileys", true); current_width = col_to_int_or_default("window_width", 1200); @@ -56,6 +57,15 @@ public class Settings : Object { } } + private bool sound_; + public bool sound { + get { return sound_; } + set { + db.settings.insert().or("REPLACE").value(db.settings.key, "sound").value(db.settings.value, value.to_string()).perform(); + sound_ = value; + } + } + private bool convert_utf8_smileys_; public bool convert_utf8_smileys { get { return convert_utf8_smileys_; } diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 58e1ab7d..0ef6099d 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -9,6 +9,7 @@ find_packages(MAIN_PACKAGES REQUIRED GModule GObject GTK3>=3.22 + Canberra ) set(RESOURCE_LIST diff --git a/main/data/settings_dialog.ui b/main/data/settings_dialog.ui index 9d18bdc7..861d8b74 100644 --- a/main/data/settings_dialog.ui +++ b/main/data/settings_dialog.ui @@ -54,13 +54,25 @@ </packing> </child> <child> + <object class="GtkCheckButton" id="sound_checkbutton"> + <property name="label" translatable="yes">Play a sound when a new message arrives</property> + <property name="visible">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> <object class="GtkCheckButton" id="emoji_checkbutton"> <property name="label" translatable="yes">Convert smileys to emojis</property> <property name="visible">True</property> </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">3</property> + <property name="top_attach">4</property> <property name="width">1</property> <property name="height">1</property> </packing> diff --git a/main/src/ui/notifications.vala b/main/src/ui/notifications.vala index 246452ea..2eb144e4 100644 --- a/main/src/ui/notifications.vala +++ b/main/src/ui/notifications.vala @@ -14,11 +14,14 @@ public class Notifications : Object { private HashMap<Conversation, Notification> notifications = new HashMap<Conversation, Notification>(Conversation.hash_func, Conversation.equals_func); private Set<string>? active_conversation_ids = null; private Set<string>? active_ids = new HashSet<string>(); + private Canberra.Context sound_context; public Notifications(StreamInteractor stream_interactor, Gtk.Window window) { this.stream_interactor = stream_interactor; this.window = window; + Canberra.Context.create(out sound_context); + stream_interactor.get_module(ChatInteraction.IDENTITY).focused_in.connect((focused_conversation) => { if (active_conversation_ids == null) { Gee.List<Conversation> conversations = stream_interactor.get_module(ConversationManager.IDENTITY).get_active_conversations(); @@ -68,6 +71,11 @@ public class Notifications : Object { active_conversation_ids.add(conversation.id.to_string()); window.urgency_hint = true; } + if (conversation.get_sound_setting(stream_interactor)) { + sound_context.play (0, + Canberra.PROP_EVENT_ID, "message-new-instant", + Canberra.PROP_EVENT_DESCRIPTION, "New Dino message"); + } } private void on_received_subscription_request(Jid jid, Account account) { diff --git a/main/src/ui/settings_dialog.vala b/main/src/ui/settings_dialog.vala index e40b2993..58c86bde 100644 --- a/main/src/ui/settings_dialog.vala +++ b/main/src/ui/settings_dialog.vala @@ -8,6 +8,7 @@ class SettingsDialog : Dialog { [GtkChild] private CheckButton typing_checkbutton; [GtkChild] private CheckButton marker_checkbutton; [GtkChild] private CheckButton notification_checkbutton; + [GtkChild] private CheckButton sound_checkbutton; [GtkChild] private CheckButton emoji_checkbutton; Dino.Entities.Settings settings = Dino.Application.get_default().settings; @@ -18,11 +19,13 @@ class SettingsDialog : Dialog { typing_checkbutton.active = settings.send_typing; marker_checkbutton.active = settings.send_marker; notification_checkbutton.active = settings.notifications; + sound_checkbutton.active = settings.sound; emoji_checkbutton.active = settings.convert_utf8_smileys; typing_checkbutton.toggled.connect(() => { settings.send_typing = typing_checkbutton.active; } ); marker_checkbutton.toggled.connect(() => { settings.send_marker = marker_checkbutton.active; } ); notification_checkbutton.toggled.connect(() => { settings.notifications = notification_checkbutton.active; } ); + sound_checkbutton.toggled.connect(() => { settings.sound = sound_checkbutton.active; } ); emoji_checkbutton.toggled.connect(() => { settings.convert_utf8_smileys = emoji_checkbutton.active; }); } } |