← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~cjcurran/indicator-sound/ambiance-fix into lp:indicator-sound

 

Conor Curran has proposed merging lp:~cjcurran/indicator-sound/ambiance-fix into lp:indicator-sound.

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


Refactors the drawing of the transport controls
 - collapse into one gtkmenuitem object
 - Simplify design. 
 - indirectly fixes ambiance background bug
-- 
https://code.launchpad.net/~cjcurran/indicator-sound/ambiance-fix/+merge/37149
Your team ayatana-commits is subscribed to branch lp:indicator-sound.
=== modified file 'src/Makefile.am'
--- src/Makefile.am	2010-09-13 12:35:28 +0000
+++ src/Makefile.am	2010-09-30 15:52:39 +0000
@@ -7,21 +7,19 @@
 soundmenulibdir = $(INDICATORDIR)
 soundmenulib_LTLIBRARIES = libsoundmenu.la
 libsoundmenu_la_SOURCES = \
-        common-defs.h \
-	indicator-sound.h \
-	transport-widget.c \
-	transport-widget.h \
-	metadata-widget.c \
-	metadata-widget.h \
-	play-button.c \
-	play-button.h \
-	indicator-sound.c \
-	title-widget.c \
-	title-widget.h \
-	volume-widget.c \
-	volume-widget.h \
-	dbus-shared-names.h \
-  sound-service-client.h 
+            common-defs.h \
+            indicator-sound.h \
+            transport-widget.c \
+            transport-widget.h \
+            metadata-widget.c \
+            metadata-widget.h \
+            indicator-sound.c \
+            title-widget.c \
+            title-widget.h \
+            volume-widget.c \
+            volume-widget.h \
+            dbus-shared-names.h \
+            sound-service-client.h 
 
 libsoundmenu_la_CFLAGS = $(APPLET_CFLAGS) -Wall -DG_LOG_DOMAIN=\"Indicator-Sound\"
 libsoundmenu_la_LIBADD = $(APPLET_LIBS)

=== modified file 'src/metadata-widget.c'
--- src/metadata-widget.c	2010-09-10 13:00:43 +0000
+++ src/metadata-widget.c	2010-09-30 15:52:39 +0000
@@ -51,7 +51,6 @@
 static void metadata_widget_dispose       (GObject *object);
 static void metadata_widget_finalize      (GObject *object);
 static gboolean metadata_image_expose     (GtkWidget *image, GdkEventExpose *event, gpointer user_data);
-//static void metadata_widget_style_changed_cb(GtkWidget *widget, gpointer user_data);
 static void metadata_widget_set_style     (GtkWidget* button, GtkStyle* style);
 
 // keyevent consumers

=== modified file 'src/title-widget.c'
--- src/title-widget.c	2010-09-13 14:56:12 +0000
+++ src/title-widget.c	2010-09-30 15:52:39 +0000
@@ -32,7 +32,7 @@
 
 struct _TitleWidgetPrivate
 {
-	DbusmenuMenuitem* twin_item;
+	DbusmenuMenuitem* twin_item;  
 };
 
 #define TITLE_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TITLE_WIDGET_TYPE, TitleWidgetPrivate))
@@ -63,15 +63,15 @@
 static void
 title_widget_class_init (TitleWidgetClass *klass)
 {
-	GObjectClass 			*gobject_class = G_OBJECT_CLASS (klass);
-  GtkWidgetClass    *widget_class = GTK_WIDGET_CLASS (klass);
-
-	widget_class->button_press_event = title_widget_button_press_event;
-	
-	g_type_class_add_private (klass, sizeof (TitleWidgetPrivate));
-
-	gobject_class->dispose = title_widget_dispose;
-	gobject_class->finalize = title_widget_finalize;
+    GObjectClass 			*gobject_class = G_OBJECT_CLASS (klass);
+    GtkWidgetClass    *widget_class = GTK_WIDGET_CLASS (klass);
+
+    widget_class->button_press_event = title_widget_button_press_event;
+
+    g_type_class_add_private (klass, sizeof (TitleWidgetPrivate));
+
+    gobject_class->dispose = title_widget_dispose;
+    gobject_class->finalize = title_widget_finalize;
 }
 
 static void
@@ -92,7 +92,7 @@
                                     + 1 /* padding */,
                                     height);
 	gtk_misc_set_alignment(GTK_MISC(icon), 0.5 /* right aligned */, 0);
-  gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(self), GTK_WIDGET(icon));
+    gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(self), GTK_WIDGET(icon));
 	gtk_widget_show(icon);
 
 }
@@ -118,7 +118,7 @@
 	TitleWidgetPrivate * priv = TITLE_WIDGET_GET_PRIVATE(menuitem);
 	
 	GValue value = {0};
-  g_value_init(&value, G_TYPE_BOOLEAN);
+    g_value_init(&value, G_TYPE_BOOLEAN);
 
 	g_value_set_boolean(&value, TRUE);	
 	dbusmenu_menuitem_handle_event (priv->twin_item, "Title menu event", &value, 0);
@@ -134,8 +134,8 @@
 	TitleWidget* mitem = TITLE_WIDGET(userdata);
 
 	if(g_ascii_strcasecmp(DBUSMENU_TITLE_MENUITEM_NAME, property) == 0){
-    gtk_menu_item_set_label (GTK_MENU_ITEM(mitem),
-                             g_value_get_string(value));
+        gtk_menu_item_set_label (GTK_MENU_ITEM(mitem),
+                                g_value_get_string(value));
 	}
 }
 
@@ -158,8 +158,7 @@
 
   gtk_menu_item_set_label (GTK_MENU_ITEM(self),
                            dbusmenu_menuitem_property_get(priv->twin_item,
-                                                          DBUSMENU_TITLE_MENUITEM_NAME));
-                             
+                                                          DBUSMENU_TITLE_MENUITEM_NAME));                             
 }
                            
 static gboolean
@@ -218,7 +217,7 @@
 {
 	GtkWidget* widget = g_object_new (TITLE_WIDGET_TYPE,
                                           NULL);
-  gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (widget), TRUE);
+    gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (widget), TRUE);
 	title_widget_set_twin_item((TitleWidget*)widget, item);
 
 	return widget;

=== renamed file 'src/play-button.c' => 'src/transport-widget.c'
--- src/play-button.c	2010-09-15 17:19:47 +0000
+++ src/transport-widget.c	2010-09-30 15:52:39 +0000
@@ -25,11 +25,13 @@
 #endif
 
 #include <math.h>
-#include "play-button.h"
+#include "transport-widget.h"
+#include "common-defs.h"
+
 
 #define RECT_WIDTH 130.0f
 #define Y 7.0f
-#define X	37.0f
+#define X 80.0f
 #define INNER_RADIUS 12.5
 #define	MIDDLE_RADIUS 13.5f
 #define OUTER_RADIUS  14.5f
