[banshee-community-extensions/f14/master] Fix crash on startup with enabled ClutterFlow extension (BZ 684010)

chkr chkr at fedoraproject.org
Wed Mar 16 21:31:05 UTC 2011


commit a88966d5232440a1719ae25df2c04175075bac12
Author: Christian Krause <chkr at fedoraproject.org>
Date:   Wed Mar 16 22:31:03 2011 +0100

    Fix crash on startup with enabled ClutterFlow extension (BZ 684010)

 ...lutterFlow-Fixes-for-Banshee-1.8-and-v0.4.patch |  502 ++++++++++++++++++++
 banshee-community-extensions.spec                  |    8 +-
 2 files changed, 509 insertions(+), 1 deletions(-)
---
diff --git a/0001-ClutterFlow-Fixes-for-Banshee-1.8-and-v0.4.patch b/0001-ClutterFlow-Fixes-for-Banshee-1.8-and-v0.4.patch
new file mode 100644
index 0000000..8a51db8
--- /dev/null
+++ b/0001-ClutterFlow-Fixes-for-Banshee-1.8-and-v0.4.patch
@@ -0,0 +1,502 @@
+From ef2c143d20072a440e0c4ca910256d32579ea2e9 Mon Sep 17 00:00:00 2001
+From: Mathijs Dumon <zandmathijsje at yahoo.co.uk>
+Date: Thu, 11 Nov 2010 17:30:14 +0100
+Subject: [PATCH] [ClutterFlow] Fixes for Banshee 1.8 and v0.4
+
+---
+ .../Banshee.ClutterFlow/ArtworkLookup.cs           |   23 +--
+ .../Banshee.ClutterFlow/ClutterFlowAlbum.cs        |   10 +-
+ .../Banshee.ClutterFlow/ClutterFlowView.cs         |    2 +
+ src/ClutterFlow/ClutterFlow/ClutterFlowActor.cs    |  178 ++++++++++----------
+ .../ClutterFlow/ClutterFlowFixedActor.cs           |   15 +-
+ src/ClutterFlow/ClutterFlow/ClutterHelper.cs       |    4 +-
+ 6 files changed, 122 insertions(+), 110 deletions(-)
+
+diff --git a/src/ClutterFlow/Banshee.ClutterFlow/ArtworkLookup.cs b/src/ClutterFlow/Banshee.ClutterFlow/ArtworkLookup.cs
+index f9611be..a97379c 100755
+--- a/src/ClutterFlow/Banshee.ClutterFlow/ArtworkLookup.cs
++++ b/src/ClutterFlow/Banshee.ClutterFlow/ArtworkLookup.cs
+@@ -197,11 +197,10 @@ namespace Banshee.ClutterFlow
+ 					ClutterFlowAlbum cover = LookupQueue.Dequeue ();
+ 					float size = cover.CoverManager.TextureSize;
+ 					string cache_id = cover.PbId;
+-					Gdk.Pixbuf pb = artwork_manager.LookupScalePixbuf (cache_id, (int) size);
+-					if (pb!=null) {
+-                        pb = ClutterFlowActor.MakeReflection(pb);
++					Cairo.ImageSurface surface = artwork_manager.LookupScaleSurface(cache_id, (int) size);
++					if (surface!=null) {
+                         Gtk.Application.Invoke (delegate {
+-                            GtkInvoke (cover, pb);
++							SetCoverToSurface(cover, surface);
+                         });
+ 					}
+                     t.IsBackground = true;
+@@ -217,19 +216,17 @@ namespace Banshee.ClutterFlow
+         {
+             float size = cover.CoverManager.TextureSize;
+             string cache_id = cover.PbId;
+-            Gdk.Pixbuf pb = artwork_manager.LookupScalePixbuf (cache_id, (int) size);
+-            if (pb!=null) {
+-                pb = ClutterFlowActor.MakeReflection(pb);
+-                GtkInvoke (cover, pb);
++            Cairo.ImageSurface surface = artwork_manager.LookupScaleSurface(cache_id, (int) size);
++            if (surface!=null) {
++                SetCoverToSurface(cover, surface);
+             }
+         }
+ 
+-        private void GtkInvoke (ClutterFlowAlbum cover, Gdk.Pixbuf pb)
++        private void SetCoverToSurface (ClutterFlowAlbum cover, Cairo.ImageSurface surface)
+         {
+-            cover.Enqueued = false;
+-            cover.SwappedToDefault = false;
+-            GtkUtil.TextureSetFromPixbuf (cover.Cover, pb);
+-            pb.Dispose ();
++	            cover.Enqueued = false;
++	            //cover.SwappedToDefault = false;
++				ClutterFlowActor.MakeReflection(surface, cover.Cover);
+         }
+ 	}
+ }
+diff --git a/src/ClutterFlow/Banshee.ClutterFlow/ClutterFlowAlbum.cs b/src/ClutterFlow/Banshee.ClutterFlow/ClutterFlowAlbum.cs
+index 40c25af..297f8e7 100755
+--- a/src/ClutterFlow/Banshee.ClutterFlow/ClutterFlowAlbum.cs
++++ b/src/ClutterFlow/Banshee.ClutterFlow/ClutterFlowAlbum.cs
+@@ -110,9 +110,15 @@ namespace Banshee.ClutterFlow
+ 		#endregion
+ 		
+ 		#region Texture Handling
+-		protected override Gdk.Pixbuf GetDefaultPb ()
++		protected override Cairo.ImageSurface GetDefaultSurface ()
+ 		{
+-			return IconThemeUtils.LoadIcon (coverManager.TextureSize, "media-optical", "browser-album-cover");
++			Cairo.ImageSurface surface = new Cairo.ImageSurface(Cairo.Format.ARGB32, coverManager.TextureSize, coverManager.TextureSize);
++			Cairo.Context context = new Cairo.Context(surface);
++			Gdk.CairoHelper.SetSourcePixbuf(context, IconThemeUtils.LoadIcon (coverManager.TextureSize, "media-optical", "browser-album-cover"), 0, 0);
++			context.Paint();
++			//((IDisposable) context.Target).Dispose();
++			((IDisposable) context).Dispose();
++			return  surface;
+ 		}	
+ 
+ 		protected override void HandleTextureSizeChanged (object sender, System.EventArgs e)
+diff --git a/src/ClutterFlow/Banshee.ClutterFlow/ClutterFlowView.cs b/src/ClutterFlow/Banshee.ClutterFlow/ClutterFlowView.cs
+index 224a624..e5bb9bb 100755
+--- a/src/ClutterFlow/Banshee.ClutterFlow/ClutterFlowView.cs
++++ b/src/ClutterFlow/Banshee.ClutterFlow/ClutterFlowView.cs
+@@ -266,6 +266,8 @@ namespace Banshee.ClutterFlow
+ 			coverManager.SetRotation (RotateAxis.X, viewportAngleX, Stage.Width/2, Stage.Height/2,0);
+ 			Stage.Add (coverManager);
+ 
++			
++			
+ 			coverManager.EmptyActor.SetToPb(
+ 	            IconThemeUtils.LoadIcon (coverManager.TextureSize, "gtk-stop", "clutterflow-large.png")
+             );
+diff --git a/src/ClutterFlow/ClutterFlow/ClutterFlowActor.cs b/src/ClutterFlow/ClutterFlow/ClutterFlowActor.cs
+index 265e4bd..e3eaf53 100755
+--- a/src/ClutterFlow/ClutterFlow/ClutterFlowActor.cs
++++ b/src/ClutterFlow/ClutterFlow/ClutterFlowActor.cs
+@@ -43,7 +43,7 @@ namespace ClutterFlow
+         event IndexChangedEventHandler IndexChanged;
+     }
+ 
+-	public delegate Gdk.Pixbuf NeedPixbuf();
++	public delegate Cairo.ImageSurface NeedSurface();
+     public delegate void IndexChangedEventHandler(IIndexable item, int old_index, int new_index);
+ 	
+ 	public class TextureHolder : IDisposable {
+@@ -64,11 +64,11 @@ namespace ClutterFlow
+ 			}
+ 		}
+ 		
+-		protected Gdk.Pixbuf default_pb;
+-		public Gdk.Pixbuf DefaultPb {
++		protected Cairo.ImageSurface default_surface;
++		public Cairo.ImageSurface DefaultSurface {
+ 			get {
+-				if (default_pb==null && GetDefaultPb!=null) default_pb = ClutterFlowActor.MakeReflection(GetDefaultPb());
+-				return default_pb;
++				if (default_surface==null && GetDefaultSurface!=null) default_surface = ClutterFlowActor.MakeReflection(GetDefaultSurface());
++				return default_surface;
+ 			}
+ 		}
+ 		
+@@ -88,14 +88,14 @@ namespace ClutterFlow
+ 			}
+ 		}
+ 		
+-		public NeedPixbuf GetDefaultPb;
++		public NeedSurface GetDefaultSurface;
+ 		#endregion
+ 
+ 		#region Initialisation
+-		public TextureHolder (CoverManager coverManager, NeedPixbuf getDefaultPb)
++		public TextureHolder (CoverManager coverManager, NeedSurface getDefaultSurface)
+ 		{
+ 			this.CoverManager = coverManager;
+-			this.GetDefaultPb = getDefaultPb;
++			this.GetDefaultSurface = getDefaultSurface;
+ 			ReloadDefaultTextures ();
+ 		}
+         ~ TextureHolder () {
+@@ -108,8 +108,8 @@ namespace ClutterFlow
+                 return;
+             disposed = true;
+             CoverManager = null;
+-            GetDefaultPb = null;
+-            default_pb.Dispose ();
++            GetDefaultSurface = null;
++            ((IDisposable) default_surface).Dispose ();
+             Cogl.Handle.Unref (defltTexture);
+             Cogl.Handle.Unref (shadeTexture);
+             defltTexture = IntPtr.Zero;
+@@ -119,7 +119,10 @@ namespace ClutterFlow
+ 
+ 		public void ReloadDefaultTextures ()
+ 		{
+-			default_pb = null; //reset this so it gets reloaded
++			if (default_surface != null)
++				((IDisposable) default_surface).Dispose ();
++			default_surface = null; //reset this so it gets reloaded
++			
+ 			SetupDefaultTexture ();
+ 			SetupShadeTexture ();
+ 		}
+@@ -127,15 +130,17 @@ namespace ClutterFlow
+ 		public void SetupDefaultTexture ()
+ 		{
+ 			if (defltTexture==IntPtr.Zero) {
+-				if (DefaultPb!=null) {
++				if (DefaultSurface!=null) {
+ 					Cogl.PixelFormat fm;
+-					if (DefaultPb.HasAlpha)
+-						fm = PixelFormat.Rgba8888;
+-					else
++					if (DefaultSurface.Format == Cairo.Format.ARGB32)
++						fm = PixelFormat.Argb8888Pre;
++					else //if (DefaultSurface.Format == Cairo.Format.RGB24)
+ 						fm = PixelFormat.Rgb888;
++					
+ 					unsafe {
+-						defltTexture = ClutterHelper.cogl_texture_new_from_data((uint) DefaultPb.Width, (uint) DefaultPb.Height, Cogl.TextureFlags.None,
+-						                                         fm, Cogl.PixelFormat.Any, (uint) DefaultPb.Rowstride, DefaultPb.Pixels);
++						
++						defltTexture = ClutterHelper.cogl_texture_new_from_data((uint) DefaultSurface.Width, (uint) DefaultSurface.Height, Cogl.TextureFlags.None,
++						                                         fm, Cogl.PixelFormat.Any, (uint) DefaultSurface.Stride, DefaultSurface.DataPtr);
+ 					}
+ 				} else {
+ 					defltTexture = Cogl.Texture.NewWithSize ((uint) coverManager.TextureSize, (uint) coverManager.TextureSize,
+@@ -266,61 +271,58 @@ namespace ClutterFlow
+         }
+ 
+         #region Texture Handling
+-        public static Gdk.Pixbuf MakeReflection (Pixbuf pb) {
+-            if (pb.BitsPerSample != 8)
+-                throw new System.Exception ("Invalid bits per sample");
++        public static void MakeReflection (Cairo.ImageSurface source, CairoTexture dest) {
++	        int w = source.Width + 4;
++	        int h = source.Height * 2 + 4;
+ 			
++			dest.SetSurfaceSize ((uint) w, (uint) h);
+ 			
+-			Gdk.Pixbuf border_pb = new Gdk.Pixbuf(Colorspace.Rgb, true, pb.BitsPerSample, pb.Width+4, pb.Height+2);
+-			border_pb.Fill (0x00000000);
+-			pb.CopyArea (0, 0, pb.Width, pb.Height, border_pb, 2, 2);
+ 			
+-			Gdk.Pixbuf final_pb = new Gdk.Pixbuf(Colorspace.Rgb, true, border_pb.BitsPerSample, border_pb.Width, border_pb.Height*2);
+-
+-
+-            unsafe {
+-
+-                bool alpha = border_pb.HasAlpha;
+-                int src_rowstride = border_pb.Rowstride;
+-                int src_width = border_pb.Width;
+-                int src_height = border_pb.Height;
+-                byte * src_byte = (byte *) border_pb.Pixels;
+-                byte * src_base = src_byte;
+-
+-                int dst_rowstride = final_pb.Rowstride;
+-                int dst_width = final_pb.Width;
+-                int dst_height = final_pb.Height;
+-                byte * dst_byte = (byte *) final_pb.Pixels;
+-                byte * dst_base = dst_byte;
+-
+-                byte * refl_byte = dst_base + (dst_height-1) * dst_rowstride + (dst_width-1) * 4  + 3;
+-
+-                for (int j = 0; j < src_height; j++) {
+-                    src_byte = ((byte *) src_base) + j * src_rowstride;
+-                    dst_byte = ((byte *) dst_base) + j * dst_rowstride;
+-                    refl_byte = ((byte *) dst_base) + (dst_height-1-j) * dst_rowstride;
+-                    for (int i = 0; i < src_width; i++) {
+-                        byte r = *(src_byte++);
+-                        byte g = *(src_byte++);
+-                        byte b = *(src_byte++);
+-                        byte a = 0xff;
+-                        if (alpha)
+-                            a = *(src_byte++);
+-
+-                        *dst_byte++ = r;
+-                        *dst_byte++ = g;
+-                        *dst_byte++ = b;
+-                        *dst_byte++ = a;
+-                        *refl_byte++ = r;
+-                        *refl_byte++ = g;
+-                        *refl_byte++ = b;
+-                        *refl_byte++ = (byte) ((float) a * (float) (Math.Max(0, j - 0.3*src_height) / src_height));
+-                    }
+-                }
+-            }
+ 			
+-            return final_pb;
++			Cairo.Context context = dest.Create();
++			
++			MakeReflection (context, source,  w, h);
++
++			//((IDisposable) context.Target).Dispose();
++			((IDisposable) context).Dispose();
+         }
++		
++		
++        public static Cairo.ImageSurface MakeReflection (Cairo.ImageSurface source) {
++	        int w = source.Width + 4;
++	        int h = source.Height * 2 + 4;
++			
++			Cairo.ImageSurface dest = new Cairo.ImageSurface(Cairo.Format.ARGB32, w, h);
++			Cairo.Context context = new Cairo.Context(dest);
++	
++			MakeReflection (context, source, w, h);
++
++			//((IDisposable) context.Target).Dispose();
++			((IDisposable) context).Dispose();
++			
++			return dest;
++        }
++		
++		private static void MakeReflection (Cairo.Context context, Cairo.ImageSurface source, int w, int h) {
++
++			context.ResetClip ();			
++			context.SetSourceSurface(source, 2, 2);
++	        context.Paint();
++			
++	        double alpha = -0.3;
++	        double step = 1.0 / (double) source.Height;
++
++			context.Translate(0, h);
++			context.Scale (1, -1);
++			context.SetSourceSurface(source, 2, 2);
++	        for (int i = 0; i < source.Height; i++) {
++				context.Rectangle(0, i+2, w, 1);
++	            context.Clip();
++				alpha += step;
++	            context.PaintWithAlpha(Math.Max(Math.Min(alpha, 0.7), 0.0));
++	            context.ResetClip();
++			}
++		}
+         #endregion
+     }
+ 
+@@ -339,10 +341,10 @@ namespace ClutterFlow
+             protected set { is_setup = value; }
+         }
+ 
+-        private bool swapped = false;
+-        private bool delayed_cover_swap = false;
++       /* private bool swapped = false;
++        private bool delayed_cover_swap = false;*/
+         private bool delayed_shade_swap = false;
+-        public bool SwappedToDefault {
++        /*public bool SwappedToDefault {
+             get { return swapped; }
+             set {
+                 if (value!=swapped) {
+@@ -353,15 +355,15 @@ namespace ClutterFlow
+                         SetCoverSwap ();
+                 }
+             }
+-        }
++        }*/
+ 		
+ 		protected bool CanUseShader {
+ 			get {
+-				return ClutterHelper.CheckForExtension ("GL_ARB_vertex_shader");
++				return Clutter.Feature.Available (Clutter.FeatureFlags.ShadersGlsl);
+ 			}
+ 		}
+ 		
+-        private void SetCoverSwap () {
++        /*private void SetCoverSwap () {
+             if (swapped) {
+                 cover.CoglTexture = textureHolder.DefaultTexture;
+             } else {
+@@ -369,7 +371,7 @@ namespace ClutterFlow
+                                                              Cogl.TextureFlags.NoSlicing, Cogl.PixelFormat.Argb8888);
+             }
+             delayed_cover_swap = false;
+-        }
++        }*/
+ 
+         private void SetShadeSwap () {
+ 			if (!has_shader) {
+@@ -378,8 +380,8 @@ namespace ClutterFlow
+ 			}
+         }
+ 
+-        protected Clutter.Texture cover = null;
+-        public Clutter.Texture Cover {
++        protected Clutter.CairoTexture cover = null;
++        public Clutter.CairoTexture Cover {
+             get { return cover; }
+         }
+         protected Clutter.Texture shade = null;
+@@ -399,15 +401,15 @@ namespace ClutterFlow
+             }
+         }
+ 
+-		private NeedPixbuf getDefaultPb;
++		private NeedSurface getDefaultSurface;
+ 		
+ 		protected bool shifted_outwards;
+ 		#endregion
+ 		
+ 		#region Initialization	
+-		public ClutterFlowActor (CoverManager cover_manager, NeedPixbuf getDefaultPb) : base (cover_manager)
++		public ClutterFlowActor (CoverManager cover_manager, NeedSurface getDefaultSurface) : base (cover_manager)
+ 		{
+-			this.getDefaultPb = getDefaultPb;
++			this.getDefaultSurface = getDefaultSurface;
+ 
+             this.ParentSet += HandleParentSet;
+ 			this.LeaveEvent += HandleLeaveEvent;
+@@ -430,14 +432,14 @@ namespace ClutterFlow
+ 			this.LeaveEvent -= HandleLeaveEvent;
+             this.ButtonPressEvent -= HandleButtonPressEvent;
+             this.ButtonReleaseEvent -= HandleButtonReleaseEvent;
+-            getDefaultPb = null;
++            getDefaultSurface = null;
+ 
+             DisposeStatics ();
+         }
+ 		protected virtual bool SetupStatics ()
+ 		{
+ 			if (textureHolder==null)
+-				textureHolder = new TextureHolder(CoverManager, GetDefaultPb);
++				textureHolder = new TextureHolder(CoverManager, getDefaultSurface);
+ 			return true;
+ 		}
+         protected virtual void DisposeStatics ()
+@@ -465,7 +467,7 @@ namespace ClutterFlow
+ 		protected bool has_shader = false;
+ 		protected virtual void TryShading ()
+ 		{
+-			if (CanUseShader/*Clutter.Feature.Available (Clutter.FeatureFlags.ShadersGlsl)*/) {
++			/*if (CanUseShader) {
+ 				shader = new Clutter.Shader ();
+ 				shader.VertexSource = @"
+ 					attribute vec4 gl_Color;
+@@ -497,13 +499,13 @@ namespace ClutterFlow
+ 				OnAngleChanged (this, new GLib.NotifyArgs());
+ 				OnAnchorChanged (this, new GLib.NotifyArgs());
+ 				has_shader = true;
+-			}
++			}*/
+ 		}
+ 		
+ 		protected virtual void SetupCover ()
+ 		{
+ 			if (cover==null) {
+-				cover = new Clutter.Texture();				
++				cover = new Clutter.CairoTexture((uint) coverManager.TextureSize, (uint) coverManager.TextureSize*2);				
+ 				Add (cover);
+ 				cover.Show ();
+ 				cover.Realize ();
+@@ -512,7 +514,7 @@ namespace ClutterFlow
+ 			cover.SetPosition (0, 0);
+ 			cover.Opacity = 255;
+ 			
+-			SwappedToDefault = true;
++			//SwappedToDefault = true;
+ 		}
+ 		
+ 		protected virtual void OnOpacityChanged (object sender, NotifyArgs args)
+@@ -552,9 +554,9 @@ namespace ClutterFlow
+ 		#endregion
+ 
+ 		#region Texture Handling
+-		protected virtual Gdk.Pixbuf GetDefaultPb ()
++		protected virtual Cairo.ImageSurface GetDefaultSurface ()
+ 		{
+-			return (getDefaultPb!=null) ? getDefaultPb() : null;
++			return (getDefaultSurface!=null) ? getDefaultSurface() : null;
+ 		}
+ 
+ 		protected virtual void HandleTextureSizeChanged(object sender, EventArgs e)
+@@ -625,7 +627,7 @@ namespace ClutterFlow
+         {
+             if (this.Stage != null) {
+                 if (delayed_shade_swap) SetShadeSwap ();
+-                if (delayed_cover_swap) SetCoverSwap ();
++                //if (delayed_cover_swap) SetCoverSwap ();
+             }
+         }
+ 
+diff --git a/src/ClutterFlow/ClutterFlow/ClutterFlowFixedActor.cs b/src/ClutterFlow/ClutterFlow/ClutterFlowFixedActor.cs
+index 9ecf092..b0e7ccd 100644
+--- a/src/ClutterFlow/ClutterFlow/ClutterFlowFixedActor.cs
++++ b/src/ClutterFlow/ClutterFlow/ClutterFlowFixedActor.cs
+@@ -38,11 +38,11 @@ namespace ClutterFlow
+     {
+ 
+         #region Fields
+-        protected Clutter.Texture texture;
+-        public Clutter.Texture Texture {
++        protected Clutter.CairoTexture texture;
++        public Clutter.CairoTexture Texture {
+             get {
+                 if (texture==null) {
+-                    texture = new Clutter.Texture ();
++                    texture = new Clutter.CairoTexture ((uint) coverManager.Behaviour.CoverWidth, (uint) coverManager.Behaviour.CoverWidth*2);				
+                     Add (texture);
+                     texture.Show ();
+                 }
+@@ -93,8 +93,13 @@ namespace ClutterFlow
+ 			SetAnchorPoint (0, 0);
+ 				
+             if (pb!=null) {
+-                GtkUtil.TextureSetFromPixbuf (Texture, MakeReflection(pb));
+-                pb.Dispose ();
++				Cairo.Context context = Texture.Create();
++				
++				Gdk.CairoHelper.SetSourcePixbuf(context, pb, 0, 0);
++				context.Paint();
++				
++				((IDisposable) context.Target).Dispose ();
++				((IDisposable) context).Dispose ();
+             }
+ 
+ 			Texture.SetPosition (0, 0);
+diff --git a/src/ClutterFlow/ClutterFlow/ClutterHelper.cs b/src/ClutterFlow/ClutterFlow/ClutterHelper.cs
+index c093d3d..4992e46 100755
+--- a/src/ClutterFlow/ClutterFlow/ClutterHelper.cs
++++ b/src/ClutterFlow/ClutterFlow/ClutterHelper.cs
+@@ -52,7 +52,7 @@ namespace ClutterFlow
+ 		[DllImport ("libclutter-glx-1.0.so.0")]
+ 		private static extern void clutter_actor_box_from_vertices (ref ActorBox box, IntPtr[] vtx);
+ 		
+-		[DllImport("libGL.so", EntryPoint = "glGetString")]
++		/*[DllImport("libGL.so", EntryPoint = "glGetString")]
+ 		private static extern IntPtr glGetString(int s);
+ 
+ 		public static string OpenGLGetString (int i)
+@@ -68,7 +68,7 @@ namespace ClutterFlow
+             else {
+ 				return extensions.Contains (extension);
+ 			}
+-		}
++		}*/
+ 		
+ 		
+ 		public unsafe static ActorBox GetAbsAllocationBox (Actor actor)
+-- 
+1.7.3.4
+
diff --git a/banshee-community-extensions.spec b/banshee-community-extensions.spec
index ca78fef..09e9bc7 100644
--- a/banshee-community-extensions.spec
+++ b/banshee-community-extensions.spec
@@ -2,12 +2,14 @@
 
 Name:		banshee-community-extensions
 Version:	1.8.0
-Release:	2%{?dist}
+Release:	3%{?dist}
 Summary:	Collection of extensions for the media player Banshee
 Group:		Applications/Multimedia
 License:	GPLv2+ and MIT
 URL:		http://banshee-project.org/download/extensions/
 Source0:	http://download.banshee-project.org/banshee-community-extensions/%{version}/%{name}-%{version}.tar.bz2
+# http://gitorious.org/banshee-community-extensions/banshee-community-extensions/commit/ef2c143d20072a440e0c4ca910256d32579ea2e9
+Patch:		0001-ClutterFlow-Fixes-for-Banshee-1.8-and-v0.4.patch
 BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Requires:	banshee
 BuildRequires:	mono-devel, banshee-devel, banshee-musicbrainz-devel
@@ -27,6 +29,7 @@ for the media player Banshee.
 
 %prep
 %setup -q
+%patch -p1 -b .clutterflow
 
 %build
 %configure	--enable-gnome --disable-schemas-install --enable-alarmclock \
@@ -58,6 +61,9 @@ find $RPM_BUILD_ROOT -name '*.la' -or -name '*.a' -exec rm -f {} \;
 %{_datadir}/gnome/help/banshee/*/*
 
 %changelog
+* Wed Mar 16 2011 Christian Krause <chkr at fedoraproject.org> - 1.8.0-3
+- Fix crash on startup with enabled ClutterFlow extension (BZ 684010)
+
 * Sun Oct 03 2010 Nathaniel McCallum <nathaniel at natemccallum.com> - 1.8.0-2
 - Fix permissions on dll.config files
 


More information about the scm-commits mailing list