diff options
author | Lars Uebernickel <lars.uebernickel@canonical.com> | 2013-04-03 19:07:14 -0400 |
---|---|---|
committer | Lars Uebernickel <lars.uebernickel@canonical.com> | 2013-04-03 19:07:14 -0400 |
commit | b5d24eeed9528525861d7a7c185327a5e19c7bb7 (patch) | |
tree | 002093cfcdf4e246bd7e736317d3a9a5ccadaf91 | |
parent | 1419ef39b81be9d8a42b915ad9f56e81ab4eb03c (diff) | |
download | ayatana-indicator-sound-b5d24eeed9528525861d7a7c185327a5e19c7bb7.tar.gz ayatana-indicator-sound-b5d24eeed9528525861d7a7c185327a5e19c7bb7.tar.bz2 ayatana-indicator-sound-b5d24eeed9528525861d7a7c185327a5e19c7bb7.zip |
Sync list of media players with gsettings
-rw-r--r-- | src/media-player-list.vala | 73 | ||||
-rw-r--r-- | src/service.vala | 25 |
2 files changed, 76 insertions, 22 deletions
diff --git a/src/media-player-list.vala b/src/media-player-list.vala index 0c0a212..3fa08f3 100644 --- a/src/media-player-list.vala +++ b/src/media-player-list.vala @@ -37,26 +37,73 @@ public class MediaPlayerList { } } - public signal void player_added (MediaPlayer player); - - HashTable<string, MediaPlayer> _players; - Mpris2Watcher mpris_watcher; - - void player_appeared (string desktop_id, string dbus_name, bool use_playlists) { - var appinfo = new DesktopAppInfo (desktop_id + ".desktop"); - if (appinfo == null) { - warning ("unable to find application '%s'", desktop_id); - return; - } - + /** + * Adds the player associated with @desktop_id. Does nothing if such a player already exists. + */ + public MediaPlayer? insert (string desktop_id) { + message ("inserting %s", desktop_id); MediaPlayer? player = this._players.lookup (desktop_id); + if (player == null) { + message (" Really."); + var appinfo = new DesktopAppInfo (desktop_id + ".desktop"); + if (appinfo == null) { + warning ("unable to find application '%s'", desktop_id); + return null; + } + player = new MediaPlayer (appinfo); this._players.insert (player.id, player); this.player_added (player); } - player.attach (dbus_name); + return player; + } + + /** + * Removes the player associated with @desktop_id, unless it is currently running. + */ + public void remove (string desktop_id) { + MediaPlayer? player = this._players.lookup (desktop_id); + + if (player != null && !player.is_running) { + this._players.remove (desktop_id); + this.player_removed (player); + } + } + + /** + * Synchronizes the player list with @desktop_ids. After this call, this list will only contain the players + * in @desktop_ids. Players that were running but are not in @desktop_ids will remain in the list. + */ + public void sync (string[] desktop_ids) { + + /* hash desktop_ids for faster lookup */ + var hash = new HashTable<string, unowned string> (str_hash, str_equal); + foreach (var id in desktop_ids) + hash.add (id); + + /* remove players that are not desktop_ids */ + foreach (var id in this._players.get_keys ()) { + if (!hash.contains (id)) + this.remove (id); + } + + /* insert all players (insert() takes care of not adding a player twice */ + foreach (var id in desktop_ids) + this.insert (id); + } + + public signal void player_added (MediaPlayer player); + public signal void player_removed (MediaPlayer player); + + HashTable<string, MediaPlayer> _players; + Mpris2Watcher mpris_watcher; + + void player_appeared (string desktop_id, string dbus_name, bool use_playlists) { + var player = this.insert (desktop_id); + if (player != null) + player.attach (dbus_name); } void player_disappeared (string dbus_name) { diff --git a/src/service.vala b/src/service.vala index 4ea4a95..8f5280e 100644 --- a/src/service.vala +++ b/src/service.vala @@ -1,10 +1,24 @@ public class IndicatorSound.Service { public Service () { + this.settings = new Settings ("com.canonical.indicator.sound"); + this.volume_control = new VolumeControl (); this.players = new MediaPlayerList (); - this.players.player_added.connect (player_added); + this.players.player_added.connect (this.player_added); + + this.actions = new SimpleActionGroup (); + this.actions.add_entries (action_entries, this); + this.actions.add_action (this.create_mute_action ()); + this.actions.add_action (this.create_volume_action ()); + + this.menu = create_base_menu (); + + this.players.sync (settings.get_strv ("preferred-media-players")); + this.settings.changed["preferred-media-players"].connect ( () => { + this.players.sync (settings.get_strv ("preferred-media-players")); + }); } public int run () { @@ -30,6 +44,7 @@ public class IndicatorSound.Service { MainLoop loop; SimpleActionGroup actions; Menu menu; + Settings settings; VolumeControl volume_control; MediaPlayerList players; uint player_action_update_id; @@ -97,14 +112,6 @@ public class IndicatorSound.Service { } void bus_acquired (DBusConnection connection, string name) { - this.actions = new SimpleActionGroup (); - this.actions.add_entries (action_entries, this); - - this.actions.add_action (this.create_mute_action ()); - this.actions.add_action (this.create_volume_action ()); - - this.menu = create_base_menu (); - try { connection.export_action_group ("/com/canonical/indicator/sound", this.actions); connection.export_menu_model ("/com/canonical/indicator/sound/desktop", this.menu); |