[Xfce4-commits] <parole:master> Merge branch 'ochosi/audiobox' When playing back audio, several id3 tags (incl. embedded artwork) are now shown where Parole would otherwise show video or visualisations

Simon Steinbeiss noreply at xfce.org
Thu Nov 29 11:20:16 CET 2012


Updating branch refs/heads/master
         to 981aeded1b6d876f0817da2d14a7579ebf46d96d (commit)
       from 1bbaa6324b677dd8bf9908c122750283e315767a (commit)

commit 981aeded1b6d876f0817da2d14a7579ebf46d96d
Merge: 1bbaa63 1d3b327
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Thu Nov 29 11:18:09 2012 +0100

    Merge branch 'ochosi/audiobox'
    When playing back audio, several id3 tags (incl. embedded artwork) are now shown where Parole would otherwise show video or visualisations

commit 1d3b3276a02be591a54696257ea335e49e3d6bbb
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Thu Nov 29 05:06:15 2012 -0500

    Tweaked centering and ellipsizing.

commit ab966255eaa37a27ea7178d6b4b93a78c064b71d
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Thu Nov 29 10:17:29 2012 +0100

    Simplify packing of audiobox-widgets once again

commit 2bd2c9e94600c71db98f225881373d0530573783
Merge: eb54a7a 5d9f13a
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 22:11:20 2012 -0500

    Merge branch 'ochosi/audiobox' of ssh://git.xfce.org/apps/parole into ochosi/audiobox

commit eb54a7a10574f2539cebc53270dd3c79f773e9b4
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 22:11:04 2012 -0500

    Fixed fullscreen controls showing with audiobox.

commit 5d9f13a87bd7f545f026b5f6ac889c5d6c00a65f
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Thu Nov 29 02:19:49 2012 +0100

    Simplify audiobox packing by dropping alignments and boxes

commit f65378f4d6f357b758898cc73022726f0617f736
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Thu Nov 29 01:50:50 2012 +0100

    Escape audio-labels and make unknown information more "useful"

commit 5971d7a90a14156a31d86e19d1399f1bc3085ab5
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 19:13:16 2012 -0500

    Restored double-clicking on widget for fullscreen, partially restored showing controls in fullscreen.

commit 025b386dfea3400555d7aaa2881060e6aa63b006
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 18:48:00 2012 -0500

    Make audiobox easier to understand.

commit 8c20b1c36f45b528653ed5b90a8ec2dc435d951b
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 18:27:04 2012 -0500

    Only show audiobox if audio-only and visualizations are disabled.

commit e11ff431848a619df268c21c52530fb543e3157e
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 14:13:38 2012 -0500

    Audiobox black background, white text.

commit 1f038f0094329fcd96584f185968bfd10e03569d
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 13:43:44 2012 -0500

    Functional completion of the audiobox.

commit 5383ba33003b6884a18633447aa48e30f59c8ad1
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 07:06:04 2012 -0500

    Added title, album, and artist to audiobox widget.

commit ad1c5a7ba11fe8b74e018b59f1c073c82f13e66e
Author: Sean Davis <smd.seandavis at gmail.com>
Date:   Wed Nov 28 06:13:02 2012 -0500

    Enhanced audiobox widget.

commit 7ce80b05c3015620f70efcef8cee0dabfababd09
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Thu Nov 22 13:48:40 2012 +0100

    Minimal patch to show an "audiobox" with meta-information from tags when audio is playing

 configure.ac.in           |    5 ++
 data/interfaces/parole.ui |   95 +++++++++++++++++++++++++++++++++++++-
 src/gst/Makefile.am       |    1 +
 src/gst/parole-gst.c      |  112 +++++++++++++++++++++++++++++++++++++++++++++
 src/gst/parole-gst.h      |    1 +
 src/misc/parole-stream.c  |   30 ++++++++++++
 src/misc/parole-stream.h  |    5 ++
 src/parole-player.c       |   97 ++++++++++++++++++++++++++++++++++++++-
 8 files changed, 344 insertions(+), 2 deletions(-)

