aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--src/media-player-list.vala73
-rw-r--r--src/service.vala25
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);