aboutsummaryrefslogtreecommitdiff
path: root/src/media-player-list-greeter.vala
diff options
context:
space:
mode:
authorTed Gould <ted@gould.cx>2014-02-24 15:36:48 -0600
committerTed Gould <ted@gould.cx>2014-02-24 15:36:48 -0600
commita758202c3799256ddded7ee790744d6fe3c1c4a7 (patch)
tree4355914be83bfa0dbbba37b4648a9ab5e869fd14 /src/media-player-list-greeter.vala
parentd42cb160a6823f34b478aab7c50a8b2247be0cf4 (diff)
downloadayatana-indicator-sound-a758202c3799256ddded7ee790744d6fe3c1c4a7.tar.gz
ayatana-indicator-sound-a758202c3799256ddded7ee790744d6fe3c1c4a7.tar.bz2
ayatana-indicator-sound-a758202c3799256ddded7ee790744d6fe3c1c4a7.zip
Build up our list of media players from the greeter list
Diffstat (limited to 'src/media-player-list-greeter.vala')
-rw-r--r--src/media-player-list-greeter.vala62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/media-player-list-greeter.vala b/src/media-player-list-greeter.vala
index 6bcf270..c07663a 100644
--- a/src/media-player-list-greeter.vala
+++ b/src/media-player-list-greeter.vala
@@ -17,7 +17,69 @@
* Ted Gould <ted@canonical.com>
*/
+[DBus (name="com.canonical.UnityGreeter.List")]
+public interface UnityGreeterList : Object {
+ public abstract async string get_active_entry () throws IOError;
+ public signal void entry_selected (string entry_name);
+}
+
public class MediaPlayerListGreeter : MediaPlayerList {
+ string? selected_user = null;
+ UnityGreeterList? proxy = null;
+ HashTable<string, MediaPlayerUser> players = new HashTable<string, MediaPlayerUser>(str_hash, str_equal);
+
+ public MediaPlayerListGreeter () {
+ Bus.get_proxy.begin<UnityGreeterList> (
+ BusType.SESSION,
+ "com.canonical.Unity",
+ "/list",
+ DBusProxyFlags.NONE,
+ null,
+ new_proxy);
+ }
+
+ void new_proxy (GLib.Object? obj, AsyncResult res) {
+ try {
+ this.proxy = Bus.get_proxy.end(res);
+
+ this.proxy.entry_selected.connect(active_user_changed);
+ this.proxy.get_active_entry.begin ((obj, res) => {
+ try {
+ var value = (obj as UnityGreeterList).get_active_entry.end(res);
+ active_user_changed(value);
+ } catch (Error e) {
+ warning("Unable to get active entry: %s", e.message);
+ }
+ });
+ } catch (Error e) {
+ this.proxy = null;
+ warning("Unable to create proxy to the greeter: %s", e.message);
+ }
+ }
+
+ void active_user_changed (string active_user) {
+ /* No change, move along */
+ if (selected_user == active_user) {
+ return;
+ }
+
+ var old_user = selected_user;
+ selected_user = active_user;
+
+ if (selected_user != null && !players.contains(selected_user)) {
+ players.insert(selected_user, new MediaPlayerUser(selected_user));
+ }
+
+ if (old_user != null) {
+ var old_player = players.lookup(old_user);
+ player_removed(old_player);
+ }
+
+ if (selected_user != null) {
+ var new_player = players.lookup(selected_user);
+ player_added(new_player);
+ }
+ }
}