← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~cjcurran/indicator-sound/mpris2-modifications into lp:indicator-sound

 

Conor Curran has proposed merging lp:~cjcurran/indicator-sound/mpris2-modifications into lp:indicator-sound.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)


Mpris 2 overhaul since the spec was completely changed late Wednesday last week. 
Lots of fixes in here, 
-service attempts mpris 2 before fallbacking to mpris 1. 
For now there is wrapper which handles whether we are dealing with either. Once all clients move to mpris2 the mpris1 class will be deleted.
-Raise/expose/bring to the forefront now works. So the player can be brought forward by the user clicking on the title in the menu.
-lots of niggling spacing issues sorted.
- now the player if closed, will result in the menu properly removing all dbusmenitems except the title. If the title is clicked again the application is started up again as outlined in the spec. 


-- 
https://code.launchpad.net/~cjcurran/indicator-sound/mpris2-modifications/+merge/32898
Your team ayatana-commits is subscribed to branch lp:indicator-sound.
=== modified file 'configure.ac'
--- configure.ac	2010-07-29 15:30:41 +0000
+++ configure.ac	2010-08-17 16:50:53 +0000
@@ -35,8 +35,9 @@
 INDICATOR_DISPLAY_OBJECTS=0.1.11
 INDICATE_REQUIRED_VERSION=0.4.1
 DBUSMENUGLIB_REQUIRED_VERSION=0.3.1
+GIO_2_0_REQUIRED_VERSION=2.25.13
 
-PKG_CHECK_MODULES(APPLET, gtk+-2.0 >= $GTK_REQUIRED_VERSION
+PKG_CHECK_MODULES(APPLET,gtk+-2.0 >= $GTK_REQUIRED_VERSION
                           indicator >= $INDICATOR_REQUIRED_VERSION
 			              			dbusmenu-gtk >= $DBUSMENUGTK_REQUIRED_VERSION
                           libido-0.1 >= $INDICATOR_DISPLAY_OBJECTS)

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2010-08-09 20:42:24 +0000
+++ src/Makefile.am	2010-08-17 16:50:53 +0000
@@ -65,6 +65,7 @@
 	scrub-menu-item.vala \
 	title-menu-item.vala \
 	player-controller.vala \
+	mpris-bridge.vala \
 	mpris-controller.vala \
 	mpris2-controller.vala \
 	player-item.vala \
@@ -82,7 +83,8 @@
   --pkg Dbusmenu-Glib-0.2 \
   --pkg common-defs \
 	--pkg dbus-glib-1 \
-	--pkg gio-unix-2.0 
+	--pkg gio-unix-2.0
+	 
  $(MAINTAINER_VALAFLAGS)
 
 music_bridge_APIFILES = \

=== modified file 'src/metadata-widget.c'
--- src/metadata-widget.c	2010-07-27 11:39:51 +0000
+++ src/metadata-widget.c	2010-08-17 16:50:53 +0000
@@ -201,11 +201,9 @@
 
 	if(g_value_get_int(value) == DBUSMENU_PROPERTY_EMPTY){
 		g_debug("Metadata widget: property update - reset");
-		gchar* empty = "";
 		GValue new_value = {0};
   	g_value_init(&new_value, G_TYPE_STRING);		
 		g_value_set_string(&new_value, g_strdup(""));		
-		//g_free(empty);
 		value = &new_value;
 	}
 	

=== added file 'src/mpris-bridge.vala'
--- src/mpris-bridge.vala	1970-01-01 00:00:00 +0000
+++ src/mpris-bridge.vala	2010-08-17 16:50:53 +0000
@@ -0,0 +1,70 @@
+public class MprisBridge : GLib.Object
+{
+	private MprisController mpris1_controller;
+	private Mpris2Controller mpris2_controller;	
+	private enum mode{
+		MPRIS_1,
+		MPRIS_2
+	}
+	private mode mode_in_use;
+	
+	public MprisBridge(PlayerController ctrl)
+	{
+		this.mpris2_controller = new Mpris2Controller(ctrl);
+		if(this.mpris2_controller.was_successfull() == true){
+			this.mode_in_use = mode.MPRIS_2;
+			this.mpris1_controller = null;
+			this.mpris2_controller.initial_update();
+		}
+		else{
+			this.mpris2_controller = null;
+			this.mode_in_use = mode.MPRIS_1;
+			this.mpris1_controller = new MprisController(ctrl);
+		}
+	}
+	
+	// The handling of both mpris controllers can be abstracted further 
+	// once the mpris2 is implemented. This will allow for one instance
+	// variable to point at the active controller. For now handle both ...  
+	public bool connected()
+	{
+		if(this.mode_in_use == mode.MPRIS_1){
+			return this.mpris1_controller.connected();			
+		}
+		else if(this.mode_in_use == mode.MPRIS_2){
+			return this.mpris2_controller.connected();			
+		}
+		return false;
+	}
+	
+	public void transport_update(TransportMenuitem.action update)
+	{
+		if(this.mode_in_use == mode.MPRIS_1){
+			this.mpris1_controller.transport_event(update);
+		}
+		else if(this.mode_in_use == mode.MPRIS_2){
+			this.mpris2_controller.transport_event(update);
+		}
+	}
+
+	public void expose()
+	{
+ 		if(this.mode_in_use == mode.MPRIS_2){
+			this.mpris2_controller.expose();
+		 }
+		else{
+			warning("MPRIS1 clients don't have the ability to raise/expose the client"); 			        
+		}						
+	}
+
+
+	public void set_track_position(double pos)
+	{
+		if(this.mode_in_use == mode.MPRIS_1){
+			this.mpris1_controller.set_position(pos);
+		}
+		else if(this.mode_in_use == mode.MPRIS_2){
+			this.mpris2_controller.set_position(pos);
+		}
+	}	
+}
\ No newline at end of file

=== modified file 'src/mpris-controller.vala'
--- src/mpris-controller.vala	2010-08-11 19:04:04 +0000
+++ src/mpris-controller.vala	2010-08-17 16:50:53 +0000
@@ -63,7 +63,6 @@
 		                            MetadataMenuitem.attributes_format());
 		this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.mpris_player.GetMetadata(),
 		                        ScrubMenuitem.attributes_format());		
