[banshee] Mpris: Only raise PropertiesChanged signal if value changed (bgo#682510)



commit 3dddac9c34f6ed9161840499e577d110e77ff08d
Author: Kevin Anthony <kevin s anthony gmail com>
Date:   Wed Aug 22 18:01:50 2012 -0400

    Mpris: Only raise PropertiesChanged signal if value changed (bgo#682510)
    
    This prevents sending several signals with the same information.
    
    We also take the opportunity to refactor the AddPropertyChange code in a
    single method, while keeping the existing, strongly-typed methods.
    
    Signed-off-by: Bertrand Lorentz <bertrand lorentz gmail com>

 .../Banshee.Mpris/Banshee.Mpris/MediaPlayer.cs     |   39 ++++++++++----------
 1 files changed, 20 insertions(+), 19 deletions(-)
---
diff --git a/src/Extensions/Banshee.Mpris/Banshee.Mpris/MediaPlayer.cs b/src/Extensions/Banshee.Mpris/Banshee.Mpris/MediaPlayer.cs
index d7ab5c1..c630640 100644
--- a/src/Extensions/Banshee.Mpris/Banshee.Mpris/MediaPlayer.cs
+++ b/src/Extensions/Banshee.Mpris/Banshee.Mpris/MediaPlayer.cs
@@ -54,6 +54,7 @@ namespace Banshee.Mpris
         private PlayerEngineService engine_service;
         private Gtk.ToggleAction fullscreen_action;
         private Dictionary<string, AbstractPlaylistSource> playlist_sources;
+        private Dictionary<string, object> current_properties;
         private Dictionary<string, object> changed_properties;
         private List<string> invalidated_properties;
 
@@ -86,6 +87,7 @@ namespace Banshee.Mpris
             engine_service = ServiceManager.PlayerEngine;
             playlist_sources = new Dictionary<string, AbstractPlaylistSource> ();
             changed_properties = new Dictionary<string, object> ();
+            current_properties = new Dictionary<string, object> ();
             invalidated_properties = new List<string> ();
 
             var interface_service = ServiceManager.Get<InterfaceActionService> ();
@@ -506,35 +508,34 @@ namespace Banshee.Mpris
 
         public void AddPropertyChange (params PlayerProperties [] properties)
         {
-            lock (changed_properties) {
-                foreach (PlayerProperties prop in properties) {
-                    string prop_name = prop.ToString ();
-                    changed_properties[prop_name] = Get (player_interface_name, prop_name);
-                }
-                // TODO We could check if a property really has changed and only fire the event in that case
-                HandlePropertiesChange (player_interface_name);
-            }
+            AddPropertyChange (player_interface_name, properties.Select (p => p.ToString()));
         }
 
         public void AddPropertyChange (params MediaPlayerProperties [] properties)
         {
-            lock (changed_properties) {
-                foreach (MediaPlayerProperties prop in properties) {
-                    string prop_name = prop.ToString ();
-                    changed_properties[prop_name] = Get (mediaplayer_interface_name, prop_name);
-                }
-                HandlePropertiesChange (mediaplayer_interface_name);
-            }
+            AddPropertyChange (mediaplayer_interface_name, properties.Select (p => p.ToString()));
         }
 
         public void AddPropertyChange (params PlaylistProperties [] properties)
         {
+            AddPropertyChange (playlists_interface_name, properties.Select (p => p.ToString()));
+        }
+
+        private void AddPropertyChange (string interface_name, IEnumerable<string> property_names)
+        {
             lock (changed_properties) {
-                foreach (PlaylistProperties prop in properties) {
-                    string prop_name = prop.ToString ();
-                    changed_properties[prop_name] = Get (playlists_interface_name, prop_name);
+                foreach (string prop_name in property_names) {
+                    object current_value = null;
+                    current_properties.TryGetValue (prop_name, out current_value);
+                    var new_value = Get (interface_name, prop_name);
+                    if ((current_value == null) || !(current_value.Equals (new_value))) {
+                        changed_properties [prop_name] = new_value;
+                        current_properties [prop_name] = new_value;
+                    }
+                }
+                if (changed_properties.Count > 0) {
+                    HandlePropertiesChange (interface_name);
                 }
-                HandlePropertiesChange (playlists_interface_name);
             }
         }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]