diff options
author | Ted Gould <ted@gould.cx> | 2014-02-24 15:36:48 -0600 |
---|---|---|
committer | Ted Gould <ted@gould.cx> | 2014-02-24 15:36:48 -0600 |
commit | a758202c3799256ddded7ee790744d6fe3c1c4a7 (patch) | |
tree | 4355914be83bfa0dbbba37b4648a9ab5e869fd14 /src/media-player-list-greeter.vala | |
parent | d42cb160a6823f34b478aab7c50a8b2247be0cf4 (diff) | |
download | ayatana-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.vala | 62 |
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); + } + } } |