-		// temporary fix
 		ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem;
 		scrub.update_position(this.mpris_player.PositionGet());		
 	}
@@ -127,7 +126,7 @@
 		
 		this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format());
 		this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format());
-		HashTable<string, Value?> status_hash = new HashTable<string, Value?>(str_hash, str_equal);
+		//HashTable<string, Value?> status_hash = new HashTable<string, Value?>(str_hash, str_equal);
 
 		status st = this.mpris_player.GetStatus();
 		int play_state =  st.playback;

=== modified file 'src/mpris2-controller.vala'
--- src/mpris2-controller.vala	2010-08-11 19:04:04 +0000
+++ src/mpris2-controller.vala	2010-08-17 16:50:53 +0000
@@ -17,32 +17,42 @@
 You should have received a copy of the GNU General Public License along 
 with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
-using Gee;
-
-[DBus (name = "org.mpris.MediaPlayer.Player")]
-public interface MprisPlayer : Object {
-	
-	public struct Status { 
-    public int32 Playback_State;
-    public double Playback_Rate;
-    public bool Repeat_State;
-    public bool Shuffle_State;
-		public bool Endless_State;
-	}
-	
-	public abstract HashTable<string, Value?> Metadata{owned get;}
-	public abstract double Volume{get;}
-	public abstract int32 Capabilities{get;}
-	public abstract int32 Position{get;}
-	
-	public abstract void SetPosition(string prop, int32 pos) throws DBus.Error;
+using DBus;
+
+[DBus (name = "org.mpris.MediaPlayer2")]
+public interface MprisRoot : DBus.Object {
+	// properties
+	public abstract bool HasTracklist{owned get; set;}
+	public abstract bool CanQuit{owned get; set;}
+	public abstract bool CanRaise{owned get; set;}
+	public abstract string Identity{owned get; set;}
+	public abstract string DesktopEntry{owned get; set;}	
+	// methods
+	public abstract void Quit() throws DBus.Error;
+	public abstract void Raise() throws DBus.Error;
+}
+
+[DBus (name = "org.mpris.MediaPlayer2.Player")]
+public interface MprisPlayer : DBus.Object {
+
+	// properties
+	public abstract HashTable<string, Value?> Metadata{owned get; set;}
+	public abstract int32 Position{owned get; set;}
+	public abstract string PlaybackStatus{owned get; set;}	
+	// methods
+	public abstract void SetPosition(DBus.ObjectPath path, int64 pos) throws DBus.Error;
 	public abstract void PlayPause() throws DBus.Error;
 	public abstract void Pause() throws DBus.Error;
 	public abstract void Next() throws DBus.Error;
 	public abstract void Previous() throws DBus.Error;
+	// signals
+	public signal void Seeked(int64 new_position);
+}
 
-	public abstract signal void StatusChanged(Status update);
-	public abstract signal void TrackChanged(HashTable<string,Value?> Metadata);
+[DBus (name = "org.freedesktop.DBus.Properties")]
+public interface FreeDesktopProperties : DBus.Object{
+	// signals
+	public signal void PropertiesChanged(string source, HashTable<string, Value?> changed_properties, string[] invalid);
 }
 
 /*
@@ -51,51 +61,106 @@
  */
 public class Mpris2Controller : GLib.Object
 {		
-	private DBus.Connection connection;
-	public dynamic DBus.Object mpris2_root {get; construct;}		
-	public MprisPlayer mpris2_player {get; construct;}		
-	public PlayerController owner {get; construct;}	
+	public static const string root_interface = "org.mpris.MediaPlayer2" ;	
+	public MprisRoot mpris2_root {get; construct;}		
+	public MprisPlayer player {get; construct;}		
+	public PlayerController owner {get; construct;}
+	public FreeDesktopProperties properties_interface {get; construct;}
 	
 	public Mpris2Controller(PlayerController ctrl)
 	{
-		Object(owner: ctrl);				
+		GLib.Object(owner: ctrl);
 	}
 	
 	construct{
     try {
-			debug("going to create this mpris 2 controller");			
-      this.connection = DBus.Bus.get (DBus.BusType.SESSION);
-    } catch (Error e) {
+      var connection = DBus.Bus.get (DBus.BusType.SESSION);
+			this.mpris2_root = (MprisRoot) connection.get_object (root_interface.concat(".").concat(this.owner.name.down()),
+				                                             "/org/mpris/MediaPlayer2",
+				                                             root_interface);						
+			this.player = (MprisPlayer) connection.get_object (root_interface.concat(".").concat(this.owner.name.down()),
+				                                               "/org/mpris/MediaPlayer2",
+				                                               root_interface.concat(".Player"));						
+			this.player.Seeked += onSeeked;
+
+			this.properties_interface = (FreeDesktopProperties) connection.get_object(root_interface.concat(".").concat(this.owner.name.down()),
+			                                                                          "/org/mpris/MediaPlayer2",
+			                                                                          "org.freedesktop.DBus.Properties");
+			this.properties_interface.PropertiesChanged += property_changed_cb;			
+			
+		} catch (DBus.Error e) {
       error("Problems connecting to the session bus - %s", e.message);
     }		
-		this.mpris2_root = this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()),
-		                                              "/org/mpris/MediaPlayer", 
-		                                              "org.mpris.MediaPlayer");				
-
-		this.mpris2_player = (MprisPlayer)this.connection.get_object ("org.mpris.mediaplayers.".concat(this.owner.name.down()) ,
-		                                                							"/org/mpris/MediaPlayer/Player", 
-		                                                							"org.mpris.MediaPlayer.Player");			
-		this.mpris2_player.TrackChanged += onTrackChanged;	
-    this.mpris2_player.StatusChanged += onStatusChanged;
-		initial_update();
-	}
-	
-	private void initial_update()
+	}
+
+	public void property_changed_cb(string interface_source, HashTable<string, Value?> changed_properties, string[] invalid )
+	{	
+		debug("properties-changed for interface %s", interface_source);
+		if(changed_properties == null || interface_source.has_prefix(this.root_interface) == false){
+			warning("Property-changed hash is null or this is an interface that concerns us");
+			return;
+		}
+		Value? play_v = changed_properties.lookup("PlaybackStatus");
+		if(play_v != null){
+			string state = play_v.get_string();		
+			debug("new playback state = %s", state);			
+			int p = this.determine_play_state(state);
+			(this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p);			
+			(this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem).update_playstate(p);			
+		}
+		
+		Value? pos_v = changed_properties.lookup("Position");
+		if(pos_v != null){
+			int64 pos = pos_v.get_int64();
+			debug("new position = %i", (int)pos);
+			(this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem).update_position((int32)pos);						
+		}
+
+		Value? meta_v = changed_properties.lookup("Metadata");
+		if(meta_v != null){
+			debug("metadata is not empty");
+			debug("artist : %s", this.player.Metadata.lookup("artist").get_string());			
+			this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format());			
+			this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.player.Metadata,
+			                          																						 MetadataMenuitem.attributes_format());			
+			this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format());	
+			if((int)this.player.Metadata.lookup("artist").get_string().len() > 0 ||
+			   (int)this.player.Metadata.lookup("artist").get_string().len() > 0){
+				this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.player.Metadata,
+					                    																							ScrubMenuitem.attributes_format());			
+			}
+			(this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem).update_playstate(this.determine_play_state(this.player.PlaybackStatus));			
+			
+		}
+	}
+	
+	private int determine_play_state(string status){
+		if(status == null)
+			return 1;
+		
+		if(status != null && status == "Playing"){
+			debug("determine play state - state = %s", status);
+			return 0;
+		}
+		return 1;		
+	}
+	
+	public void initial_update()
 	{
-		bool r  =  (bool)this.mpris2_player.Status.Shuffle_State;
-		int32 p  =  (int32)this.mpris2_player.Status.Playback_State;
-
-		debug("initial update - play state %i", p);
-		debug("initial update - shuffle state %s", r.to_string());
+		int32 status;
+		if(this.player.PlaybackStatus == null){
+			status = 1;
+		}
+		else{
+			status = determine_play_state(this.player.PlaybackStatus);
+		}
+		debug("initial update - play state %i", status);
 		
-		(this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(p);
-		this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.mpris2_player.Metadata,
+		(this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(status);
+		this.owner.custom_items[PlayerController.widget_order.METADATA].update(this.player.Metadata,
 			                          MetadataMenuitem.attributes_format());
-		this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.mpris2_player.Metadata,
+		this.owner.custom_items[PlayerController.widget_order.SCRUB].update(this.player.Metadata,
 			                      ScrubMenuitem.attributes_format());		
-		ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem;
-		scrub.update_position(this.mpris2_player.Position);
-		
 	}
 
 	public void transport_event(TransportMenuitem.action command)
@@ -103,20 +168,41 @@
 		debug("transport_event input = %i", (int)command);
 		if(command == TransportMenuitem.action.PLAY_PAUSE){
 			debug("transport_event PLAY_PAUSE");
-			this.mpris2_player.PlayPause();							
+			try{
+				this.player.PlayPause();							
+			}
+			catch(DBus.Error error){
+				warning("DBus Error calling the player objects PlayPause method %s",
+				        error.message);
+			}			
 		}
 		else if(command == TransportMenuitem.action.PREVIOUS){
-			this.mpris2_player.Previous();
+			try{
+				this.player.Previous();
+			}
+			catch(DBus.Error error){
+				warning("DBus Error calling the player objects Previous method %s",
+				        error.message);
+			}							
 		}
 		else if(command == TransportMenuitem.action.NEXT){
-			this.mpris2_player.Next();
-		}		
+			try{
+				this.player.Next();
+			}
+			catch(DBus.Error error){
+				warning("DBus Error calling the player objects Next method %s",
+				      	error.message);
+			}								
+		}	
 	}