@@ -41,16 +43,16 @@
 #define TRI_WIDTH  11.0f
 #define TRI_HEIGHT 13.0f
 #define TRI_OFFSET  6.0f
-#define PREV_X 35.0f
+#define PREV_X 78.0f
 #define PREV_Y 13.0f
-#define NEXT_X 113.0f
+#define NEXT_X 156.0f
 #define NEXT_Y 13.0f //prev_y
 #define PAUSE_WIDTH 21.0f
 #define PAUSE_HEIGHT 27.0f
 #define BAR_WIDTH 4.5f
 #define BAR_HEIGHT 24.0f
 #define BAR_OFFSET 10.0f
-#define PAUSE_X 78.0f
+#define PAUSE_X 121.0f
 #define	PAUSE_Y 7.0f
 #define PLAY_WIDTH 28.0f
 #define PLAY_HEIGHT 29.0f
@@ -68,18 +70,14 @@
 #define INNER_COMPRESSED_END_SHADE 1.05
 
 
-typedef struct _PlayButtonPrivate PlayButtonPrivate;
+typedef struct _TransportWidgetPrivate TransportWidgetPrivate;
 
-struct _PlayButtonPrivate
+struct _TransportWidgetPrivate
 {
-	GdkColor 				background_colour_fg;
-	GdkColor 				background_colour_bg_dark;
-	GdkColor 				background_colour_bg_light;
-	GdkColor 				foreground_colour_fg;
-	GdkColor 				foreground_colour_bg;
-	PlayButtonEvent current_command;
-	PlayButtonState current_state;
-	GHashTable* 		command_coordinates;	
+	TransportWidgetEvent current_command;
+	TransportWidgetState current_state;
+	GHashTable* 		 command_coordinates;	
+  	DbusmenuMenuitem*    twin_item;		
 };
 
 typedef struct
@@ -90,250 +88,65 @@
 } CairoColorRGB;
 
 
-#define PLAY_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PLAY_BUTTON_TYPE, PlayButtonPrivate))
+#define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate))
 
 /* Gobject boiler plate */
-static void play_button_class_init (PlayButtonClass *klass);
-static void play_button_init       (PlayButton *self);
-static void play_button_dispose    (GObject *object);
-static void play_button_finalize   (GObject *object);
-
-static gboolean play_button_expose (GtkWidget *button, GdkEventExpose *event);
-
+static void transport_widget_class_init (TransportWidgetClass *klass);
+static void transport_widget_init       (TransportWidget *self);
+static void transport_widget_dispose    (GObject *object);
+static void transport_widget_finalize   (GObject *object);
+G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM);
+
+/* essentials */
+static void transport_widget_set_twin_item ( TransportWidget* self,
+                                             DbusmenuMenuitem* twin_item);
+static gboolean transport_widget_expose ( GtkWidget *button, GdkEventExpose *event);
 static void draw (GtkWidget* button, cairo_t *cr);
 
-G_DEFINE_TYPE (PlayButton, play_button, GTK_TYPE_DRAWING_AREA);
-
-/// internal helper functions //////////////////////////////////////////////////
-
-
-static inline void
-_blurinner (guchar* pixel,
-	    gint*   zR,
-	    gint*   zG,
-	    gint*   zB,
-	    gint*   zA,
-	    gint    alpha,
-	    gint    aprec,
-	    gint    zprec)
-{
-	gint R;
-	gint G;
-	gint B;
-	guchar A;
-
-	R = *pixel;
-	G = *(pixel + 1);
-	B = *(pixel + 2);
-	A = *(pixel + 3);
-
-	*zR += (alpha * ((R << zprec) - *zR)) >> aprec;
-	*zG += (alpha * ((G << zprec) - *zG)) >> aprec;
-	*zB += (alpha * ((B << zprec) - *zB)) >> aprec;
-	*zA += (alpha * ((A << zprec) - *zA)) >> aprec;
-
-	*pixel       = *zR >> zprec;
-	*(pixel + 1) = *zG >> zprec;
-	*(pixel + 2) = *zB >> zprec;
-	*(pixel + 3) = *zA >> zprec;
-}
-
-static inline void
-_blurrow (guchar* pixels,
-	  gint    width,
-	  gint    height,
-	  gint    channels,
-	  gint    line,
-	  gint    alpha,
-	  gint    aprec,
-	  gint    zprec)
-{
-	gint    zR;
-	gint    zG;
-	gint    zB;
-	gint    zA;
-	gint    index;
-	guchar* scanline;
-
-	scanline = &(pixels[line * width * channels]);
-
-	zR = *scanline << zprec;
-	zG = *(scanline + 1) << zprec;
-	zB = *(scanline + 2) << zprec;
-	zA = *(scanline + 3) << zprec;
-
-	for (index = 0; index < width; index ++)
-		_blurinner (&scanline[index * channels],
-			    &zR,
-			    &zG,
-			    &zB,
-			    &zA,
-			    alpha,
-			    aprec,
-			    zprec);
-
-	for (index = width - 2; index >= 0; index--)
-		_blurinner (&scanline[index * channels],
-			    &zR,
-			    &zG,
-			    &zB,
-			    &zA,
-			    alpha,
-			    aprec,
-			    zprec);
-}
-
-static inline void
-_blurcol (guchar* pixels,
-	  gint    width,
-	  gint    height,
-	  gint    channels,
-	  gint    x,
-	  gint    alpha,
-	  gint    aprec,
-	  gint    zprec)
-{
-	gint zR;
-	gint zG;
-	gint zB;
-	gint zA;
-	gint index;
-	guchar* ptr;
-
-	ptr = pixels;
-
-	ptr += x * channels;
-
-	zR = *((guchar*) ptr    ) << zprec;
-	zG = *((guchar*) ptr + 1) << zprec;
-	zB = *((guchar*) ptr + 2) << zprec;
-	zA = *((guchar*) ptr + 3) << zprec;
-
-	for (index = width; index < (height - 1) * width; index += width)
-		_blurinner ((guchar*) &ptr[index * channels],
-			    &zR,
-			    &zG,
-			    &zB,
-			    &zA,
-			    alpha,
-			    aprec,
-			    zprec);
-
-	for (index = (height - 2) * width; index >= 0; index -= width)
-		_blurinner ((guchar*) &ptr[index * channels],
-			    &zR,
-			    &zG,
-			    &zB,
-			    &zA,
-			    alpha,
-			    aprec,
-			    zprec);
-}
-
-void
-_expblur (guchar* pixels,
-	  gint    width,
-	  gint    height,
-	  gint    channels,
-	  gint    radius,
-	  gint    aprec,
-	  gint    zprec)
-{
-	gint alpha;
-	gint row = 0;
-	gint col = 0;
-
-	if (radius < 1)
-		return;
-
-	// calculate the alpha such that 90% of 
-	// the kernel is within the radius.
-	// (Kernel extends to infinity)
-	alpha = (gint) ((1 << aprec) * (1.0f - expf (-2.3f / (radius + 1.f))));
-
-	for (; row < height; row++)
-		_blurrow (pixels,
-			  width,
-			  height,
-			  channels,
-			  row,
-			  alpha,
-			  aprec,
-			  zprec);
-
-	for(; col < width; col++)
-		_blurcol (pixels,
-			  width,
-			  height,
-			  channels,
-			  col,
-			  alpha,
-			  aprec,
-			  zprec);
-
-	return;
-}
-
-void
-_surface_blur (cairo_surface_t* surface,
-               guint            radius)
-{
-	guchar*        pixels;
-	guint          width;
-	guint          height;
-	cairo_format_t format;
-
-	// before we mess with the surface execute any pending drawing
-	cairo_surface_flush (surface);
-
-	pixels = cairo_image_surface_get_data (surface);
-	width  = cairo_image_surface_get_width (surface);
-	height = cairo_image_surface_get_height (surface);
-	format = cairo_image_surface_get_format (surface);
-
-	switch (format)
-	{
-		case CAIRO_FORMAT_ARGB32:
-			_expblur (pixels, width, height, 4, radius, 16, 7);
-		break;
-
-		case CAIRO_FORMAT_RGB24:
-			_expblur (pixels, width, height, 3, radius, 16, 7);
-		break;
-
-		case CAIRO_FORMAT_A8:
-			_expblur (pixels, width, height, 1, radius, 16, 7);
-		break;
-
-		default :
-			// do nothing
-		break;
-	}
-
-	// inform cairo we altered the surfaces contents
-	cairo_surface_mark_dirty (surface);	
-}
-
-/// GObject functions //////////////////////////////////////////////////////////
+/* UI and dbusmenu callbacks */
+static gboolean transport_widget_button_press_event 	(GtkWidget      *menuitem,
+                                                  		GdkEventButton  *event);
+static gboolean transport_widget_button_release_event   (GtkWidget      *menuitem,
+                                                    	GdkEventButton  *event);                                          
+static void transport_widget_property_update ( DbusmenuMenuitem* item,
+                                       	       gchar * property, 
+                                       		   GValue * value,
+                                       		   gpointer userdata );
+static void transport_widget_menu_hidden ( GtkWidget        *menu,
+                                           TransportWidget *transport);
+static void transport_widget_notify ( TransportWidget *item,
+                                      GParamSpec       *pspec,
+                                      gpointer          user_data );
+
+static TransportWidgetEvent transport_widget_determine_button_event ( TransportWidget* button,
+                                                                      GdkEventButton* event);
+static void transport_widget_react_to_button_release ( TransportWidget* button,
+                                                       TransportWidgetEvent command);
+static void transport_widget_toggle_play_pause ( TransportWidget* button,
+                                                 TransportWidgetState update);
+
+/// Init functions //////////////////////////////////////////////////////////
 
 static void
