[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