aboutsummaryrefslogtreecommitdiff
path: root/src/media-player-list.vala
diff options
context:
space:
mode:
authorLars Uebernickel <lars.uebernickel@canonical.com>2013-04-03 19:07:14 -0400
committerLars Uebernickel <lars.uebernickel@canonical.com>2013-04-03 19:07:14 -0400
commitb5d24eeed9528525861d7a7c185327a5e19c7bb7 (patch)
tree002093cfcdf4e246bd7e736317d3a9a5ccadaf91 /src/media-player-list.vala
parent1419ef39b81be9d8a42b915ad9f56e81ab4eb03c (diff)
downloadayatana-indicator-sound-b5d24eeed9528525861d7a7c185327a5e19c7bb7.tar.gz
ayatana-indicator-sound-b5d24eeed9528525861d7a7c185327a5e19c7bb7.tar.bz2
ayatana-indicator-sound-b5d24eeed9528525861d7a7c185327a5e19c7bb7.zip
Sync list of media players with gsettings
Diffstat (limited to 'src/media-player-list.vala')
-rw-r--r--src/media-player-list.vala73
1 files changed, 60 insertions, 13 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) {