-play_button_class_init (PlayButtonClass *klass)
+transport_widget_class_init (TransportWidgetClass *klass)
 {	
 	GObjectClass	*gobject_class = G_OBJECT_CLASS (klass);
  	GtkWidgetClass* widget_class = GTK_WIDGET_CLASS (klass);
 
-	g_type_class_add_private (klass, sizeof (PlayButtonPrivate));
-
- 	widget_class->expose_event = play_button_expose;
-
-	gobject_class->dispose = play_button_dispose;
-	gobject_class->finalize = play_button_finalize;
+	g_type_class_add_private (klass, sizeof (TransportWidgetPrivate));
+
+    widget_class->button_press_event = transport_widget_button_press_event;
+    widget_class->button_release_event = transport_widget_button_release_event;	
+ 	widget_class->expose_event = transport_widget_expose;
+  
+	gobject_class->dispose = transport_widget_dispose;
+    gobject_class->finalize = transport_widget_finalize;
 }
 
 static void
-play_button_init (PlayButton *self)
+transport_widget_init (TransportWidget *self)
 {
-	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(self);	
+	TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self);	
 	priv->current_command	= TRANSPORT_NADA;
 	priv->current_state = PAUSE;
 	priv->command_coordinates =  g_hash_table_new_full(g_direct_hash,
@@ -345,8 +158,7 @@
 	previous_list = g_list_insert(previous_list, GINT_TO_POINTER(5), 1);
 	previous_list = g_list_insert(previous_list, GINT_TO_POINTER(60), 2);
 	previous_list = g_list_insert(previous_list, GINT_TO_POINTER(34), 3);
-	
-  g_hash_table_insert(priv->command_coordinates,
+    g_hash_table_insert(priv->command_coordinates,
                       GINT_TO_POINTER(TRANSPORT_PREVIOUS),
                       previous_list);
                      
@@ -370,46 +182,131 @@
                       GINT_TO_POINTER(TRANSPORT_NEXT),
                       next_list);
 	
-	gtk_widget_set_size_request(GTK_WIDGET(self), 200, 50); 
-  
-}
-
-static void
-play_button_dispose (GObject *object)
-{
-	G_OBJECT_CLASS (play_button_parent_class)->dispose (object);
-}
-
-static void
-play_button_finalize (GObject *object)
-{
-	G_OBJECT_CLASS (play_button_parent_class)->finalize (object);
+	gtk_widget_set_size_request(GTK_WIDGET(self), 200, 50);
+    g_signal_connect (G_OBJECT(self),
+                    "notify",
+                    G_CALLBACK (transport_widget_notify),
+                    NULL);    
+}
+
+static void
+transport_widget_dispose (GObject *object)
+{
+	G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object);
+}
+
+static void
+transport_widget_finalize (GObject *object)
+{
+	G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object);
 }
 
 static gboolean
-play_button_expose (GtkWidget *button, GdkEventExpose *event)
+transport_widget_expose (GtkWidget *button, GdkEventExpose *event)
 {
 	cairo_t *cr;
 	cr = gdk_cairo_create (button->window);
 
+    //g_debug("In the playbutton's expose method, x = %i, y=%i and width: %i and height: %i'");
 	cairo_rectangle (cr,
-                   event->area.x, event->area.y,
-                   event->area.width, event->area.height);
+                     event->area.x, event->area.y,
+                     event->area.width, event->area.height);
 
 	cairo_clip(cr);
-  
 	draw (button, cr);
+
 	cairo_destroy (cr);
 	return FALSE;
 }
 
