diff options
-rw-r--r-- | src/mpris2-controller.vala | 207 | ||||
-rw-r--r-- | src/mpris2-watcher.vala | 8 | ||||
-rw-r--r-- | src/music-player-bridge.vala | 34 |
3 files changed, 124 insertions, 125 deletions
diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index c382e97..ff19598 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -20,11 +20,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>. using Dbusmenu; -/*[DBus (name = "org.freedesktop.DBus.Properties")] - public interface FreeDesktopProperties : DBus.Object{ - // signals - public signal void PropertiesChanged(string source, HashTable<string, - Value?> changed_properties, +[DBus (name = "org.freedesktop.DBus.Properties")] + public interface FreeDesktopProperties : Object{ + public signal void PropertiesChanged(string source, HashTable<string, Variant?> changed_properties, string[] invalid); } @@ -33,136 +31,131 @@ using Dbusmenu; point in trying to get encorporate both into the same object model. */ public class Mpris2Controller : GLib.Object -{ - public static const string root_interface = "org.mpris.MediaPlayer2" ; - public MprisRoot mpris2_root {get; construct;} - public MprisPlayer player {get; construct;} - //public FreeDesktopProperties properties_interface {get; construct;} +{ + public static const string root_interface = "org.mpris.MediaPlayer2" ; + public MprisRoot mpris2_root {get; construct;} + public MprisPlayer player {get; construct;} + public FreeDesktopProperties properties_interface {get; construct;} public PlayerController owner {get; construct;} - - public Mpris2Controller(PlayerController ctrl) - { - GLib.Object(owner: ctrl); - } - - construct{ + + public Mpris2Controller(PlayerController ctrl) + { + GLib.Object(owner: ctrl); + } + + construct{ try { - this.mpris2_root = Bus.get_proxy_sync ( BusType.SESSION, + this.mpris2_root = Bus.get_proxy_sync ( BusType.SESSION, root_interface.concat(".").concat(this.owner.mpris_name), - "/org/mpris/MediaPlayer2"); - this.player = Bus.get_proxy_sync ( BusType.SESSION, + "/org/mpris/MediaPlayer2"); + this.player = Bus.get_proxy_sync ( BusType.SESSION, root_interface.concat(".").concat(this.owner.mpris_name), - "/org/mpris/MediaPlayer2" ); - /* - this.properties_interface = (FreeDesktopProperties) connection.get_object("org.freedesktop.Properties.PropertiesChanged", - "/org/mpris/MediaPlayer2"); - this.properties_interface.PropertiesChanged += property_changed_cb;*/ + "/org/mpris/MediaPlayer2" ); - } catch (IOError e) { - error("Problems connecting to the session bus - %s", e.message); - } - } - - /*public void property_changed_cb(string interface_source, HashTable<string, Value?> changed_properties, string[] invalid ) - { - debug("properties-changed for interface %s and owner %s", interface_source, this.owner.mpris_name); - - if(changed_properties == null || interface_source.has_prefix(this.root_interface) == false ){ - warning("Property-changed hash is null or this is an interface that doesn't concerns us"); - return; - } - Value? play_v = changed_properties.lookup("PlaybackStatus"); - if(play_v != null){ - string state = this.player.PlaybackStatus; - TransportMenuitem.state p = (TransportMenuitem.state)this.determine_play_state(state); - (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); - } - - Value? meta_v = changed_properties.lookup("Metadata"); - if(meta_v != null){ - GLib.HashTable<string, Value?> changed_updates = clean_metadata(); + this.properties_interface = Bus.get_proxy_sync ( BusType.SESSION, + "org.freedesktop.Properties.PropertiesChanged", + "/org/mpris/MediaPlayer2" ); + this.properties_interface.PropertiesChanged += property_changed_cb; + } + catch (IOError e) { + error("Problems connecting to the session bus - %s", e.message); + } + } + + public void property_changed_cb ( string interface_source, + HashTable<string, Variant?> changed_properties, + string[] invalid ) + { + debug("properties-changed for interface %s and owner %s", interface_source, this.owner.mpris_name); + if(changed_properties == null || interface_source.has_prefix(this.root_interface) == false ){ + warning("Property-changed hash is null or this is an interface that doesn't concerns us"); + return; + } + Variant? play_v = changed_properties.lookup("PlaybackStatus"); + if(play_v != null){ + string state = this.player.PlaybackStatus; + TransportMenuitem.state p = (TransportMenuitem.state)this.determine_play_state(state); + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p); + } + Variant? meta_v = changed_properties.lookup("Metadata"); + if(meta_v != null){ + GLib.HashTable<string, Variant?> changed_updates = clean_metadata(); PlayerItem metadata = this.owner.custom_items[PlayerController.widget_order.METADATA]; - metadata.reset(MetadataMenuitem.attributes_format()); - metadata.update(changed_updates, - MetadataMenuitem.attributes_format()); - metadata.property_set_bool(MENUITEM_PROP_VISIBLE, - metadata.populated(MetadataMenuitem.attributes_format())); + metadata.reset( MetadataMenuitem.attributes_format()); + metadata.update ( changed_updates, + MetadataMenuitem.attributes_format()); + metadata.property_set_bool ( MENUITEM_PROP_VISIBLE, + metadata.populated(MetadataMenuitem.attributes_format())); } - }*/ + } - private GLib.HashTable<string, Value?>? clean_metadata() + private GLib.HashTable<string, Variant?>? clean_metadata() { - /*GLib.HashTable<string, Value?> changed_updates = this.player.Metadata; - Value? artist_v = this.player.Metadata.lookup("xesam:artist"); + GLib.HashTable<string, Variant?> changed_updates = this.player.Metadata; + Variant? artist_v = this.player.Metadata.lookup("xesam:artist"); if(artist_v != null){ string[] artists = (string[])this.player.Metadata.lookup("xesam:artist"); string display_artists = string.joinv(", ", artists); changed_updates.replace("xesam:artist", display_artists); debug("artist : %s", display_artists); } - Value? length_v = this.player.Metadata.lookup("mpris:length"); + Variant? length_v = this.player.Metadata.lookup("mpris:length"); if(length_v != null){ int64 duration = this.player.Metadata.lookup("mpris:length").get_int64(); changed_updates.replace("mpris:length", duration/1000000); } return changed_updates; - */ - return null; - } - - private TransportMenuitem.state determine_play_state(string? status){ - if(status != null && status == "Playing"){ - return TransportMenuitem.state.PLAYING; - } - return TransportMenuitem.state.PAUSED; + //return null; } - public void initial_update() - { - TransportMenuitem.state update; - /*if(this.player.PlaybackStatus == null){ - update = TransportMenuitem.state.PAUSED; - }*/ + private TransportMenuitem.state determine_play_state(string? status){ + if(status != null && status == "Playing"){ + return TransportMenuitem.state.PLAYING; + } + return TransportMenuitem.state.PAUSED; + } + + public void initial_update() + { + TransportMenuitem.state update; + if(this.player.PlaybackStatus == null){ + update = TransportMenuitem.state.PAUSED; + } update = determine_play_state(null); - + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(TransportMenuitem.state.PAUSED); - GLib.HashTable<string, Value?>? cleaned_metadata = this.clean_metadata(); - //this.owner.custom_items[PlayerController.widget_order.METADATA].update(cleaned_metadata, - // MetadataMenuitem.attributes_format()); - } - - public void transport_update(TransportMenuitem.action command) - { - debug("transport_event input = %i", (int)command); - if(command == TransportMenuitem.action.PLAY_PAUSE){ - this.player.PlayPause.begin(); - } - else if(command == TransportMenuitem.action.PREVIOUS){ - this.player.Previous.begin(); - } - else if(command == TransportMenuitem.action.NEXT){ - this.player.Next.begin(); - } - } - - public bool connected() - { - return false; - } + GLib.HashTable<string, Value?>? cleaned_metadata = this.clean_metadata(); + this.owner.custom_items[PlayerController.widget_order.METADATA].update(cleaned_metadata, + MetadataMenuitem.attributes_format()); + } + + public void transport_update(TransportMenuitem.action command) + { + debug("transport_event input = %i", (int)command); + if(command == TransportMenuitem.action.PLAY_PAUSE){ + this.player.PlayPause.begin(); + } + else if(command == TransportMenuitem.action.PREVIOUS){ + this.player.Previous.begin(); + } + else if(command == TransportMenuitem.action.NEXT){ + this.player.Next.begin(); + } + } - - public bool was_successfull(){ - return false; - } + public bool connected() + { + return (this.player != null && this.mpris2_root != null); + } - public void expose() - { - if(this.connected() == true){ - //this.mpris2_root.Raise.begin(); - } - } + public void expose() + { + if(this.connected() == true){ + this.mpris2_root.Raise.begin(); + } + } } diff --git a/src/mpris2-watcher.vala b/src/mpris2-watcher.vala index 7e41b5f..1cf8baa 100644 --- a/src/mpris2-watcher.vala +++ b/src/mpris2-watcher.vala @@ -34,7 +34,7 @@ public class Mpris2Watcher : GLib.Object FreeDesktopObject fdesktop_obj; public signal void client_appeared ( string desktop_name ); - public signal void client_disappeared ( string desktop_name ); + public signal void client_disappeared ( string mpris_root_interface ); public Mpris2Watcher () { @@ -72,11 +72,11 @@ public class Mpris2Watcher : GLib.Object return; } if (previous_owner != "" && current_owner == "") { - debug ("Service '%s' going down", name); - client_disappeared (mpris2_root.DesktopEntry); + debug ("Client '%s' gone down", name); + client_disappeared (name); } else if (previous_owner == "" && current_owner != "") { - debug ("Service '%s' has appeared", name); + debug ("Client '%s' has appeared", name); client_appeared (mpris2_root.DesktopEntry); } } diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index c905c12..d1c2334 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -114,19 +114,18 @@ public class MusicPlayerBridge : GLib.Object } } - /*public void on_server_removed(Indicate.ListenerServer object, string type) + public void client_has_vanished ( string mpris_root_interface ) { - debug("MusicPlayerBridge -> on_server_removed with value %s", type); - if(server_is_not_of_interest(type)) return; - if (root_menu != null){ - var tmp = type.split("."); - debug("attempt to remove %s", tmp[tmp.length-1]); - if(tmp.length > 0){ - registered_clients[tmp[tmp.length - 1]].hibernate(); - debug("Successively offlined client %s", tmp[tmp.length - 1]); + debug("MusicPlayerBridge -> on_server_removed with value %s", mpris_root_interface); + if (root_menu != null){ + debug("attempt to remove %s", mpris_root_interface); + var mpris_key = determine_key ( mpris_root_interface ); + if ( mpris_key != null ){ + registered_clients[mpris_key].hibernate(); + debug("Successively offlined client %s", mpris_key); } - } - }*/ + } + } public void set_root_menu_item(Dbusmenu.Menuitem menu) { @@ -134,7 +133,7 @@ public class MusicPlayerBridge : GLib.Object this.try_to_add_inactive_familiar_clients(); this.watcher = new Mpris2Watcher (); this.watcher.client_appeared += this.client_has_become_available; - //this.watcher.client_appeared += this.client_has_become_available; + this.watcher.client_disappeared += this.client_has_vanished; } public static AppInfo? create_app_info ( string path ) @@ -150,8 +149,15 @@ public class MusicPlayerBridge : GLib.Object private static string? determine_key(owned string path) { - var tokens = path.split("/"); - if ( tokens.length < 2) return null; + var tokens = path.split( "/" ); + if ( tokens.length < 2 ){ + // try to split on "." + tokens = path.split("."); + if ( tokens.length < 2 ){ + // don't know what this is + return null; + } + } var filename = tokens[tokens.length - 1]; var result = filename.split(".")[0]; var temp = result.split("-"); |