-
+	/**
+		TODO: SetPosition on the player object is not working with rhythmbox,
+	  runtime error - "dbus function not supported"
+	 */
 	public void set_position(double position)
-	{		
+	{			
 		debug("Set position with pos (0-100) %f", position);
-		HashTable<string, Value?> data = this.mpris2_player.Metadata;
+		HashTable<string, Value?> data = this.player.Metadata;
 		Value? time_value = data.lookup("time");
 		if(time_value == null){
 			warning("Can't fetch the duration of the track therefore cant set the position");
@@ -127,56 +213,52 @@
 		double new_time_position = total_time * position/100.0;
 		debug("new position = %f", (new_time_position * 1000));		
 
-		Value? v = this.mpris2_player.Metadata.lookup("trackid");
+		Value? v = this.player.Metadata.lookup("trackid");
 		if(v != null){
-			if(v.holds (typeof (int))){
-				debug("the trackid = %i", v.get_int());			
-			}
-			else if(v.holds (typeof (string))){
+			if(v.holds (typeof (string))){
 				debug("the trackid = %s", v.get_string());
+				DBus.ObjectPath path = new ObjectPath(v.get_string());
+				try{
+					this.player.SetPosition(path, (int64)(new_time_position * 1000));
+				}
+				catch(DBus.Error error){
+					warning("DBus Error calling the player objects SetPosition method %s",
+						      error.message);
+				}							
 			}
-		}
-			        
-		//this.mpris2_player.SetPosition((int32)(new_time_position));
+		}			        
+	}
+
+	public void onSeeked(int64 position){
+		debug("Seeked signal callback with pos = %i", (int)position/1000);
 		ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem;
-		scrub.update_position(this.mpris2_player.Position);				
+		scrub.update_position((int32)position/1000);			
 	}
 	
 	public bool connected()
 	{
-		return (this.mpris2_player != null);
-	}
-	
-	private void onStatusChanged(MprisPlayer.Status st)
-  {
-		debug("onStatusChange - play state %i", st.Playback_State);
-		HashTable<string, Value?> ht = new HashTable<string, Value?>(str_hash, str_equal);
-		Value v = Value(typeof(int));
-		v.set_int(st.Playback_State);
-		ht.insert("state", v); 
-		this.owner.custom_items[PlayerController.widget_order.TRANSPORT].update(ht, TransportMenuitem.attributes_format());
-		this.owner.custom_items[PlayerController.widget_order.SCRUB].update(ht, ScrubMenuitem.attributes_format());		
-	}
-	
-	private void onTrackChanged(HashTable<string,Value?> ht)
+		return (this.player != null && this.mpris2_root != null);
+	}
+
+		
+	public bool was_successfull(){
+		if(this.mpris2_root == null ||this.player == null){
+			return false;
+		}
+		return true;
+	}
+
+	public void expose()
 	{
-		this.owner.custom_items[PlayerController.widget_order.METADATA].reset(MetadataMenuitem.attributes_format());
-		this.owner.custom_items[PlayerController.widget_order.SCRUB].reset(ScrubMenuitem.attributes_format());
-		this.owner.custom_items[PlayerController.widget_order.METADATA].update(ht,
-		                            MetadataMenuitem.attributes_format());
-		debug("about to update the duration on the scrub bar");
-		Value? v = ht.lookup("time");
-		if(v != null)
-		{
-			debug("with the duration of %i", (int)v.get_uint()); 
-			debug("with Position of %i", this.mpris2_player.Position); 
+		if(this.connected() == true){
+			try{
+				this.mpris2_root.Raise();
+			}
+			catch(DBus.Error e){
+				error("Exception thrown while calling root function Raise - %s", e.message);
+			}
 		}
-		this.owner.custom_items[PlayerController.widget_order.SCRUB].update(ht,
-		                        ScrubMenuitem.attributes_format());		
-		ScrubMenuitem scrub = this.owner.custom_items[PlayerController.widget_order.SCRUB] as ScrubMenuitem;
-		scrub.update_position(this.mpris2_player.Position);
 	}
-	
 }
 
 

=== modified file 'src/player-controller.vala'
--- src/player-controller.vala	2010-08-11 19:04:04 +0000
+++ src/player-controller.vala	2010-08-17 16:50:53 +0000
@@ -23,7 +23,7 @@
 
 public class PlayerController : GLib.Object
 {
-	public const int WIDGET_QUANTITY = 6;
+	public const int WIDGET_QUANTITY = 5;
 
 	public static enum widget_order{
 		SEPARATOR,
@@ -31,7 +31,6 @@
 		METADATA,
 		SCRUB,
 		TRANSPORT,
-		PLAYLIST
 	}
 
 	public enum state{
@@ -43,20 +42,16 @@
 	}
 	
 	public int current_state = state.OFFLINE;
-	
-	
+		
 	private Dbusmenu.Menuitem root_menu;
 	public string name { get; set;}	
 	public ArrayList<PlayerItem> custom_items;	
-	public Mpris2Controller mpris2_adaptor;
-	public MprisController mpris_adaptor;
-	public bool mpris2;
+	public MprisBridge mpris_bridge;
 	public AppInfo? app_info { get; set;}
 	public int menu_offset { get; set;}
 		
 	public PlayerController(Dbusmenu.Menuitem root, string client_name, int offset, state initial_state)
 	{
-		this.mpris2 = false;
 		this.root_menu = root;
 		this.name = format_client_name(client_name.strip());
 		this.custom_items = new ArrayList<PlayerItem>();
@@ -77,7 +72,6 @@
 	public void activate()
 	{
 		this.establish_mpris_connection();	
-		//this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE, true);		
 	}
 
 	/*
@@ -104,14 +98,7 @@
 			debug("establish_mpris_connection - Not ready to connect");
 			return;
 		}		
-		if(this.name == "Vlc"){
-			debug("establishing a vlc mpris controller");
-			this.mpris2_adaptor = new Mpris2Controller(this);
-			this.mpris2 = true;
-		}
-		else{
-			this.mpris_adaptor = new MprisController(this);
-		}
+		this.mpris_bridge = new MprisBridge(this); 
 		this.determine_state();
 	}
 	
@@ -140,25 +127,14 @@
 			                                                        false);
 			this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE,
 			                                                           false);
-	  	this.custom_items[widget_order.PLAYLIST].property_set_bool(MENUITEM_PROP_VISIBLE,
-			                                                           false);		
 			return;	
 		}
-		debug("update layout - metadata %s", this.custom_items[widget_order.METADATA].populated(MetadataMenuitem.attributes_format()).to_string());
 		this.custom_items[widget_order.METADATA].property_set_bool(MENUITEM_PROP_VISIBLE,
-			                                                        this.custom_items[widget_order.METADATA].populated(MetadataMenuitem.attributes_format()));
-		//debug("metadata id %i", this.custom_items[widget_order.METADATA].id);
-		
-		debug("update layout - scrub %s", this.custom_items[widget_order.SCRUB].populated(ScrubMenuitem.attributes_format()).to_string());
+			                                                        this.custom_items[widget_order.METADATA].populated(MetadataMenuitem.attributes_format()));		
 		this.custom_items[widget_order.SCRUB].property_set_bool(MENUITEM_PROP_VISIBLE,
 		                                                        this.custom_items[widget_order.SCRUB].populated(ScrubMenuitem.attributes_format()));
-
-
 		this.custom_items[widget_order.TRANSPORT].property_set_bool(MENUITEM_PROP_VISIBLE,
 		                                                            true);
-
-	  this.custom_items[widget_order.PLAYLIST].property_set_bool(MENUITEM_PROP_VISIBLE,
-		                                                         true);	
 	}
 		
 	private void construct_widgets()
@@ -181,34 +157,11 @@
 		// Transport item
 		TransportMenuitem transport_item = new TransportMenuitem(this);
 		this.custom_items.add(transport_item);
-		
-		this.custom_items.add(create_playlist());		
-		
+				
 		foreach(PlayerItem item in this.custom_items){
 			root_menu.child_add_position(item, this.menu_offset + this.custom_items.index_of(item));			
 		}
 	}	
-
-	private PlayerItem create_playlist()
-	{
-		PlayerItem playlist_root = new PlayerItem(CLIENT_TYPES_DEFAULT);
-		playlist_root.property_set(MENUITEM_PROP_LABEL, "Choose Playlist");
-
-		PlayerItem subentry_1 = new PlayerItem(CLIENT_TYPES_DEFAULT);
-		subentry_1.property_set(MENUITEM_PROP_LABEL, "Raster-noton selection");
-
-		PlayerItem subentry_2 = new PlayerItem(CLIENT_TYPES_DEFAULT);
-		subentry_2.property_set(MENUITEM_PROP_LABEL, "Rune Grammofon selection");
-
-		PlayerItem subentry_3 = new PlayerItem(CLIENT_TYPES_DEFAULT);
-		subentry_3.property_set(MENUITEM_PROP_LABEL, "Kranky selection");
-		
-		playlist_root.child_append(subentry_1);
-		playlist_root.child_append(subentry_2);
-		playlist_root.child_append(subentry_3);
-
-		return playlist_root;
-	}
 	
 	private static string format_client_name(string client_name)
 	{
@@ -223,45 +176,13 @@
 	// Temporarily we will need to handle to different mpris implemenations
 	// Do it for now - a couple of weeks should see this messy carry on out of
 	// the codebase.
-	public void set_track_position(double pos)
-	{
-		if(this.mpris2 == true){ 
-			this.mpris2_adaptor.set_position(pos);
-		}
-		else{
-			this.mpris_adaptor.set_position(pos);			
-		}
-	}
-
-	public void transport_update(TransportMenuitem.action update)
-	{
-		if(this.mpris2 == true){ 
-			this.mpris2_adaptor.transport_event(update);
-		}
-		else{
-			this.mpris_adaptor.transport_event(update);			
-		}		
-	}
-
 	public void determine_state()
 	{
-		if(this.mpris2 == true){ 
-			if(this.mpris2_adaptor.connected() == true){
-				debug("yup I'm connected");
-				this.update_state(state.CONNECTED);
-			}
-			else{
-				this.update_state(state.DISCONNECTED);
-			}
+		if(this.mpris_bridge.connected() == true){
+			this.update_state(state.CONNECTED);
 		}
 		else{
-			if(this.mpris_adaptor.connected() == true){
-				debug("yup I'm connected");
-				this.update_state(state.CONNECTED);
-			}
-			else{
-				this.update_state(state.DISCONNECTED);
-			}			
-		}			
+			this.update_state(state.DISCONNECTED);
+		}
 	}
 }
\ No newline at end of file

=== modified file 'src/scrub-menu-item.vala'
--- src/scrub-menu-item.vala	2010-08-11 19:04:04 +0000
+++ src/scrub-menu-item.vala	2010-08-17 16:50:53 +0000
@@ -32,7 +32,7 @@
 	public override void handle_event(string name, GLib.Value input_value, uint timestamp)
 	{
 		debug("handle_event for owner %s with value: %f", this.owner.name, input_value.get_double());		
-		this.owner.set_track_position(input_value.get_double());		
+		this.owner.mpris_bridge.set_track_position(input_value.get_double());		
 	}
 
 	public void update_position(int32 new_position)

=== modified file 'src/title-menu-item.vala'
--- src/title-menu-item.vala	2010-07-13 11:18:08 +0000
+++ src/title-menu-item.vala	2010-08-17 16:50:53 +0000
@@ -35,6 +35,9 @@
 		{
 			this.owner.instantiate();
 		}
+		else if(this.owner.current_state == PlayerController.state.CONNECTED){
+			this.owner.mpris_bridge.expose();
+		}		
 	}
 	
 

=== modified file 'src/transport-menu-item.vala'
--- src/transport-menu-item.vala	2010-08-11 19:04:04 +0000
+++ src/transport-menu-item.vala	2010-08-17 16:50:53 +0000
@@ -45,7 +45,7 @@
 		int input = input_value.get_int();
 		debug("handle_event with value %s", input.to_string());
 		debug("transport owner name = %s", this.owner.name);
-		this.owner.transport_update((action)input);
+		this.owner.mpris_bridge.transport_update((action)input);
 	}	
 
 	public static HashSet<string> attributes_format()


Follow ups