-
-PlayButtonEvent
-determine_button_event(GtkWidget* button, GdkEventButton* event)
-{
-	g_debug("event x coordinate = %f", event->x);
-	g_debug("event y coordinate = %f", event->y);
-	PlayButtonEvent button_event = TRANSPORT_NADA;
+static void
+transport_widget_toggle_play_pause(TransportWidget* button,
+                                   TransportWidgetState update)
+{
+	TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button);
+	priv->current_state = update;
+	//g_debug("TransportWidget::toggle play state : %i", priv->current_state); 
+	gtk_widget_queue_draw (GTK_WIDGET(button));
+}
+
+static void
+transport_widget_notify (TransportWidget *item,
+                         GParamSpec       *pspec,
+                         gpointer          user_data)
+{
+    if (g_strcmp0 (pspec->name, "parent")){
+        GtkWidget *parent = gtk_widget_get_parent (GTK_WIDGET (item));
+        if (parent){
+            g_signal_connect ( parent, "hide",
+                               G_CALLBACK (transport_widget_menu_hidden),
+                               item);
+        }
+    }
+}
+
+static void
+transport_widget_menu_hidden ( GtkWidget        *menu,
+                               TransportWidget *transport)
+{
+    //g_debug("Transport Widget's menu hidden method called");
+	g_return_if_fail(IS_TRANSPORT_WIDGET(transport));
+	transport_widget_react_to_button_release(transport, TRANSPORT_NADA); 
+}
+
+/* keyevents */
+static gboolean
+transport_widget_button_press_event (GtkWidget *menuitem, 
+                                  	GdkEventButton *event)
+{
+	g_return_val_if_fail ( IS_TRANSPORT_WIDGET(menuitem), FALSE );
+	TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE ( TRANSPORT_WIDGET(menuitem) );
+
+  	TransportWidgetEvent result = transport_widget_determine_button_event ( TRANSPORT_WIDGET(menuitem),
+                                                                            event);
+	if(result != TRANSPORT_NADA){
+        priv->current_command = result;
+	    cairo_t *cr;
+	    cr = gdk_cairo_create (menuitem->window);
+	    draw ( menuitem, cr );
+	    cairo_destroy ( cr );
+    }
+	return TRUE;
+}
+                              
+static gboolean
+transport_widget_button_release_event (GtkWidget *menuitem, 
+                                       GdkEventButton *event)
+{
+    //g_debug("TransportWidget::menu_release_event");
+    g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE);
+    TransportWidget* transport = TRANSPORT_WIDGET(menuitem);
+    TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE ( transport );	
+
+    TransportWidgetEvent result = transport_widget_determine_button_event ( transport,
+                                                                            event );
+    if(result != TRANSPORT_NADA){
+        GValue value = {0};
+        g_value_init(&value, G_TYPE_INT);
+        //g_debug("TransportWidget::menu_press_event - going to send value %i", (int)result);
+        g_value_set_int(&value, (int)result);	
+        dbusmenu_menuitem_handle_event ( priv->twin_item,
+                                         "Transport state change",
+                                         &value,
+                                         0 );
+    }
+  
+    transport_widget_react_to_button_release ( transport,
+                                               result );
+    return TRUE;
+}
+
+static TransportWidgetEvent
+transport_widget_determine_button_event( TransportWidget* button,
+                                         GdkEventButton* event )
+{
+	//g_debug("event x coordinate = %f", event->x);
+	//g_debug("event y coordinate = %f", event->y);
+	TransportWidgetEvent button_event = TRANSPORT_NADA;
 	// For now very simple rectangular collision detection
 	if(event->x > 67 && event->x < 112
 	   && event->y > 12 && event->y < 40){
@@ -423,87 +320,33 @@
 	   && event->y > 12 && event->y < 40){
 		button_event = TRANSPORT_NEXT;
 	}	
-	return button_event;
-  
-}
-
-void 
-play_button_react_to_button_press(GtkWidget* button, PlayButtonEvent command)
-{
-	g_return_if_fail(IS_PLAY_BUTTON(button));
-	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button);
-	priv->current_command = command;
-		
-	cairo_t *cr;
-	cr = gdk_cairo_create (button->window);
-
-	GList* list = g_hash_table_lookup(priv->command_coordinates,
-	                                  GINT_TO_POINTER(priv->current_command));
-	cairo_rectangle(cr,
-	                GPOINTER_TO_INT(g_list_nth_data(list, 0)),
-	                GPOINTER_TO_INT(g_list_nth_data(list, 1)),
-									GPOINTER_TO_INT(g_list_nth_data(list, 2)),	               	
-									GPOINTER_TO_INT(g_list_nth_data(list, 3)));
-	cairo_clip(cr);
-	draw (button, cr);
-	cairo_destroy (cr);
-}
-
-
-void 
-play_button_react_to_button_release(GtkWidget* button, PlayButtonEvent command)
-{
-	g_return_if_fail(IS_PLAY_BUTTON(button));
-	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button);	
+	return button_event;  
+}
+
+
+static void 
+transport_widget_react_to_button_release ( TransportWidget* button,
+                                           TransportWidgetEvent command )
+{
+	g_return_if_fail(IS_TRANSPORT_WIDGET(button));
+	TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button);	
 	if(priv->current_command == TRANSPORT_NADA){
-		g_debug("returning from the playbutton release because my previous command was nada");
+		//g_debug("returning from the playbutton release because my previous command was nada");
 		return;
 	}
 	else if(priv->current_command != TRANSPORT_NADA &&
 	        command != TRANSPORT_NADA){						
 		priv->current_command = command;
 	}
-
-	cairo_t *cr;
-	
-	cr = gdk_cairo_create (button->window);
-	GList* list = g_hash_table_lookup(priv->command_coordinates,
-	                                  GINT_TO_POINTER(priv->current_command));
-
+	cairo_t *cr;	
+	cr = gdk_cairo_create ( GTK_WIDGET(button)->window );
 	priv->current_command = TRANSPORT_NADA;
-	
-	cairo_rectangle(cr,
-	                GPOINTER_TO_INT(g_list_nth_data(list, 0)),
-	                GPOINTER_TO_INT(g_list_nth_data(list, 1)),
-									GPOINTER_TO_INT(g_list_nth_data(list, 2)),	               	
-									GPOINTER_TO_INT(g_list_nth_data(list, 3)));
 
-	cairo_clip(cr);
-	draw (button, cr);
+	draw ( GTK_WIDGET(button), cr );
 	cairo_destroy (cr);
-	
 }    
 
-void
-play_button_toggle_play_pause(GtkWidget* button, PlayButtonState update)
-{
-	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button);
-	priv->current_state = update;
-	g_debug("PlayButton::toggle play state : %i", priv->current_state); 
-	gtk_widget_queue_draw (GTK_WIDGET(button));
-}
-
-
-void
-play_button_set_style(GtkWidget* button, GtkStyle* style)
-{
-	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button);
-	priv->background_colour_fg = style->fg[GTK_STATE_NORMAL];
-	priv->background_colour_bg_dark = style->bg[GTK_STATE_NORMAL];
-	priv->background_colour_bg_light = style->base[GTK_STATE_NORMAL];
-	priv->foreground_colour_fg = style->fg[GTK_STATE_PRELIGHT];
-	priv->foreground_colour_bg = style->bg[GTK_STATE_NORMAL];
-}
+/// internal helper functions //////////////////////////////////////////////////
 
 static void
 draw_gradient (cairo_t* cr,
@@ -940,18 +783,230 @@
 	b->b = blue;
 }
 