diff --git a/configure.ac.in b/configure.ac.in
index 50eb9d3..143b089 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -103,6 +103,11 @@ XDT_CHECK_PACKAGE([GST_VIDEO], [gstreamer-video-0.10], [gstreamer_minimum_versio
 XDT_CHECK_PACKAGE([GST_INTERFACES], [gstreamer-interfaces-0.10], [gstreamer_minimum_version])
 XDT_CHECK_PACKAGE([GST_PBUTILS], [gstreamer-pbutils-0.10], [0.10.2])
 
+GST_MAJORMINOR=0.10
+GST_REQS=0.10.30
+GSTPLUG_REQS=0.10.30
+GST_LIBS="$GST_LIBS -lgstbase-$GST_MAJORMINOR -lgstinterfaces-$GST_MAJORMINOR -lgstvideo-$GST_MAJORMINOR -lgstaudio-$GST_MAJORMINOR -lgstpbutils-$GST_MAJORMINOR -lgsttag-$GST_MAJORMINOR"
+
 XDT_CHECK_PACKAGE([DBUS], [dbus-1], [dbus_minimum_version])
 XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [dbus_glib_minimum_version])
 
diff --git a/data/interfaces/parole.ui b/data/interfaces/parole.ui
index 9327849..2127f0a 100644
--- a/data/interfaces/parole.ui
+++ b/data/interfaces/parole.ui
@@ -684,6 +684,99 @@
                                   </packing>
                                 </child>
                                 <child>
+                                  <object class="GtkEventBox" id="audiobox">
+                                    <property name="can_focus">False</property>
+                                    <property name="no_show_all">True</property>
+                                    <signal name="button-press-event" handler="parole_player_gst_widget_button_press" swapped="no"/>
+                                    <child>
+                                      <object class="GtkHBox" id="hbox2">
+                                        <property name="visible">True</property>
+                                        <property name="can_focus">False</property>
+                                        <property name="spacing">24</property>
+                                        <property name="homogeneous">True</property>
+                                        <child>
+                                          <object class="GtkImage" id="audiobox_cover">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="xalign">1</property>
+                                            <property name="pixel_size">128</property>
+                                            <property name="icon_name">audio-x-generic</property>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">0</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <object class="GtkVBox" id="vbox3">
+                                            <property name="visible">True</property>
+                                            <property name="can_focus">False</property>
+                                            <property name="spacing">6</property>
+                                            <child>
+                                              <object class="GtkLabel" id="audiobox_title">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="xalign">0</property>
+                                                <property name="yalign">1</property>
+                                                <property name="label" translatable="yes"><b><big>Song Title</big></b></property>
+                                                <property name="use_markup">True</property>
+                                                <property name="ellipsize">end</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">True</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">0</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel" id="audiobox_album">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="xalign">0</property>
+                                                <property name="label" translatable="yes"><big>on Song Album (2012)</big></property>
+                                                <property name="use_markup">True</property>
+                                                <property name="ellipsize">end</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">False</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">1</property>
+                                              </packing>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel" id="audiobox_artist">
+                                                <property name="visible">True</property>
+                                                <property name="can_focus">False</property>
+                                                <property name="xalign">0</property>
+                                                <property name="yalign">0</property>
+                                                <property name="label" translatable="yes"><big>by Song Artist</big></property>
+                                                <property name="use_markup">True</property>
+                                                <property name="ellipsize">end</property>
+                                              </object>
+                                              <packing>
+                                                <property name="expand">True</property>
+                                                <property name="fill">True</property>
+                                                <property name="position">2</property>
+                                              </packing>
+                                            </child>
+                                          </object>
+                                          <packing>
+                                            <property name="expand">True</property>
+                                            <property name="fill">True</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
+                                      </object>
+                                    </child>
+                                  </object>
+                                  <packing>
+                                    <property name="expand">True</property>
+                                    <property name="fill">True</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                                <child>
                                   <object class="GtkVBox" id="control">
                                     <property name="visible">True</property>
                                     <property name="can_focus">False</property>
@@ -938,7 +1031,7 @@ audio-volume-medium</property>
                                   <packing>
                                     <property name="expand">False</property>
                                     <property name="fill">True</property>
-                                    <property name="position">2</property>
+                                    <property name="position">3</property>
                                   </packing>
                                 </child>
                               </object>
diff --git a/src/gst/Makefile.am b/src/gst/Makefile.am
index 5f2de02..62771b7 100644
--- a/src/gst/Makefile.am
+++ b/src/gst/Makefile.am
@@ -31,6 +31,7 @@ libparolegst_la_CFLAGS =		\
 libparolegst_la_LIBADD =		\
 	$(top_builddir)/src/misc/libparole.la\
 	$(top_builddir)/src/common/libparolecommon.la\
+	$(GST_LIBS)		\
 	$(GST_PBUTILS_LIBS)
 
 parole_glib_enum_headers =		\
diff --git a/src/gst/parole-gst.c b/src/gst/parole-gst.c
index f023609..b74c6a1 100644
--- a/src/gst/parole-gst.c
+++ b/src/gst/parole-gst.c
@@ -34,6 +34,7 @@
 #include <gst/pbutils/install-plugins.h>
 
 #include <gst/video/video.h>
+#include <gst/tag/tag.h>
 
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
@@ -65,6 +66,8 @@ static void	parole_gst_terminate_internal   (ParoleGst *gst,
 						 
 static void     parole_gst_seek_cdda_track	(ParoleGst *gst,
 						 gint track);
+						 
+static GdkPixbuf * parole_gst_tag_list_get_cover (GstTagList *tag_list);
 
 typedef enum 
 {
@@ -999,6 +1002,94 @@ out:
     ;
 }
 
+static GdkPixbuf *
+parole_gst_buffer_to_pixbuf (GstBuffer *buffer)
+{
+  GdkPixbufLoader *loader;
+  GdkPixbuf *pixbuf = NULL;
+  GError *err = NULL;
+
+  loader = gdk_pixbuf_loader_new ();
+
+  if (gdk_pixbuf_loader_write (loader, buffer->data, buffer->size, &err) &&
+      gdk_pixbuf_loader_close (loader, &err)) {
+    pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+    if (pixbuf)
+      g_object_ref (pixbuf);
+  } else {
+    GST_WARNING("could not convert tag image to pixbuf: %s", err->message);
+    g_error_free (err);
+  }
+
+  g_object_unref (loader);
+  return pixbuf;
+}
+
+static const GValue *
+parole_gst_tag_list_get_cover_real (GstTagList *tag_list)
+{
+  const GValue *cover_value = NULL;
+  guint i;
+
+  for (i = 0; ; i++) {
+    const GValue *value;
+    GstBuffer *buffer;
+    GstStructure *caps_struct;
+    int type;
+
+    value = gst_tag_list_get_value_index (tag_list,
+					  GST_TAG_IMAGE,
+					  i);
+    if (value == NULL)
+      break;
+
+    buffer = gst_value_get_buffer (value);
+
+    caps_struct = gst_caps_get_structure (buffer->caps, 0);
+    
+    gst_structure_get_enum (caps_struct,
+			    "image-type",
+			    GST_TYPE_TAG_IMAGE_TYPE,
+			    &type);
+    if (type == GST_TAG_IMAGE_TYPE_UNDEFINED) {
+      if (cover_value == NULL)
+        cover_value = value;
+    } else if (type == GST_TAG_IMAGE_TYPE_FRONT_COVER) {
+      cover_value = value;
+      break;
+    }
+  }
+
+  return cover_value;
+}
+
+GdkPixbuf *
+parole_gst_tag_list_get_cover (GstTagList *tag_list)
+{
+  const GValue *cover_value;
+
+  g_return_val_if_fail (tag_list != NULL, FALSE);
+
+  cover_value = parole_gst_tag_list_get_cover_real (tag_list);
+  /* Fallback to preview */
+  if (!cover_value) {
+    cover_value = gst_tag_list_get_value_index (tag_list,
+						GST_TAG_PREVIEW_IMAGE,
+						0);
+  }
+
+  if (cover_value) {
+    GstBuffer *buffer;
+    GdkPixbuf *pixbuf;
+
+    buffer = gst_value_get_buffer (cover_value);
+    pixbuf = parole_gst_buffer_to_pixbuf (buffer);
+    return pixbuf;
+  }
+
+  return NULL;
+}
+
 static void
 parole_gst_get_meta_data_cdda (ParoleGst *gst, GstTagList *tag)
 {
@@ -1022,6 +1113,7 @@ parole_gst_get_meta_data_local_file (ParoleGst *gst, GstTagList *tag)
 {
     gchar *str;
     GDate *date;
+    GdkPixbuf *pixbuf;
     
     if ( gst_tag_list_get_string_index (tag, GST_TAG_TITLE, 0, &str) )
     {
@@ -1071,6 +1163,13 @@ parole_gst_get_meta_data_local_file (ParoleGst *gst, GstTagList *tag)
 		      NULL);
 	g_free (str);
     }
+    
+    pixbuf = parole_gst_tag_list_get_cover (tag);
+    if (pixbuf)
+    {
+	    parole_stream_set_image (G_OBJECT (gst->priv->stream), pixbuf);
+	    g_object_unref (pixbuf);
+    }
 
     g_object_set (G_OBJECT (gst->priv->stream),
 		  "tag-available", TRUE,
@@ -1414,6 +1513,7 @@ parole_gst_play_file_internal (ParoleGst *gst)
     if ( gst->priv->update_vis)
 	parole_gst_update_vis (gst);
     
+    parole_stream_set_image (G_OBJECT (gst->priv->stream), NULL);
     
     g_object_get (G_OBJECT (gst->priv->stream),
 		  "uri", &uri,
@@ -2420,6 +2520,18 @@ gst_get_lang_list_for_type (ParoleGst * gst, const gchar * type_name)
 }
 
 gboolean
+gst_get_has_vis( ParoleGst *gst )
+{
+    gboolean has_vis;
+    
+    g_object_get (G_OBJECT (gst->priv->conf),
+		  "vis-enabled", &has_vis,
+		  NULL);
+		  
+    return has_vis;
+}
+
+gboolean
 gst_get_has_video( ParoleGst *gst )
 {
 	gboolean playing_video;
diff --git a/src/gst/parole-gst.h b/src/gst/parole-gst.h
index a5e1208..1102de1 100644
--- a/src/gst/parole-gst.h
+++ b/src/gst/parole-gst.h
@@ -146,6 +146,7 @@ void 			parole_gst_set_cursor_visible 	(ParoleGst *gst,
 							 
 GList *			gst_get_lang_list_for_type (ParoleGst * gst, const gchar * type_name);
 
+gboolean		gst_get_has_vis( ParoleGst *gst );
 gboolean		gst_get_has_video( ParoleGst *gst );
 
 void			gst_set_current_audio_track( ParoleGst *gst, gint track_no );
diff --git a/src/misc/parole-stream.c b/src/misc/parole-stream.c
index a333499..2a9f8fe 100644
--- a/src/misc/parole-stream.c
+++ b/src/misc/parole-stream.c
@@ -68,6 +68,7 @@ struct _ParoleStreamPrivate
     gchar      *year;
     gchar      *album;
     gchar      *comment;
+    GdkPixbuf  *image;
     
     ParoleMediaType media_type; 
 };
@@ -311,6 +312,35 @@ parole_stream_finalize (GObject *object)
     G_OBJECT_CLASS (parole_stream_parent_class)->finalize (object);
 }
 
+void 
+parole_stream_set_image (GObject *object, GdkPixbuf *pixbuf)
+{
+    ParoleStream *stream;
+    
+    stream = PAROLE_STREAM (object);
+    
+    if (pixbuf)
+    PAROLE_STREAM_GET_PRIVATE (stream)->image = gdk_pixbuf_copy(pixbuf);
+    else
+    PAROLE_STREAM_GET_PRIVATE (stream)->image = NULL;
+}
+
+GdkPixbuf *
+parole_stream_get_image (GObject *object)
+{
+    ParoleStream *stream;
+    GdkPixbuf *pixbuf;
+    
+    stream = PAROLE_STREAM (object);
+    
+    if (PAROLE_STREAM_GET_PRIVATE (stream)->image)
+    pixbuf = gdk_pixbuf_copy(GDK_PIXBUF(PAROLE_STREAM_GET_PRIVATE (stream)->image));
+    else
+    pixbuf = NULL;
+    
+    return pixbuf;
+}
+
 static void
 parole_stream_class_init (ParoleStreamClass *klass)
 {
diff --git a/src/misc/parole-stream.h b/src/misc/parole-stream.h
index 46e7ef1..8fa4ef5 100644
--- a/src/misc/parole-stream.h
+++ b/src/misc/parole-stream.h
@@ -26,6 +26,7 @@
 #define __PAROLE_STREAM_H
 
 #include <glib-object.h>
+#include <gdk/gdkx.h>
 
 G_BEGIN_DECLS
 
@@ -74,6 +75,10 @@ struct _ParoleStreamClass
 
 GType        			parole_stream_get_type        (void) G_GNUC_CONST;
 
+void parole_stream_set_image (GObject *object, GdkPixbuf *pixbuf);
+
+GdkPixbuf *parole_stream_get_image (GObject *object);
+
 ParoleStream       	       *parole_stream_new             (void);
 
 void			        parole_stream_init_properties (ParoleStream *stream);
diff --git a/src/parole-player.c b/src/parole-player.c
index 3cfbeb8..f28aa72 100644
--- a/src/parole-player.c
+++ b/src/parole-player.c
@@ -70,6 +70,7 @@
 
 #include "common/parole-common.h"
 
+int GTK_ICON_SIZE_ARTWORK_FALLBACK;
 
 static void
 get_time_string (gchar *timestring, gint total_seconds)
@@ -263,7 +264,7 @@ static void parole_player_subtitles_radio_menu_item_changed_cb(GtkWidget *widget
 gboolean	parole_player_key_press 		(GtkWidget *widget, 
 							 GdkEventKey *ev, 
 							 ParolePlayer *player);
-
+							 
 static GtkTargetEntry target_entry[] =
 {
     { "STRING",        0, 0 },
@@ -339,6 +340,13 @@ struct ParolePlayerPrivate
     GtkWidget		*languages_menu;
     
     GtkWidget		*main_box;
+    GtkWidget		*eventbox_output;
+    
+    GtkWidget		*audiobox;
+    GtkWidget		*audiobox_cover;
+    GtkWidget		*audiobox_title;
+    GtkWidget		*audiobox_album;
+    GtkWidget		*audiobox_artist;
     
     GtkWidget		*volume;
     GtkWidget		*menu_bar;
@@ -817,6 +825,24 @@ parole_player_update_languages (ParolePlayer *player, ParoleGst *gst)
 	}
 }
 
+static void
+parole_player_show_audiobox (ParolePlayer *player)
+{
+    /* Only show the audiobox if we're sure there's no video playing and 
+       visualizations are disabled. */
+    if (!gst_get_has_video ( PAROLE_GST(player->priv->gst) ) &&
+        !gst_get_has_vis   ( PAROLE_GST(player->priv->gst) ) )
+    {
+	gtk_widget_show(player->priv->audiobox);
+	gtk_widget_hide_all(player->priv->eventbox_output);
+    }
+    else
+    {
+	gtk_widget_hide(player->priv->audiobox);
+	gtk_widget_show_all(player->priv->eventbox_output);
+    }
+}
+
 /**
  * parole_player_select_custom_subtitle:
  * @widget : The #GtkMenuItem for selecting a custom subtitle file.
@@ -951,6 +977,7 @@ parole_player_media_activated_cb (ParoleMediaList *list, GtkTreeRowReference *ro
 	    TRACE ("Trying to play media file %s", uri);
 	    TRACE ("File content type %s", parole_file_get_content_type (file));
 	    
+	    
 	    parole_gst_play_uri (PAROLE_GST (player->priv->gst), 
 				 parole_file_get_uri (file),
 				 sub);
@@ -1364,6 +1391,7 @@ parole_player_media_state_cb (ParoleGst *gst, const ParoleStream *stream, Parole
     if ( state == PAROLE_STATE_PLAYING )
     {
 	parole_player_playing (player, stream);
+	parole_player_show_audiobox(player);
     }
     else if ( state == PAROLE_STATE_PAUSED )
     {
@@ -1537,17 +1565,68 @@ static void
 parole_player_media_tag_cb (ParoleGst *gst, const ParoleStream *stream, ParolePlayer *player)
 {
     gchar *title;
+    gchar *album;
+    gchar *artist;
+    gchar *year;
+    GdkPixbuf *image = NULL;
     
     if ( player->priv->row )
     {
 	g_object_get (G_OBJECT (stream),
 		      "title", &title,
+		      "album", &album,
+		      "artist", &artist,
+		      "year", &year,
 		      NULL);
+
 	if ( title )
 	{
 	    parole_media_list_set_row_name (player->priv->list, player->priv->row, title);
+	    gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_title), g_markup_printf_escaped("<span color=\"white\"><b><big>%s</big></b></span>", title));
 	    g_free (title);
 	}
+	else
+	{
+	    gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_title), g_strdup_printf("<span color=\"white\"><b><big>%s</big></b></span>", _("Unknown Song")));
+	}
+
+	if ( album )
+	{
+	    if (year)
+	        gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_album), g_markup_printf_escaped("<span color=\"white\"><big>%s %s (%s)</big></span>", _("on"), album, year));
+
+	    else
+	        gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_album), g_markup_printf_escaped("<span color=\"white\"><big>%s %s</big></span>", _("on"), album));
+	        
+	    g_free (album);
+	}
+	else
+	{
+	    gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_album), g_strdup_printf("<span color=\"white\"><big>%s %s</big></span>", _("on"), _("Unknown Album")));
+	}
+	
+	if (year)
+        g_free (year);
+
+	if ( artist )
+	{
+	    gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_artist), g_markup_printf_escaped("<span color=\"white\"><big>%s %s</big></span>", _("by"), artist));
+	    g_free (artist);
+	}
+	else
+	{
+	    gtk_label_set_markup(GTK_LABEL(player->priv->audiobox_artist), g_strdup_printf("<span color=\"white\"><big>%s %s</big></span>", _("by"), _("Unknown Artist")));
+	}
+	
+	image = parole_stream_get_image(G_OBJECT(stream));
+	if (image)
+	{
+	    image = gdk_pixbuf_scale_simple(image, 200, 200, GDK_INTERP_BILINEAR);
+	    gtk_image_set_from_pixbuf(GTK_IMAGE(player->priv->audiobox_cover), image);
+    }
+	else
+	gtk_image_set_from_icon_name(GTK_IMAGE(player->priv->audiobox_cover), "audio-x-generic", GTK_ICON_SIZE_ARTWORK_FALLBACK);
+
     }
 }
 
@@ -2483,6 +2562,7 @@ parole_player_init (ParolePlayer *player)
     GdkScreen *screen;
     gint w, h;
     gboolean showhide;
+    GdkColor background;
     
     gboolean repeat, shuffle;
     
@@ -2607,6 +2687,21 @@ parole_player_init (ParolePlayer *player)
     player->priv->go_fs = GTK_WIDGET (gtk_builder_get_object (builder, "go_fs"));
     player->priv->leave_fs = GTK_WIDGET (gtk_builder_get_object (builder, "leave_fs"));
     player->priv->main_box = GTK_WIDGET (gtk_builder_get_object (builder, "main-box"));
+    player->priv->eventbox_output = GTK_WIDGET (gtk_builder_get_object (builder, "eventbox_output"));
+    
+    /* Audio box */
+    gdk_color_parse("black", &background);
+    player->priv->audiobox = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox"));
+    gtk_widget_modify_bg(GTK_WIDGET(player->priv->audiobox), GTK_STATE_NORMAL, &background);
+    
+    player->priv->audiobox_cover = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_cover"));
+    player->priv->audiobox_title = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_title"));
+    player->priv->audiobox_album = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_album"));
+    player->priv->audiobox_artist = GTK_WIDGET (gtk_builder_get_object (builder, "audiobox_artist"));
+    
+    gtk_widget_add_events (GTK_WIDGET (player->priv->audiobox), GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK);
+    g_signal_connect (G_OBJECT (player->priv->audiobox), "motion-notify-event",
+		      G_CALLBACK (parole_player_gst_widget_motion_notify_event), player);
     
     gtk_box_set_child_packing( GTK_BOX(player->priv->control), GTK_WIDGET(player->priv->play_box), TRUE, TRUE, 2, GTK_PACK_START );
     


More information about the Xfce4-commits mailing list