+static inline void
+_blurinner (guchar* pixel,
+	    gint*   zR,
+	    gint*   zG,
+	    gint*   zB,
+	    gint*   zA,
+	    gint    alpha,
+	    gint    aprec,
+	    gint    zprec)
+{
+	gint R;
+	gint G;
+	gint B;
+	guchar A;
+
+	R = *pixel;
+	G = *(pixel + 1);
+	B = *(pixel + 2);
+	A = *(pixel + 3);
+
+	*zR += (alpha * ((R << zprec) - *zR)) >> aprec;
+	*zG += (alpha * ((G << zprec) - *zG)) >> aprec;
+	*zB += (alpha * ((B << zprec) - *zB)) >> aprec;
+	*zA += (alpha * ((A << zprec) - *zA)) >> aprec;
+
+	*pixel       = *zR >> zprec;
+	*(pixel + 1) = *zG >> zprec;
+	*(pixel + 2) = *zB >> zprec;
+	*(pixel + 3) = *zA >> zprec;
+}
+
+static inline void
+_blurrow (guchar* pixels,
+	  gint    width,
+	  gint    height,
+	  gint    channels,
+	  gint    line,
+	  gint    alpha,
+	  gint    aprec,
+	  gint    zprec)
+{
+	gint    zR;
+	gint    zG;
+	gint    zB;
+	gint    zA;
+	gint    index;
+	guchar* scanline;
+
+	scanline = &(pixels[line * width * channels]);
+
+	zR = *scanline << zprec;
+	zG = *(scanline + 1) << zprec;
+	zB = *(scanline + 2) << zprec;
+	zA = *(scanline + 3) << zprec;
+
+	for (index = 0; index < width; index ++)
+		_blurinner (&scanline[index * channels],
+			    &zR,
+			    &zG,
+			    &zB,
+			    &zA,
+			    alpha,
+			    aprec,
+			    zprec);
+
+	for (index = width - 2; index >= 0; index--)
+		_blurinner (&scanline[index * channels],
+			    &zR,
+			    &zG,
+			    &zB,
+			    &zA,
+			    alpha,
+			    aprec,
+			    zprec);
+}
+
+static inline void
+_blurcol (guchar* pixels,
+	  gint    width,
+	  gint    height,
+	  gint    channels,
+	  gint    x,
+	  gint    alpha,
+	  gint    aprec,
+	  gint    zprec)
+{
+	gint zR;
+	gint zG;
+	gint zB;
+	gint zA;
+	gint index;
+	guchar* ptr;
+
+	ptr = pixels;
+
+	ptr += x * channels;
+
+	zR = *((guchar*) ptr    ) << zprec;
+	zG = *((guchar*) ptr + 1) << zprec;
+	zB = *((guchar*) ptr + 2) << zprec;
+	zA = *((guchar*) ptr + 3) << zprec;
+
+	for (index = width; index < (height - 1) * width; index += width)
+		_blurinner ((guchar*) &ptr[index * channels],
+			    &zR,
+			    &zG,
+			    &zB,
+			    &zA,
+			    alpha,
+			    aprec,
+			    zprec);
+
+	for (index = (height - 2) * width; index >= 0; index -= width)
+		_blurinner ((guchar*) &ptr[index * channels],
+			    &zR,
+			    &zG,
+			    &zB,
+			    &zA,
+			    alpha,
+			    aprec,
+			    zprec);
+}
+
+void
+_expblur (guchar* pixels,
+	  gint    width,
+	  gint    height,
+	  gint    channels,
+	  gint    radius,
+	  gint    aprec,
+	  gint    zprec)
+{
+	gint alpha;
+	gint row = 0;
+	gint col = 0;
+
+	if (radius < 1)
+		return;
+
+	// calculate the alpha such that 90% of 
+	// the kernel is within the radius.
+	// (Kernel extends to infinity)
+	alpha = (gint) ((1 << aprec) * (1.0f - expf (-2.3f / (radius + 1.f))));
+
+	for (; row < height; row++)
+		_blurrow (pixels,
+			  width,
+			  height,
+			  channels,
+			  row,
+			  alpha,
+			  aprec,
+			  zprec);
+
+	for(; col < width; col++)
+		_blurcol (pixels,
+			  width,
+			  height,
+			  channels,
+			  col,
+			  alpha,
+			  aprec,
+			  zprec);
+
+	return;
+}
+
+void
+_surface_blur (cairo_surface_t* surface,
+               guint            radius)
+{
+	guchar*        pixels;
+	guint          width;
+	guint          height;
+	cairo_format_t format;
+
+	// before we mess with the surface execute any pending drawing
+	cairo_surface_flush (surface);
+
+	pixels = cairo_image_surface_get_data (surface);
+	width  = cairo_image_surface_get_width (surface);
+	height = cairo_image_surface_get_height (surface);
+	format = cairo_image_surface_get_format (surface);
+
+	switch (format)
+	{
+		case CAIRO_FORMAT_ARGB32:
+			_expblur (pixels, width, height, 4, radius, 16, 7);
+		break;
+
+		case CAIRO_FORMAT_RGB24:
+			_expblur (pixels, width, height, 3, radius, 16, 7);
+		break;
+
+		case CAIRO_FORMAT_A8:
+			_expblur (pixels, width, height, 1, radius, 16, 7);
+		break;
+
+		default :
+			// do nothing
+		break;
+	}
+
+	// inform cairo we altered the surfaces contents
+	cairo_surface_mark_dirty (surface);	
+}
+
 static void
 draw (GtkWidget* button, cairo_t *cr)
 {
-	g_return_if_fail(IS_PLAY_BUTTON(button));
-	PlayButtonPrivate* priv = PLAY_BUTTON_GET_PRIVATE(button);	
+	g_return_if_fail(IS_TRANSPORT_WIDGET(button));
+	TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(button);	
 
 	cairo_surface_t*  surf = NULL;
 	cairo_t*       cr_surf = NULL;
 
-  GtkStyle *style;
-
-  CairoColorRGB bg_normal, fg_normal;
+	cairo_translate (cr, button->allocation.x, button->allocation.y);
+	
+	//g_debug("button x allocation = %i", button->allocation.x);
+	//g_debug("button y allocation = %i", button->allocation.y);
+
+	GtkStyle *style;
+
+	CairoColorRGB bg_normal, fg_normal;
 	CairoColorRGB color_inner[2], color_middle[2], color_outer[2], color_button[3], color_inner_compressed[2];
 
 	style = gtk_widget_get_style (button);
@@ -960,13 +1015,13 @@
 	bg_normal.g = style->bg[0].green/65535.0;
 	bg_normal.b = style->bg[0].blue/65535.0;
 
-  fg_normal.r = style->fg[0].red/65535.0;
+	fg_normal.r = style->fg[0].red/65535.0;
 	fg_normal.g = style->fg[0].green/65535.0;
 	fg_normal.b = style->fg[0].blue/65535.0;
 
 	_color_shade (&bg_normal, INNER_START_SHADE, &color_inner[0]);
 	_color_shade (&bg_normal, INNER_END_SHADE, &color_inner[1]);
-  _color_shade (&bg_normal, MIDDLE_START_SHADE, &color_middle[0]);
+	_color_shade (&bg_normal, MIDDLE_START_SHADE, &color_middle[0]);
 	_color_shade (&bg_normal, MIDDLE_END_SHADE, &color_middle[1]);
 	_color_shade (&bg_normal, OUTER_START_SHADE, &color_outer[0]);
 	_color_shade (&bg_normal, OUTER_END_SHADE, &color_outer[1]);
@@ -987,20 +1042,20 @@
 	double INNER_COMPRESSED_START[] = {color_inner_compressed[0].r, color_inner_compressed[0].g, color_inner_compressed[0].b, 1.0f};  
  
 	// prev/next-background
-  draw_gradient (cr,
-                 X,
-                 Y,
-                 RECT_WIDTH,
-                 OUTER_RADIUS,
-                 OUTER_START,
-                 OUTER_END);
-  draw_gradient (cr,
-                 X,
-                 Y + 1,
-                 RECT_WIDTH - 2,
-                 MIDDLE_RADIUS,
-                 MIDDLE_START,
-                 MIDDLE_END);
+	draw_gradient (cr,
+		 X,
+		 Y,
+		 RECT_WIDTH,
+		 OUTER_RADIUS,
+		 OUTER_START,
+		 OUTER_END);
+	draw_gradient (cr,
+		 X,
+		 Y + 1,
+		 RECT_WIDTH - 2,
+		 MIDDLE_RADIUS,
+		 MIDDLE_START,
+		 MIDDLE_END);
 	draw_gradient (cr,
                X,
                Y + 2,
@@ -1029,26 +1084,26 @@
 	}
 
 	// play/pause-background
-  draw_circle (cr,
-							 X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f,
-							 Y - ((CIRCLE_RADIUS - OUTER_RADIUS)),
-							 CIRCLE_RADIUS,
-							 OUTER_START,
-							 OUTER_END);
-  draw_circle (cr,
-               X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 0.5f,
-               Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 0.5f,
-               CIRCLE_RADIUS - 0.75f,
-               MIDDLE_START,
-               MIDDLE_END);
+	draw_circle (cr,
+			X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f,
+			Y - ((CIRCLE_RADIUS - OUTER_RADIUS)),
+			CIRCLE_RADIUS,
+			OUTER_START,
+			OUTER_END);
+	draw_circle (cr,
+	               X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 0.5f,
+	               Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 0.5f,
+	               CIRCLE_RADIUS - 0.75f,
+	               MIDDLE_START,
+	               MIDDLE_END);
 
 	if(priv->current_command == TRANSPORT_PLAY_PAUSE){
-    draw_circle (cr,
-                 X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 1.5f,
-                 Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 1.5f,
-                 CIRCLE_RADIUS - 1.5f,
-             		 INNER_COMPRESSED_START,
-                 INNER_COMPRESSED_END);
+	    draw_circle (cr,
+			 X + RECT_WIDTH / 2.0f - 2.0f * OUTER_RADIUS - 5.5f + 1.5f,
+			 Y - ((CIRCLE_RADIUS - OUTER_RADIUS)) + 1.5f,
+			 CIRCLE_RADIUS - 1.5f,
+		     		 INNER_COMPRESSED_START,
+			 INNER_COMPRESSED_END);
 	}
 	else{        
 		draw_circle (cr,
@@ -1207,18 +1262,50 @@
 			     FALSE);
 		_finalize (cr, &cr_surf, &surf, PAUSE_X-0.5f, PAUSE_Y);
 	}
-	
-}
-
-/**
-* play_button_new:
-* @returns: a new #PlayButton.
+}
+
+static void transport_widget_set_twin_item(TransportWidget* self,
+           								 DbusmenuMenuitem* twin_item)
+{
+    TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self);
+    priv->twin_item = twin_item;
+    g_signal_connect(G_OBJECT(priv->twin_item), "property-changed", 
+                              G_CALLBACK(transport_widget_property_update), self);
+}
+
+/**
+* transport_widget_update_state()
+* Callback for updates from the other side of dbus
+**/
+static void 
+transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, 
+                                 GValue* value, gpointer userdata)
+{
+	//g_debug("transport_widget_update_state - with property  %s", property);
+	TransportWidget* bar = (TransportWidget*)userdata;
+	g_return_if_fail(IS_TRANSPORT_WIDGET(bar));
+
+	if(g_ascii_strcasecmp(DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE, property) == 0)
+	{
+		int update_value = g_value_get_int(value);
+		//g_debug("transport_widget_update_state - with value  %i", update_value);  
+		transport_widget_toggle_play_pause(bar,
+                                           (TransportWidgetState)update_value);		
+	}
+}
+
+
+
+/**
+* transport_widget_new:
+* @returns: a new #TransportWidget.
 **/
 GtkWidget* 
-play_button_new()
+transport_widget_new ( DbusmenuMenuitem *item )
 {	
-	GtkWidget* widget =	g_object_new(PLAY_BUTTON_TYPE, NULL);
+	GtkWidget* widget =	g_object_new(TRANSPORT_WIDGET_TYPE, NULL);
 	gtk_widget_set_app_paintable (widget, TRUE);	
+	transport_widget_set_twin_item((TransportWidget*)widget, item);  
 	return widget;
 }
 

=== removed file 'src/transport-widget.c'
--- src/transport-widget.c	2010-09-15 18:16:32 +0000
+++ src/transport-widget.c	1970-01-01 00:00:00 +0000
@@ -1,245 +0,0 @@
-/*
-Copyright 2010 Canonical Ltd.
-
-Authors:
-    Conor Curran <conor.curran@xxxxxxxxxxxxx>
-
-This program is free software: you can redistribute it and/or modify it 
-under the terms of the GNU General Public License version 3, as published 
-by the Free Software Foundation.
-
-This program is distributed in the hope that it will be useful, but 
-WITHOUT ANY WARRANTY; without even the implied warranties of 
-MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR 
-PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along 
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib/gi18n.h>
-#include "transport-widget.h"
-#include "common-defs.h"
-#include <gtk/gtk.h>
-#include "play-button.h"
-
-typedef struct _TransportWidgetPrivate TransportWidgetPrivate;
-
-struct _TransportWidgetPrivate
-{
-	GtkWidget* hbox;
-	GtkWidget* play_button;
-	DbusmenuMenuitem* twin_item;		
-};
-
-#define TRANSPORT_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TRANSPORT_WIDGET_TYPE, TransportWidgetPrivate))
-
-/* Gobject boiler plate */
-static void transport_widget_class_init (TransportWidgetClass *klass);
-static void transport_widget_init       (TransportWidget *self);
-static void transport_widget_dispose    (GObject *object);
-static void transport_widget_finalize   (GObject *object);
-
-static void transport_widget_set_twin_item(TransportWidget* self,
-                           								 DbusmenuMenuitem* twin_item);
-static gboolean transport_widget_expose_event(GtkWidget* widget,
-                                              GdkEventExpose* event);
-
-/* UI and dbusmenu callbacks */
-static gboolean transport_widget_button_press_event 	(GtkWidget      *menuitem,
-                                                  		GdkEventButton  *event);
-static gboolean transport_widget_button_release_event (GtkWidget      *menuitem,
-                                                    	GdkEventButton  *event);                                          
-static void transport_widget_property_update( DbusmenuMenuitem* item,
-                                       				gchar * property, 
-                                       				GValue * value,
-                                       				gpointer userdata );
-static void transport_widget_menu_hidden ( GtkWidget        *menu,
-                                           TransportWidget *transport);
-static void transport_widget_notify ( TransportWidget *item,
-                                      GParamSpec       *pspec,
-                                      gpointer          user_data );
-
-
-G_DEFINE_TYPE (TransportWidget, transport_widget, GTK_TYPE_MENU_ITEM);
-
-static void
-transport_widget_class_init (TransportWidgetClass *klass)
-{
-	GObjectClass 			*gobject_class = G_OBJECT_CLASS (klass);
-  GtkWidgetClass    *widget_class = GTK_WIDGET_CLASS (klass);
-	GtkMenuItemClass *menu_item_class =  GTK_MENU_ITEM_CLASS(klass);
-
-	menu_item_class->hide_on_activate = FALSE;
-  widget_class->button_press_event = transport_widget_button_press_event;
-  widget_class->button_release_event = transport_widget_button_release_event;	
-	widget_class->expose_event = transport_widget_expose_event;
-	g_type_class_add_private (klass, sizeof (TransportWidgetPrivate));
-
-	gobject_class->dispose = transport_widget_dispose;
-	gobject_class->finalize = transport_widget_finalize;
-}
-
-static void
-transport_widget_init (TransportWidget *self)
-{
-	g_debug("TransportWidget::transport_widget_init");
-
-	TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(self);
-	GtkWidget* hbox;
-
-	hbox = gtk_hbox_new(TRUE, 2);
-
-	GtkStyle* style = gtk_rc_get_style(GTK_WIDGET(self));
-	
-	priv->hbox = hbox;
-	priv->play_button = play_button_new();
-	play_button_set_style(priv->play_button, style);
-	
-	gtk_box_pack_start (GTK_BOX (priv->hbox), priv->play_button, FALSE, FALSE, 0);	
-	                 
-	gtk_container_add (GTK_CONTAINER (self), priv->hbox);
-
-  gtk_widget_show_all (priv->hbox);
-
-  g_signal_connect (G_OBJECT(self),
-                    "notify",
-                    G_CALLBACK (transport_widget_notify),
-                    NULL);  
-}
-
-static void
-transport_widget_dispose (GObject *object)
-{
-	G_OBJECT_CLASS (transport_widget_parent_class)->dispose (object);
-}
-
-static void
-transport_widget_finalize (GObject *object)
-{
-	G_OBJECT_CLASS (transport_widget_parent_class)->finalize (object);
-}
-
-static gboolean 
-transport_widget_expose_event(GtkWidget* widget, GdkEventExpose* event)
-{
-	return TRUE;
-}
-
-static void transport_widget_set_twin_item(TransportWidget* self,
-                           								 DbusmenuMenuitem* twin_item)
-{
-	TransportWidgetPrivate* priv = TRANSPORT_WIDGET_GET_PRIVATE(self);
-	priv->twin_item = twin_item;
-	g_signal_connect(G_OBJECT(priv->twin_item), "property-changed", 
-	                 G_CALLBACK(transport_widget_property_update), self);
-}
-
-static void
-transport_widget_notify (TransportWidget *item,
-                         GParamSpec       *pspec,
-                         gpointer          user_data)
-{
-  
-  if (g_strcmp0 (pspec->name, "parent"))
-    {
-      GtkWidget *parent = gtk_widget_get_parent (GTK_WIDGET (item));
-
-      if (parent)
-        {
-          g_signal_connect (parent, "hide",
-                            G_CALLBACK (transport_widget_menu_hidden),
-                            item);
-        }
-    }
-}
-
-static void
-transport_widget_menu_hidden ( GtkWidget        *menu,
-                               TransportWidget *transport)
-{
-  g_debug("Transport Widget's menu hidden method called");
-	g_return_if_fail(IS_TRANSPORT_WIDGET(transport));
-	TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(transport));
-	play_button_react_to_button_release(priv->play_button, TRANSPORT_NADA);
-    
-}
-
-
-/* keyevents */
-static gboolean
-transport_widget_button_press_event (GtkWidget *menuitem, 
-                                  	GdkEventButton *event)
-{
-	g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE);
-	TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem));
-	
-	PlayButtonEvent result = determine_button_event(priv->play_button, event);
-
-	if(result != TRANSPORT_NADA){
-		play_button_react_to_button_press(priv->play_button, result);
-	}	
-	return TRUE;
-}
-
-                              
-static gboolean
-transport_widget_button_release_event (GtkWidget *menuitem, 
-                                  GdkEventButton *event)
-{
-	g_debug("TransportWidget::menu_release_event");
-	g_return_val_if_fail(IS_TRANSPORT_WIDGET(menuitem), FALSE);
-	TransportWidgetPrivate * priv = TRANSPORT_WIDGET_GET_PRIVATE(TRANSPORT_WIDGET(menuitem));	
-	
-	PlayButtonEvent result = determine_button_event(priv->play_button, event);
-
-	if(result != TRANSPORT_NADA){
-	 	GValue value = {0};
-		g_value_init(&value, G_TYPE_INT);
-		g_debug("TransportWidget::menu_press_event - going to send value %i", (int)result);
-		g_value_set_int(&value, (int)result);	
-		dbusmenu_menuitem_handle_event (priv->twin_item, "Transport state change", &value, 0);
-	}
-	play_button_react_to_button_release(priv->play_button, result);
-	
-	return TRUE;
-}
-
-/**
-* transport_widget_update_state()
-* Callback for updates from the other side of dbus
-**/
-static void 
-transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, 
-                                 GValue* value, gpointer userdata)
-{
-	g_debug("transport_widget_update_state - with property  %s", property);  
-	TransportWidget* bar = (TransportWidget*)userdata;
-	g_return_if_fail(IS_TRANSPORT_WIDGET(bar));
-
-	if(g_ascii_strcasecmp(DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE, property) == 0)
-	{
-		TransportWidgetPrivate *priv = TRANSPORT_WIDGET_GET_PRIVATE(bar);
-		int update_value = g_value_get_int(value);
-		g_debug("transport_widget_update_state - with value  %i", update_value);  
-		play_button_toggle_play_pause(priv->play_button, (PlayButtonState)update_value);
-		
-	}
-}
-
- /**
- * transport_new:
- * @returns: a new #TransportWidget.
- **/
-GtkWidget* 
-transport_widget_new(DbusmenuMenuitem *item)
-{
-	GtkWidget* widget =  g_object_new(TRANSPORT_WIDGET_TYPE, NULL);
-	transport_widget_set_twin_item((TransportWidget*)widget, item);
-	return widget;
-}
-

=== renamed file 'src/play-button.h' => 'src/transport-widget.h'
--- src/play-button.h	2010-09-06 18:30:48 +0000
+++ src/transport-widget.h	2010-09-30 15:52:39 +0000
@@ -16,51 +16,47 @@
 You should have received a copy of the GNU General Public License along 
 with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
-#ifndef __PLAY_BUTTON_H__
-#define __PLAY_BUTTON_H__
+#ifndef __TRANSPORT_WIDGET_H__
+#define __TRANSPORT_WIDGET_H__
 
 #include <gtk/gtk.h>
+#include <gtk/gtkmenuitem.h>
+#include <libdbusmenu-gtk/menuitem.h>
 
 G_BEGIN_DECLS
 
-#define PLAY_BUTTON_TYPE            (play_button_get_type ())
-#define PLAY_BUTTON(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), PLAY_BUTTON_TYPE, PlayButton))
-#define PLAY_BUTTON_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), PLAY_BUTTON_TYPE, PlayButtonClass))
-#define IS_PLAY_BUTTON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PLAY_BUTTON_TYPE))
-#define IS_PLAY_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PLAY_BUTTON_TYPE))
-#define PLAY_BUTTON_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), PLAY_BUTTON_TYPE, PlayButtonClass))
+#define TRANSPORT_WIDGET_TYPE            (transport_widget_get_type ())
+#define TRANSPORT_WIDGET(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TRANSPORT_WIDGET_TYPE, TransportWidget))
+#define TRANSPORT_WIDGET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TRANSPORT_WIDGET_TYPE, TransportWidgetClass))
+#define IS_TRANSPORT_WIDGET(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRANSPORT_WIDGET_TYPE))
+#define IS_TRANSPORT_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TRANSPORT_WIDGET_TYPE))
+#define TRANSPORT_WIDGET_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TRANSPORT_WIDGET_TYPE, TransportWidgetClass))
 
-typedef struct _PlayButton      PlayButton;
-typedef struct _PlayButtonClass PlayButtonClass;
+typedef struct _TransportWidget      TransportWidget;
+typedef struct _TransportWidgetClass TransportWidgetClass;
 
 typedef enum {
 	TRANSPORT_PREVIOUS,
 	TRANSPORT_PLAY_PAUSE,
 	TRANSPORT_NEXT,
 	TRANSPORT_NADA
-}PlayButtonEvent;
+}TransportWidgetEvent;
 
 typedef enum {
 	PLAY,
 	PAUSE	
-}PlayButtonState;
-
-struct _PlayButtonClass {
-	  GtkDrawingAreaClass parent_class;
-};
-
-struct _PlayButton {
-	  GtkDrawingArea parent;
-};
-
-GType play_button_get_type (void);
-void play_button_set_style(GtkWidget* button, GtkStyle* style);
-PlayButtonEvent determine_button_event(GtkWidget* button, GdkEventButton* event);
-void play_button_react_to_button_press(GtkWidget* button, PlayButtonEvent command);
-void play_button_react_to_button_release(GtkWidget* button,  PlayButtonEvent command);
-void play_button_toggle_play_pause(GtkWidget* button, PlayButtonState update);
-
-GtkWidget* play_button_new();
+}TransportWidgetState;
+
+struct _TransportWidgetClass {
+	  GtkMenuItemClass parent_class;
+};
+
+struct _TransportWidget {
+	  GtkMenuItem parent;
+};
+
+GType transport_widget_get_type (void);
+GtkWidget* transport_widget_new ( DbusmenuMenuitem *item );
 
 G_END_DECLS
 

=== removed file 'src/transport-widget.h'
--- src/transport-widget.h	2010-08-06 12:20:03 +0000
+++ src/transport-widget.h	1970-01-01 00:00:00 +0000
@@ -1,51 +0,0 @@
-/*
-Copyright 2010 Canonical Ltd.
-
-Authors:
-    Conor Curran <conor.curran@xxxxxxxxxxxxx>
-
-This program is free software: you can redistribute it and/or modify it 
-under the terms of the GNU General Public License version 3, as published 
-by the Free Software Foundation.
-
-This program is distributed in the hope that it will be useful, but 
-WITHOUT ANY WARRANTY; without even the implied warranties of 
-MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR 
-PURPOSE.  See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along 
-with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-#ifndef __TRANSPORT_WIDGET_H__
-#define __TRANSPORT_WIDGET_H__
-
-#include <gtk/gtkmenuitem.h>
-#include <libdbusmenu-gtk/menuitem.h>
-
-G_BEGIN_DECLS
-
-#define TRANSPORT_WIDGET_TYPE            (transport_widget_get_type ())
-#define TRANSPORT_WIDGET(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TRANSPORT_WIDGET_TYPE, TransportWidget))
-#define TRANSPORT_WIDGET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TRANSPORT_WIDGET_TYPE, TransportWidgetClass))
-#define IS_TRANSPORT_WIDGET(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TRANSPORT_WIDGET_TYPE))
-#define IS_TRANSPORT_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TRANSPORT_WIDGET_TYPE))
-#define TRANSPORT_WIDGET_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TRANSPORT_WIDGET_TYPE, TransportWidgetClass))
-
-typedef struct _TransportWidget      TransportWidget;
-typedef struct _TransportWidgetClass TransportWidgetClass;
-
-struct _TransportWidgetClass {
-	  GtkMenuItemClass parent_class;
-};
-
-struct _TransportWidget {
-	  GtkMenuItem parent;
-};
-
-GType transport_widget_get_type (void);
-GtkWidget* transport_widget_new(DbusmenuMenuitem *twin_item);
-
-G_END_DECLS
-
-#endif
-


Follow ups