[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#680383: unblock: pinta/1.3-2 (-1 in exp currently)



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: freeze-exception

Hello,

Please ack an unblock of package pinta. I just uploaded it to
experimental in case you deny this request, so we still have room to
cherry-pick bug fixes in.

1.3 is an upstream bug fix release that came out quite some time ago,
but I missed due to a debian/watch FAIL on my part. It's true that
Debian users haven't filed bugs for the issues that are fixed in this
release but nonetheless they are real and should be fixed IMHO.

Upstream don't ship a NEWS file in the tarball, but there's one on their
website

  http://pinta-project.com/Releases.1-3.ashx

where you can see all of the bugs that were fixed. There are crashes,
leaks and other bugs in 1.2 whose fixes we should have in Wheezy.

Attached is a diff. I filtered out translation changes and my updating
of debian/copyright. The headline is

  55 files changed, 634 insertions(+), 386 deletions(-)

If you ack this in principle, I'll upload to unstable as 1.3-2 and then
you can unblock that.

Cheers,

-- 
Iain Lane                                  [ iain@orangesquash.org.uk ]
Debian Developer                                   [ laney@debian.org ]
Ubuntu Developer                                   [ laney@ubuntu.com ]
PhD student                                       [ ial@cs.nott.ac.uk ]
diff --git a/Pinta.Core/Actions/EditActions.cs b/Pinta.Core/Actions/EditActions.cs
index e1c7e41..e9282b7 100644
--- a/Pinta.Core/Actions/EditActions.cs
+++ b/Pinta.Core/Actions/EditActions.cs
@@ -49,6 +49,7 @@ namespace Pinta.Core
 		public Gtk.Action SavePalette { get; private set; }
 		public Gtk.Action ResetPalette { get; private set; }
 		public Gtk.Action ResizePalette { get; private set; }
+		public Gtk.Action AddinManager { get; private set; }
 		
 		private string lastPaletteDir = null;
 		
@@ -60,6 +61,7 @@ namespace Pinta.Core
 			fact.Add ("Menu.Edit.FillSelection.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("Menu.Edit.FillSelection.png")));
 			fact.Add ("Menu.Edit.InvertSelection.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("Menu.Edit.InvertSelection.png")));
 			fact.Add ("Menu.Edit.SelectAll.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("Menu.Edit.SelectAll.png")));
+			fact.Add ("Menu.Edit.Addins.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("Menu.Edit.Addins.png")));
 			fact.AddDefault ();
 			
 			Undo = new Gtk.Action ("Undo", Catalog.GetString ("Undo"), null, Stock.Undo);
@@ -79,6 +81,8 @@ namespace Pinta.Core
 			SavePalette = new Gtk.Action ("SavePalette", Catalog.GetString ("Save As..."), null, Stock.Save);
 			ResetPalette = new Gtk.Action ("ResetPalette", Catalog.GetString ("Reset to Default"), null, Stock.RevertToSaved);
 			ResizePalette = new Gtk.Action ("ResizePalette", Catalog.GetString ("Set Number of Colors"), null, "Menu.Image.Resize.png");
+
+			AddinManager = new Gtk.Action ("AddinManager", Catalog.GetString ("Add-in Manager"), null, "Menu.Edit.Addins.png");
 			
 			Undo.IsImportant = true;
 			Undo.Sensitive = false;
@@ -124,6 +128,9 @@ namespace Pinta.Core
 			palette_menu.Append (SavePalette.CreateMenuItem ());
 			palette_menu.Append (ResetPalette.CreateMenuItem ());
 			palette_menu.Append (ResizePalette.CreateMenuItem ());
+
+			menu.AppendSeparator ();
+			menu.Append (AddinManager.CreateMenuItem ());
 		}
 
 		public void CreateHistoryWindowToolBar (Gtk.Toolbar toolbar)
@@ -138,7 +145,6 @@ namespace Pinta.Core
 			EraseSelection.Activated += HandlePintaCoreActionsEditEraseSelectionActivated;
 			SelectAll.Activated += HandlePintaCoreActionsEditSelectAllActivated;
 			FillSelection.Activated += HandlePintaCoreActionsEditFillSelectionActivated;
-			Paste.Activated += HandlerPintaCoreActionsEditPasteActivated;
 			Copy.Activated += HandlerPintaCoreActionsEditCopyActivated;
 			Undo.Activated += HandlerPintaCoreActionsEditUndoActivated;
 			Redo.Activated += HandlerPintaCoreActionsEditRedoActivated;
@@ -227,71 +233,6 @@ namespace Pinta.Core
 			doc.Workspace.Invalidate ();
 		}
 
-		private void HandlerPintaCoreActionsEditPasteActivated (object sender, EventArgs e)
-		{
-			Document doc = PintaCore.Workspace.ActiveDocument;
-
-			PintaCore.Tools.Commit ();
-
-			Gtk.Clipboard cb = Gtk.Clipboard.Get (Gdk.Atom.Intern ("CLIPBOARD", false));
-			
-			Path p;
-
-			// Don't dispose this, as we're going to give it to the history
-			Gdk.Pixbuf image = cb.WaitForImage ();
-
-			if (image == null)
-				return;
-
-			Gdk.Size canvas_size = PintaCore.Workspace.ImageSize;
-
-			// If the image being pasted is larger than the canvas size, allow the user to optionally resize the canvas
-			if (image.Width > canvas_size.Width || image.Height > canvas_size.Height)
-			{
-				string message = Catalog.GetString ("The image being pasted is larger than the canvas size. What would you like to do?");
-
-				var enlarge_dialog = new MessageDialog (PintaCore.Chrome.MainWindow, DialogFlags.Modal, MessageType.Question, ButtonsType.None, message);
-				enlarge_dialog.AddButton (Catalog.GetString ("Expand canvas"), ResponseType.Accept);
-				enlarge_dialog.AddButton (Catalog.GetString ("Don't change canvas size"), ResponseType.Reject);
-				enlarge_dialog.AddButton (Stock.Cancel, ResponseType.Cancel);
-				enlarge_dialog.DefaultResponse = ResponseType.Accept;
-
-				ResponseType response = (ResponseType)enlarge_dialog.Run ();
-				enlarge_dialog.Destroy ();
-
-				if (response == ResponseType.Accept)
-				{
-					PintaCore.Workspace.ResizeCanvas (image.Width, image.Height, Pinta.Core.Anchor.Center);
-					PintaCore.Actions.View.UpdateCanvasScale ();
-				}
-				else if (response == ResponseType.Cancel || response == ResponseType.DeleteEvent)
-				{
-					return;
-				}
-			}
-
-			// Copy the paste to the temp layer
-			doc.CreateSelectionLayer ();
-			doc.ShowSelectionLayer = true;
-
-			using (Cairo.Context g = new Cairo.Context (doc.SelectionLayer.Surface)) {
-				g.DrawPixbuf (image, new Cairo.Point (0, 0));
-				p = g.CreateRectanglePath (new Rectangle (0, 0, image.Width, image.Height));
-			}
-
-			PintaCore.Tools.SetCurrentTool (Catalog.GetString ("Move Selected Pixels"));
-			
-			Path old_path = doc.SelectionPath;
-			bool old_show_selection = doc.ShowSelection;
-
-			doc.SelectionPath = p;
-			doc.ShowSelection = true;
-
-			doc.Workspace.Invalidate ();
-
-			doc.History.PushNewItem (new PasteHistoryItem (image, old_path, old_show_selection));
-		}
-
 		private void HandlerPintaCoreActionsEditCopyActivated (object sender, EventArgs e)
 		{
 			Document doc = PintaCore.Workspace.ActiveDocument;
diff --git a/Pinta.Core/Actions/HelpActions.cs b/Pinta.Core/Actions/HelpActions.cs
index b9b30e5..4a857c1 100644
--- a/Pinta.Core/Actions/HelpActions.cs
+++ b/Pinta.Core/Actions/HelpActions.cs
@@ -34,7 +34,6 @@ namespace Pinta.Core
 {
 	public class HelpActions
 	{
-		public Gtk.Action ExtensionManager { get; private set; }
 		public Gtk.Action Website { get; private set; }
 		public Gtk.Action Bugs { get; private set; }
 		public Gtk.Action Translate { get; private set; }
@@ -46,10 +45,8 @@ namespace Pinta.Core
 			fact.Add ("Menu.Help.Bug.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("Menu.Help.Bug.png")));
 			fact.Add ("Menu.Help.Website.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("Menu.Help.Website.png")));
 			fact.Add ("Menu.Help.Translate.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("Menu.Help.Translate.png")));
-			fact.Add ("Menu.Help.Extensions.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("Menu.Help.Extensions.png")));
 			fact.AddDefault ();
 
-			ExtensionManager = new Gtk.Action ("ExtensionManager", Catalog.GetString ("Extension Manager"), null, "Menu.Help.Extensions.png");
 			Website = new Gtk.Action ("Website", Catalog.GetString ("Pinta Website"), null, "Menu.Help.Website.png");
 			Bugs = new Gtk.Action ("Bugs", Catalog.GetString ("File a Bug"), null, "Menu.Help.Bug.png");
 			Translate = new Gtk.Action ("Translate", Catalog.GetString ("Translate This Application"), null, "Menu.Help.Translate.png");
@@ -59,7 +56,6 @@ namespace Pinta.Core
 		#region Initialization
 		public void CreateMainMenu (Gtk.Menu menu)
 		{
-			menu.Append (ExtensionManager.CreateMenuItem ());
 			menu.Append (Website.CreateMenuItem ());
 			menu.Append (Bugs.CreateMenuItem ());
 			menu.Append (Translate.CreateMenuItem ());
diff --git a/Pinta.Core/Actions/LayerActions.cs b/Pinta.Core/Actions/LayerActions.cs
index 0919e69..a0d4690 100644
--- a/Pinta.Core/Actions/LayerActions.cs
+++ b/Pinta.Core/Actions/LayerActions.cs
@@ -155,8 +155,8 @@ namespace Pinta.Core
 			PintaCore.Tools.Commit ();
 
 			Gtk.FileChooserDialog fcd = new Gtk.FileChooserDialog (Catalog.GetString ("Open Image File"), null, FileChooserAction.Open, Gtk.Stock.Cancel, Gtk.ResponseType.Cancel, Gtk.Stock.Open, Gtk.ResponseType.Ok);
-			
-			fcd.SetCurrentFolder (PintaCore.System.LastDialogDirectory);
+
+            fcd.SetCurrentFolder (PintaCore.System.GetDialogDirectory ());
 			fcd.AlternativeButtonOrder = new int[] { (int) ResponseType.Ok, (int) ResponseType.Cancel };
 
 			fcd.AddImagePreview ();
diff --git a/Pinta.Core/Actions/WindowActions.cs b/Pinta.Core/Actions/WindowActions.cs
index c0dc721..83843d3 100644
--- a/Pinta.Core/Actions/WindowActions.cs
+++ b/Pinta.Core/Actions/WindowActions.cs
@@ -97,6 +97,7 @@ namespace Pinta.Core
 			// Remove from our list of actions
 			RadioAction act = OpenWindows.Where (p => p.Name == doc.Guid.ToString ()).FirstOrDefault ();
 			OpenWindows.Remove (act);
+            act.Dispose ();
 
 			// Remove all the menu items from the menu
 			foreach (var item in action_menu_items.Values) {
diff --git a/Pinta.Core/Classes/Document.cs b/Pinta.Core/Classes/Document.cs
index f582d9e..b6df29a 100644
--- a/Pinta.Core/Classes/Document.cs
+++ b/Pinta.Core/Classes/Document.cs
@@ -243,6 +243,8 @@ namespace Pinta.Core
 
 			if (selection_path != null)
 				(selection_path as IDisposable).Dispose ();
+
+            Workspace.History.Clear ();
 		}
 
 		public Context CreateClippedContext ()
diff --git a/Pinta.Core/Classes/DocumentWorkspaceHistory.cs b/Pinta.Core/Classes/DocumentWorkspaceHistory.cs
index 05bff76..b204acd 100644
--- a/Pinta.Core/Classes/DocumentWorkspaceHistory.cs
+++ b/Pinta.Core/Classes/DocumentWorkspaceHistory.cs
@@ -98,9 +98,6 @@ namespace Pinta.Core
 		
 		public void Undo ()
 		{
-			// ensure that the current tool's modifications are added to the history first (e.g. editing text)
-			PintaCore.Tools.CurrentTool.DoCommit ();
-
 			if (historyPointer < 0) {
 				throw new InvalidOperationException ("Undo stack is empty");
 			} else {
diff --git a/Pinta.Core/Classes/Layer.cs b/Pinta.Core/Classes/Layer.cs
index 53d33fd..6a1442a 100644
--- a/Pinta.Core/Classes/Layer.cs
+++ b/Pinta.Core/Classes/Layer.cs
@@ -37,8 +37,6 @@ namespace Pinta.Core
 		private double opacity;
 		private bool hidden;
 		private string name;
-		private bool tiled;
-		private PointD offset;
 		
 		public Layer () : this (null)
 		{
diff --git a/Pinta.Core/Effects/BaseEffect.cs b/Pinta.Core/Effects/BaseEffect.cs
index 17d3c74..61d74eb 100644
--- a/Pinta.Core/Effects/BaseEffect.cs
+++ b/Pinta.Core/Effects/BaseEffect.cs
@@ -29,7 +29,7 @@ using Cairo;
 using Mono.Unix;
 using Mono.Addins;
 
-[assembly: AddinRoot ("Pinta", "1.2")]
+[assembly: AddinRoot ("Pinta", "1.3")]
 
 namespace Pinta.Core
 {
diff --git a/Pinta.Core/Effects/LocalHistogramEffect.cs b/Pinta.Core/Effects/LocalHistogramEffect.cs
index 2025a7e..30aee59 100644
--- a/Pinta.Core/Effects/LocalHistogramEffect.cs
+++ b/Pinta.Core/Effects/LocalHistogramEffect.cs
@@ -136,7 +136,6 @@ namespace Pinta.Core
             int* hg = stackalloc int[hLength];
             int* hr = stackalloc int[hLength];
             int* ha = stackalloc int[hLength];
-            uint hSize = (uint)(sizeof(int) * hLength);
 
             for (int y = (int)rect.Y; y < rect.Y + rect.Height; y++)
             {
@@ -343,7 +342,6 @@ namespace Pinta.Core
             int* hb = stackalloc int[hLength];
             int* hg = stackalloc int[hLength];
             int* hr = stackalloc int[hLength];
-            uint hSize = (uint)(sizeof(int) * hLength);
 
 			for (int y = (int)rect.Y; y < rect.Y + rect.Height; y++)
             {
diff --git a/Pinta.Core/Extensions/GtkExtensions.cs b/Pinta.Core/Extensions/GtkExtensions.cs
index 8f39415..8623748 100644
--- a/Pinta.Core/Extensions/GtkExtensions.cs
+++ b/Pinta.Core/Extensions/GtkExtensions.cs
@@ -154,34 +154,39 @@ namespace Pinta.Core
 			FileChooserDialog dialog = (FileChooserDialog)sender;
 			Image preview = (Image)dialog.PreviewWidget;
 
+            if (preview.Pixbuf != null)
+            {
+                preview.Pixbuf.Dispose ();
+            }
+
 			try
 			{
-				var pixbuf = new Gdk.Pixbuf (dialog.PreviewFilename);
-
-				if (pixbuf == null)
-				{
-					dialog.PreviewWidgetActive = false;
-					return;
-				}
-
-				// scale down images that are too large, but don't scale up small images
-				if (pixbuf.Width > MaxPreviewWidth || pixbuf.Height > MaxPreviewHeight)
-				{
-					pixbuf = new Gdk.Pixbuf (dialog.PreviewFilename, MaxPreviewWidth, MaxPreviewHeight, true);
-				}
-
-				if (pixbuf != null)
-				{
-					// add padding so that small images don't cause the dialog to shrink
-					preview.Xpad = (MaxPreviewWidth - pixbuf.Width) / 2;
-					preview.Pixbuf = pixbuf;
-					dialog.PreviewWidgetActive = true;
-				}
-				else
-				{
-					dialog.PreviewWidgetActive = false;
-				}
-
+                Gdk.Pixbuf pixbuf = null;
+                int imageWidth, imageHeight;
+                string filename = dialog.PreviewFilename;
+
+                var imageInfo = Gdk.Pixbuf.GetFileInfo (filename, out imageWidth, out imageHeight);
+
+                if (imageInfo == null)
+                {
+                    dialog.PreviewWidgetActive = false;
+                    return;
+                }
+
+                // scale down images that are too large, but don't scale up small images
+                if (imageWidth > MaxPreviewWidth || imageHeight > MaxPreviewHeight)
+                {
+                    pixbuf = new Gdk.Pixbuf (filename, MaxPreviewWidth, MaxPreviewHeight, true);
+                }
+                else
+                {
+                    pixbuf = new Gdk.Pixbuf (filename);
+                }
+
+                // add padding so that small images don't cause the dialog to shrink
+                preview.Xpad = (MaxPreviewWidth - pixbuf.Width) / 2;
+                preview.Pixbuf = pixbuf;
+                dialog.PreviewWidgetActive = true;
 			}
 			catch (GLib.GException)
 			{
diff --git a/Pinta.Core/Managers/SystemManager.cs b/Pinta.Core/Managers/SystemManager.cs
index b969a98..eb15b4b 100644
--- a/Pinta.Core/Managers/SystemManager.cs
+++ b/Pinta.Core/Managers/SystemManager.cs
@@ -86,6 +86,15 @@ namespace Pinta.Core
 		public RecentData RecentData { get { return recent_data; } }
 		#endregion
 
+        /// <summary>
+        /// Returns a directory for use in a dialog. The last dialog directory is
+        /// returned if it exists, otherwise the default directory is used.
+        /// </summary>
+        public string GetDialogDirectory ()
+        {
+            return Directory.Exists (LastDialogDirectory) ? LastDialogDirectory : DefaultDialogDirectory;
+        }
+
 		public string GetExecutablePathName ()
 		{
 			string executablePathName = System.Environment.GetCommandLineArgs ()[0];
diff --git a/Pinta.Core/Managers/WorkspaceManager.cs b/Pinta.Core/Managers/WorkspaceManager.cs
index cc99c3a..d4f790d 100644
--- a/Pinta.Core/Managers/WorkspaceManager.cs
+++ b/Pinta.Core/Managers/WorkspaceManager.cs
@@ -255,7 +255,7 @@ namespace Pinta.Core
 		{
 			// Work around a case where we closed a document but haven't updated
 			// the active_document_index yet and it points to the closed document
-			if (HasOpenDocuments && OpenDocuments.Count > active_document_index)
+			if (HasOpenDocuments && active_document_index != -1 && OpenDocuments.Count > active_document_index)
 				PintaCore.Tools.Commit ();
 
 			int index = OpenDocuments.IndexOf (document);
diff --git a/Pinta.Core/Properties/AssemblyInfo.cs b/Pinta.Core/Properties/AssemblyInfo.cs
index 45e0f19..6e148ea 100644
--- a/Pinta.Core/Properties/AssemblyInfo.cs
+++ b/Pinta.Core/Properties/AssemblyInfo.cs
@@ -17,7 +17,7 @@ using System.Runtime.CompilerServices;
 // The form "{Major}.{Minor}.*" will automatically update the build and revision,
 // and "{Major}.{Minor}.{Build}.*" will update just the revision.
 
-[assembly: AssemblyVersion("1.2.0.0")]
+[assembly: AssemblyVersion("1.3.0.0")]
 
 // The following attributes are used to specify the signing key for the assembly, 
 // if desired. See the Mono documentation for more information about signing.
diff --git a/Pinta.Effects/Properties/AssemblyInfo.cs b/Pinta.Effects/Properties/AssemblyInfo.cs
index bcb49a9..6dc71a1 100644
--- a/Pinta.Effects/Properties/AssemblyInfo.cs
+++ b/Pinta.Effects/Properties/AssemblyInfo.cs
@@ -33,10 +33,10 @@ using Mono.Addins;
 // You can specify all the values or you can default the Build and Revision Numbers 
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion ("1.2.0.0")]
-[assembly: AssemblyFileVersion ("1.2.0.0")]
+[assembly: AssemblyVersion ("1.3.0.0")]
+[assembly: AssemblyFileVersion ("1.3.0.0")]
 
-[assembly: Addin ("DefaultEffects", "1.2", Category = "Core")]
+[assembly: Addin ("DefaultEffects", "1.3", Category = "Core")]
 [assembly: AddinName ("Default Effects")]
 [assembly: AddinDescription ("The default adjustments and effects that ship with Pinta")]
-[assembly: AddinDependency ("Pinta", "1.2")]
+[assembly: AddinDependency ("Pinta", "1.3")]
diff --git a/Pinta.Gui.Widgets/Properties/AssemblyInfo.cs b/Pinta.Gui.Widgets/Properties/AssemblyInfo.cs
index 41b935e..e505ffe 100644
--- a/Pinta.Gui.Widgets/Properties/AssemblyInfo.cs
+++ b/Pinta.Gui.Widgets/Properties/AssemblyInfo.cs
@@ -42,7 +42,7 @@ using System.Runtime.CompilerServices;
 // The form "{Major}.{Minor}.*" will automatically update the build and revision,
 // and "{Major}.{Minor}.{Build}.*" will update just the revision.
 
-[assembly: AssemblyVersion("1.2.0.0")]
+[assembly: AssemblyVersion("1.3.0.0")]
 
 // The following attributes are used to specify the signing key for the assembly, 
 // if desired. See the Mono documentation for more information about signing.
diff --git a/Pinta.Gui.Widgets/Widgets/ColorPaletteWidget.cs b/Pinta.Gui.Widgets/Widgets/ColorPaletteWidget.cs
index 61c516b..cdf343c 100644
--- a/Pinta.Gui.Widgets/Widgets/ColorPaletteWidget.cs
+++ b/Pinta.Gui.Widgets/Widgets/ColorPaletteWidget.cs
@@ -59,7 +59,12 @@ namespace Pinta.Gui.Widgets
 		
 		private void Palette_ColorChanged (object sender, EventArgs e)
 		{
-			GdkWindow.Invalidate ();
+			// Color change events may be received while the widget is minimized,
+			// so we only call Invalidate() if the widget is shown.
+			if (IsRealized)
+			{
+				GdkWindow.Invalidate ();
+			}
 		}
 
 		protected override bool OnButtonPressEvent (Gdk.EventButton ev)
diff --git a/Pinta.Gui.Widgets/Widgets/Layers/LayersListWidget.cs b/Pinta.Gui.Widgets/Widgets/Layers/LayersListWidget.cs
index 0bc7e01..7ac25c9 100644
--- a/Pinta.Gui.Widgets/Widgets/Layers/LayersListWidget.cs
+++ b/Pinta.Gui.Widgets/Widgets/Layers/LayersListWidget.cs
@@ -26,11 +26,12 @@
 // THE SOFTWARE.
 
 using System;
+using System.Collections.Generic;
+using System.ComponentModel;
 using System.Linq;
-using Pinta.Core;
 using Gtk;
-using System.ComponentModel;
-using System.Collections.Generic;
+using Mono.Unix;
+using Pinta.Core;
 
 namespace Pinta.Gui.Widgets
 {
@@ -207,10 +208,10 @@ namespace Pinta.Gui.Widgets
 			
 			var initial = new LayerProperties(layer.Name, visibility, layer.Opacity);
 			var updated = new LayerProperties(layer.Name, !visibility, layer.Opacity);
-			
+
 			var historyItem = new UpdateLayerPropertiesHistoryItem (
 				"Menu.Layers.LayerProperties.png",
-				(visibility) ? "Layer Shown" : "Layer Hidden",
+				(visibility) ? Catalog.GetString ("Layer Shown") : Catalog.GetString ("Layer Hidden"),
 				PintaCore.Layers.IndexOf (layer),
 				initial,
 				updated);
diff --git a/Pinta.Gui.Widgets/Widgets/OpenImages/OpenImagesListWidget.cs b/Pinta.Gui.Widgets/Widgets/OpenImages/OpenImagesListWidget.cs
index 90304db..89ec675 100644
--- a/Pinta.Gui.Widgets/Widgets/OpenImages/OpenImagesListWidget.cs
+++ b/Pinta.Gui.Widgets/Widgets/OpenImages/OpenImagesListWidget.cs
@@ -45,6 +45,10 @@ namespace Pinta.Gui.Widgets
 		private const int PreviewColumnWidth = 70;
 		private const int CloseColumnWidth = 30;
 
+		private const int FilePreviewColumnIndex = 0;
+		private const int FileNameColumnIndex = 1;
+		private const int FileCloseColumnIndex = 2;
+
 		private Gdk.Pixbuf close_icon = PintaCore.Resources.GetIcon (Stock.Close);
 
 		public OpenImagesListWidget ()
@@ -60,17 +64,17 @@ namespace Pinta.Gui.Widgets
 			tree.Selection.SelectFunction = HandleDocumentSelected;
 
 			var file_preview_cell = new CellRendererSurface (PreviewWidth, PreviewHeight);
-			file_preview_column = new TreeViewColumn ("File Preview", file_preview_cell, "surface", 0);
+			file_preview_column = new TreeViewColumn ("File Preview", file_preview_cell, "surface", FilePreviewColumnIndex);
 			file_preview_column.Sizing = TreeViewColumnSizing.Fixed;
 			file_preview_column.FixedWidth = PreviewColumnWidth;
 			tree.AppendColumn (file_preview_column);
 
-			file_name_column = new TreeViewColumn ("File Name", new CellRendererText (), "text", 1);
+			file_name_column = new TreeViewColumn ("File Name", new CellRendererText (), "text", FileNameColumnIndex);
 			file_name_column.Expand = true;
 			tree.AppendColumn (file_name_column);
 
 			file_close_cell = new CellRendererPixbuf ();
-			file_close_column = new TreeViewColumn ("Close File", file_close_cell, "pixbuf", 2);
+			file_close_column = new TreeViewColumn ("Close File", file_close_cell, "pixbuf", FileCloseColumnIndex);
 			file_close_column.Sizing = TreeViewColumnSizing.Fixed;
 			file_close_column.FixedWidth = CloseColumnWidth;
 			tree.AppendColumn (file_close_column);
@@ -93,10 +97,24 @@ namespace Pinta.Gui.Widgets
 			PintaCore.History.ActionUndone += HandleDocumentModified;
 		}
 
+		/// <summary>
+		/// Update the preview image for a modified document.
+		/// </summary>
 		void HandleDocumentModified (object sender, EventArgs e)
 		{
-			RebuildDocumentList ();
-			UpdateSelectedDocument ();
+			int docIndex = PintaCore.Workspace.ActiveDocumentIndex;
+
+			if (docIndex != -1)
+			{
+				TreeIter iter;
+				if (store.GetIter (out iter, new TreePath (new int[] { docIndex })))
+				{
+					var surface = (Cairo.ImageSurface)store.GetValue (iter, FilePreviewColumnIndex);
+					(surface as IDisposable).Dispose ();
+
+					store.SetValue (iter, FilePreviewColumnIndex, PintaCore.Workspace.ActiveDocument.GetFlattenedImage ());
+				}
+			}
 		}
 
 		/// <summary>
@@ -149,8 +167,15 @@ namespace Pinta.Gui.Widgets
 
 		private void RebuildDocumentList ()
 		{
+			// Ensure that the old image previews are disposed.
+			foreach (object[] row in store)
+			{
+				var imageSurface = (Cairo.ImageSurface)row[FilePreviewColumnIndex];
+				(imageSurface as IDisposable).Dispose ();
+			}
+
 			store.Clear ();
-			
+
 			foreach (Document doc in PintaCore.Workspace.OpenDocuments)
 			{
 				doc.Renamed -= HandleDocRenamed;
diff --git a/Pinta.Resources/Pinta.Resources.csproj b/Pinta.Resources/Pinta.Resources.csproj
index 15fe5ef..2d6d75d 100644
--- a/Pinta.Resources/Pinta.Resources.csproj
+++ b/Pinta.Resources/Pinta.Resources.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"; ToolsVersion="4.0">
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -519,8 +519,8 @@
     <EmbeddedResource Include="Resources\Pinta-32.png">
       <LogicalName>Pinta-32.png</LogicalName>
     </EmbeddedResource>
-    <EmbeddedResource Include="Resources\Menu.Help.Extensions.png">
-      <LogicalName>Menu.Help.Extensions.png</LogicalName>
+    <EmbeddedResource Include="Resources\Menu.Edit.Addins.png">
+      <LogicalName>Menu.Edit.Addins.png</LogicalName>
     </EmbeddedResource>
     <EmbeddedResource Include="Resources\TextTool.FillBackground.png">
       <LogicalName>TextTool.FillBackground.png</LogicalName>
diff --git a/Pinta.Resources/Properties/AssemblyInfo.cs b/Pinta.Resources/Properties/AssemblyInfo.cs
index 05ada99..09f3d0c 100644
--- a/Pinta.Resources/Properties/AssemblyInfo.cs
+++ b/Pinta.Resources/Properties/AssemblyInfo.cs
@@ -17,7 +17,7 @@ using System.Runtime.CompilerServices;
 // The form "{Major}.{Minor}.*" will automatically update the build and revision,
 // and "{Major}.{Minor}.{Build}.*" will update just the revision.
 
-[assembly: AssemblyVersion("1.2.0.0")]
+[assembly: AssemblyVersion("1.3.0.0")]
 
 // The following attributes are used to specify the signing key for the assembly, 
 // if desired. See the Mono documentation for more information about signing.
diff --git a/Pinta.Resources/ResourceManager.cs b/Pinta.Resources/ResourceManager.cs
index 5768bc7..f3cf00e 100644
--- a/Pinta.Resources/ResourceManager.cs
+++ b/Pinta.Resources/ResourceManager.cs
@@ -33,12 +33,45 @@ namespace Pinta.Resources
 	{
 		public static Pixbuf GetIcon (string name, int size)
 		{
-			// First see if it's a built-in gtk icon, like gtk-new
-			if (Gtk.IconTheme.Default.HasIcon (name))
-				return Gtk.IconTheme.Default.LoadIcon (name, size, Gtk.IconLookupFlags.UseBuiltin);
+			try {
+				// First see if it's a built-in gtk icon, like gtk-new
+				if (Gtk.IconTheme.Default.HasIcon (name))
+					return Gtk.IconTheme.Default.LoadIcon (name, size, Gtk.IconLookupFlags.UseBuiltin);
 
-			// Get it from our embedded resources
-			return Gdk.Pixbuf.LoadFromResource (name);
+				// Otherwise, get it from our embedded resources.
+				return Gdk.Pixbuf.LoadFromResource (name);
+			}
+			catch (Exception ex) {
+				// Ensure that we don't crash if an icon is missing for some reason.
+				System.Console.Error.WriteLine (ex.Message);
+
+				// Try to return gtk's default missing image
+				if (name != Gtk.Stock.MissingImage)
+					return GetIcon (Gtk.Stock.MissingImage, size);
+
+				// If gtk is missing it's "missing image", we'll create one on the fly
+				return CreateMissingImage (size);
+			}
+		}
+
+		// From MonoDevelop:
+		// https://github.com/mono/monodevelop/blob/master/main/src/core/MonoDevelop.Ide/gtk-gui/generated.cs
+		private static Pixbuf CreateMissingImage (int size)
+		{
+			var pmap = new Gdk.Pixmap (Gdk.Screen.Default.RootWindow, size, size);
+			var gc = new Gdk.GC (pmap);
+
+			gc.RgbFgColor = new Gdk.Color (255, 255, 255);
+			pmap.DrawRectangle (gc, true, 0, 0, size, size);
+			gc.RgbFgColor = new Gdk.Color (0, 0, 0);
+			pmap.DrawRectangle (gc, false, 0, 0, (size - 1), (size - 1));
+
+			gc.SetLineAttributes (3, Gdk.LineStyle.Solid, Gdk.CapStyle.Round, Gdk.JoinStyle.Round);
+			gc.RgbFgColor = new Gdk.Color (255, 0, 0);
+			pmap.DrawLine (gc, (size / 4), (size / 4), ((size - 1) - (size / 4)), ((size - 1) - (size / 4)));
+			pmap.DrawLine (gc, ((size - 1) - (size / 4)), (size / 4), (size / 4), ((size - 1) - (size / 4)));
+
+			return Gdk.Pixbuf.FromDrawable (pmap, pmap.Colormap, 0, 0, 0, 0, size, size);
 		}
 	}
 }
diff --git a/Pinta.Resources/Resources/Menu.Edit.Addins.png b/Pinta.Resources/Resources/Menu.Edit.Addins.png
new file mode 100644
index 0000000..0905f93
Binary files /dev/null and b/Pinta.Resources/Resources/Menu.Edit.Addins.png differ
diff --git a/Pinta.Resources/Resources/Menu.Help.Extensions.png b/Pinta.Resources/Resources/Menu.Help.Extensions.png
deleted file mode 100644
index 0905f93..0000000
Binary files a/Pinta.Resources/Resources/Menu.Help.Extensions.png and /dev/null differ
diff --git a/Pinta.Tools/Properties/AssemblyInfo.cs b/Pinta.Tools/Properties/AssemblyInfo.cs
index c0f379d..902d55b 100644
--- a/Pinta.Tools/Properties/AssemblyInfo.cs
+++ b/Pinta.Tools/Properties/AssemblyInfo.cs
@@ -33,10 +33,10 @@ using Mono.Addins;
 // You can specify all the values or you can default the Build and Revision Numbers 
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion ("1.2.0.0")]
-[assembly: AssemblyFileVersion ("1.2.0.0")]
+[assembly: AssemblyVersion ("1.3.0.0")]
+[assembly: AssemblyFileVersion ("1.3.0.0")]
 
-[assembly: Addin ("DefaultTools", "1.2", Category = "Core")]
+[assembly: Addin ("DefaultTools", "1.3", Category = "Core")]
 [assembly: AddinName ("Default Tools")]
 [assembly: AddinDescription ("The default tools and brushes that ship with Pinta")]
-[assembly: AddinDependency ("Pinta", "1.2")]
+[assembly: AddinDependency ("Pinta", "1.3")]
diff --git a/Pinta.Tools/Tools/FloodTool.cs b/Pinta.Tools/Tools/FloodTool.cs
index 8cb7e3c..cbccd6e 100644
--- a/Pinta.Tools/Tools/FloodTool.cs
+++ b/Pinta.Tools/Tools/FloodTool.cs
@@ -35,6 +35,7 @@
 // THE SOFTWARE.
 
 using System;
+using System.Threading.Tasks;
 using Cairo;
 using System.Collections.Generic;
 using Pinta.Core;
@@ -212,7 +213,8 @@ namespace Pinta.Tools
 					--localLeft;
 				}
 
-				while (localRight < surface.Width &&
+                int surfaceWidth = surface.Width;
+				while (localRight < surfaceWidth &&
 				       !stencil.GetUnchecked (localRight, pt.Y) &&
 				       CheckColor (cmp, rowPtr[localRight], tolerance)) {
 					stencil.SetUnchecked (localRight, pt.Y, true);
@@ -222,18 +224,19 @@ namespace Pinta.Tools
 				++localLeft;
 				--localRight;
 
-				if (pt.Y > 0) {
+                Action<int> checkRow = (row) =>
+                {
 					int sleft = localLeft;
 					int sright = localLeft;
-					ColorBgra* rowPtrUp = surface.GetRowAddressUnchecked (pt.Y - 1);
+					ColorBgra* otherRowPtr = surface.GetRowAddressUnchecked (row);
 
 					for (int sx = localLeft; sx <= localRight; ++sx) {
-						if (!stencil.GetUnchecked (sx, pt.Y - 1) &&
-						    CheckColor (cmp, rowPtrUp[sx], tolerance)) {
+						if (!stencil.GetUnchecked (sx, row) &&
+						    CheckColor (cmp, otherRowPtr[sx], tolerance)) {
 							++sright;
 						} else {
 							if (sright - sleft > 0) {
-								queue.Enqueue (new Point (sleft, pt.Y - 1));
+								queue.Enqueue (new Point (sleft, row));
 							}
 
 							++sright;
@@ -242,32 +245,16 @@ namespace Pinta.Tools
 					}
 
 					if (sright - sleft > 0) {
-						queue.Enqueue (new Point (sleft, pt.Y - 1));
+						queue.Enqueue (new Point (sleft, row));
 					}
+                };
+
+				if (pt.Y > 0) {
+                    checkRow (pt.Y - 1);
 				}
 
 				if (pt.Y < surface.Height - 1) {
-					int sleft = localLeft;
-					int sright = localLeft;
-					ColorBgra* rowPtrDown = surface.GetRowAddressUnchecked (pt.Y + 1);
-
-					for (int sx = localLeft; sx <= localRight; ++sx) {
-						if (!stencil.GetUnchecked (sx, pt.Y + 1) &&
-						    CheckColor (cmp, rowPtrDown[sx], tolerance)) {
-							++sright;
-						} else {
-							if (sright - sleft > 0) {
-								queue.Enqueue (new Point (sleft, pt.Y + 1));
-							}
-
-							++sright;
-							sleft = sright;
-						}
-					}
-
-					if (sright - sleft > 0) {
-						queue.Enqueue (new Point (sleft, pt.Y + 1));
-					}
+                    checkRow (pt.Y + 1);
 				}
 
 				if (localLeft < left) {
@@ -315,39 +302,48 @@ namespace Pinta.Tools
 
 			foreach (Gdk.Rectangle rect in scans)
 				stencil.Set (rect, true);
-			
-			for (int y = 0; y < surface.Height; ++y) {
-				bool foundPixelInRow = false;
-				ColorBgra* ptr = surface.GetRowAddressUnchecked (y);
 
-				for (int x = 0; x < surface.Width; ++x) {
-					if (CheckColor (cmp, *ptr, tolerance)) {
-						stencil.SetUnchecked (x, y, true);
-
-						if (x < left) {
-							left = x;
-						}
-
-						if (x > right) {
-							right = x;
-						}
-
-						foundPixelInRow = true;
-					}
-
-					++ptr;
-				}
-
-				if (foundPixelInRow) {
-					if (y < top) {
-						top = y;
-					}
-
-					if (y >= bottom) {
-						bottom = y;
-					}
-				}
-			}
+            Parallel.For(0, surface.Height, y =>
+            {
+                bool foundPixelInRow = false;
+                ColorBgra* ptr = surface.GetRowAddressUnchecked(y);
+
+                int surfaceWidth = surface.Width;
+                for (int x = 0; x < surfaceWidth; ++x)
+                {
+                    if (CheckColor(cmp, *ptr, tolerance))
+                    {
+                        stencil.SetUnchecked(x, y, true);
+
+                        if (x < left)
+                        {
+                            left = x;
+                        }
+
+                        if (x > right)
+                        {
+                            right = x;
+                        }
+
+                        foundPixelInRow = true;
+                    }
+
+                    ++ptr;
+                }
+
+                if (foundPixelInRow)
+                {
+                    if (y < top)
+                    {
+                        top = y;
+                    }
+
+                    if (y >= bottom)
+                    {
+                        bottom = y;
+                    }
+                }
+            });
 
 			foreach (Gdk.Rectangle rect in scans)
 				stencil.Set (rect, false);
diff --git a/Pinta.Tools/Tools/PaintBucketTool.cs b/Pinta.Tools/Tools/PaintBucketTool.cs
index 6e0bb75..f58b1c9 100644
--- a/Pinta.Tools/Tools/PaintBucketTool.cs
+++ b/Pinta.Tools/Tools/PaintBucketTool.cs
@@ -25,6 +25,7 @@
 // THE SOFTWARE.
 
 using System;
+using System.Threading.Tasks;
 using Cairo;
 using Pinta.Core;
 using Mono.Unix;
@@ -82,10 +83,12 @@ namespace Pinta.Tools
 			surf.Flush ();
 
 			// Color in any pixel that the stencil says we need to fill
-			for (int x = 0; x < stencil.Width; x++)
+			Parallel.For (0, stencil.Width, x =>
+			{
 				for (int y = 0; y < stencil.Height; y++)
 					if (stencil.GetUnchecked (x, y))
 						surf.SetColorBgra (dstPtr, width, color, x, y);
+			});
 
 			surf.MarkDirty ();
 
@@ -97,6 +100,8 @@ namespace Pinta.Tools
 				g.Paint ();
 			}
 
+			doc.ToolLayer.Clear ();
+
 			doc.History.PushNewItem (hist); 
 			doc.Workspace.Invalidate ();
 		}
diff --git a/Pinta.Tools/Tools/RoundedRectangleTool.cs b/Pinta.Tools/Tools/RoundedRectangleTool.cs
index 1c4b7be..f9db245 100644
--- a/Pinta.Tools/Tools/RoundedRectangleTool.cs
+++ b/Pinta.Tools/Tools/RoundedRectangleTool.cs
@@ -46,7 +46,7 @@ namespace Pinta.Tools
 			get { return "Tools.RoundedRectangle.png"; }
 		}
 		public override string StatusBarText {
-			get { return Catalog.GetString ("Click and drag to draw a rounded rectangle (right click for secondary color). Hold shift to constrain."); }
+			get { return Catalog.GetString ("Click and drag to draw a rounded rectangle (right click for secondary color). Hold shift to constrain to a square."); }
 		}
 		public override Gdk.Cursor DefaultCursor {
 			get { return new Gdk.Cursor (PintaCore.Chrome.Canvas.Display, PintaCore.Resources.GetIcon ("Cursor.RoundedRectangle.png"), 5, 9); }
diff --git a/Pinta.Tools/Tools/SelectTool.cs b/Pinta.Tools/Tools/SelectTool.cs
index fbbbd12..73ac54e 100644
--- a/Pinta.Tools/Tools/SelectTool.cs
+++ b/Pinta.Tools/Tools/SelectTool.cs
@@ -35,7 +35,6 @@ namespace Pinta.Tools
 	{
 		private PointD reset_origin;
 		private PointD shape_end;
-		private int cornerTolerance = 3;
 		private ToolControl [] controls = new ToolControl [8];
 		protected SelectionHistoryItem hist;
 		public override Gdk.Key ShortcutKey { get { return Gdk.Key.S; } }
diff --git a/Pinta.Tools/Tools/TextTool/TextTool.cs b/Pinta.Tools/Tools/TextTool/TextTool.cs
index 4076b30..5a00fec 100644
--- a/Pinta.Tools/Tools/TextTool/TextTool.cs
+++ b/Pinta.Tools/Tools/TextTool/TextTool.cs
@@ -50,6 +50,16 @@ namespace Pinta.Tools
 			cursor_hand = new Gdk.Cursor (PintaCore.Chrome.Canvas.Display, PintaCore.Resources.GetIcon ("Tools.Pan.png"), 0, 0);
 			engine = new TextEngine ();
 		}
+
+        static TextTool ()
+        {
+            Gtk.IconFactory fact = new Gtk.IconFactory ();
+            fact.Add ("ShapeTool.Outline.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("ShapeTool.Outline.png")));
+            fact.Add ("ShapeTool.Fill.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("ShapeTool.Fill.png")));
+            fact.Add ("ShapeTool.OutlineFill.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("ShapeTool.OutlineFill.png")));
+            fact.Add ("TextTool.FillBackground.png", new Gtk.IconSet (PintaCore.Resources.GetIcon ("TextTool.FillBackground.png")));
+            fact.AddDefault ();
+        }
 		#endregion
 
 		#region ToolBar
@@ -595,6 +605,11 @@ namespace Pinta.Tools
 					RedrawText (true, true);
 
 			}
+            else
+            {
+                // If we're not editing, allow the key press to be handled elsewhere (e.g. for selecting another tool).
+                keyHandled = false;
+            }
 
 			args.RetVal = keyHandled;
 		}
diff --git a/Pinta/Actions/Edit/AddinManagerAction.cs b/Pinta/Actions/Edit/AddinManagerAction.cs
new file mode 100644
index 0000000..171076a
--- /dev/null
+++ b/Pinta/Actions/Edit/AddinManagerAction.cs
@@ -0,0 +1,56 @@
+// 
+// AboutDialogAction.cs
+//  
+// Author:
+//       Jonathan Pobst <monkey@jpobst.com>
+// 
+// Copyright (c) 2010 Jonathan Pobst
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using Mono.Addins.Gui;
+using Pinta.Core;
+
+namespace Pinta.Actions
+{
+	class AddinManagerAction : IActionHandler
+	{
+		#region IActionHandler Members
+		public void Initialize ()
+		{
+			PintaCore.Actions.Edit.AddinManager.Activated += Activated;
+		}
+
+		public void Uninitialize ()
+		{
+			PintaCore.Actions.Edit.AddinManager.Activated -= Activated;
+		}
+		#endregion
+
+		private void Activated (object sender, EventArgs e)
+		{
+			AddinManagerWindow.AllowInstall = false;
+
+			AddinManagerWindow.Run (PintaCore.Chrome.MainWindow);
+
+			//dlg.DeleteEvent += delegate { dlg.Destroy (); };
+		}
+	}
+}
diff --git a/Pinta/Actions/Edit/PasteAction.cs b/Pinta/Actions/Edit/PasteAction.cs
new file mode 100644
index 0000000..e4b9afd
--- /dev/null
+++ b/Pinta/Actions/Edit/PasteAction.cs
@@ -0,0 +1,129 @@
+// 
+// PasteAction.cs
+//  
+// Author:
+//       Jonathan Pobst <monkey@jpobst.com>, Cameron White <cameronwhite91@gmail.com>
+// 
+// Copyright (c) 2012 Jonathan Pobst, Cameron White
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using Cairo;
+using Gtk;
+using Mono.Unix;
+using Pinta.Core;
+
+namespace Pinta.Actions
+{
+	class PasteAction : IActionHandler
+	{
+		private const string markup = "<span weight=\"bold\" size=\"larger\">{0}</span>\n\n{1}";
+
+		#region IActionHandler Members
+		public void Initialize ()
+		{
+			PintaCore.Actions.Edit.Paste.Activated += Activated;
+		}
+
+		public void Uninitialize ()
+		{
+			PintaCore.Actions.Edit.Paste.Activated -= Activated;
+		}
+		#endregion
+
+		private void Activated (object sender, EventArgs e)
+		{
+			Document doc = PintaCore.Workspace.ActiveDocument;
+
+			PintaCore.Tools.Commit ();
+
+			Gtk.Clipboard cb = Gtk.Clipboard.Get (Gdk.Atom.Intern ("CLIPBOARD", false));
+
+			Path p;
+
+			// Don't dispose this, as we're going to give it to the history
+			Gdk.Pixbuf image = cb.WaitForImage ();
+
+			if (image == null)
+			{
+				Dialogs.ClipboardEmptyDialog.Show ();
+				return;
+			}
+
+			Gdk.Size canvas_size = PintaCore.Workspace.ImageSize;
+
+			// If the image being pasted is larger than the canvas size, allow the user to optionally resize the canvas
+			if (image.Width > canvas_size.Width || image.Height > canvas_size.Height)
+			{
+				ResponseType response = ShowExpandCanvasDialog ();
+
+				if (response == ResponseType.Accept)
+				{
+					PintaCore.Workspace.ResizeCanvas (image.Width, image.Height, Pinta.Core.Anchor.Center);
+					PintaCore.Actions.View.UpdateCanvasScale ();
+				}
+				else if (response == ResponseType.Cancel || response == ResponseType.DeleteEvent)
+				{
+					return;
+				}
+			}
+
+			// Copy the paste to the temp layer
+			doc.CreateSelectionLayer ();
+			doc.ShowSelectionLayer = true;
+
+			using (Cairo.Context g = new Cairo.Context (doc.SelectionLayer.Surface))
+			{
+				g.DrawPixbuf (image, new Cairo.Point (0, 0));
+				p = g.CreateRectanglePath (new Rectangle (0, 0, image.Width, image.Height));
+			}
+
+			PintaCore.Tools.SetCurrentTool (Catalog.GetString ("Move Selected Pixels"));
+
+			Path old_path = doc.SelectionPath;
+			bool old_show_selection = doc.ShowSelection;
+
+			doc.SelectionPath = p;
+			doc.ShowSelection = true;
+
+			doc.Workspace.Invalidate ();
+
+			doc.History.PushNewItem (new PasteHistoryItem (image, old_path, old_show_selection));
+		}
+
+		private ResponseType ShowExpandCanvasDialog ()
+		{
+			string primary = Catalog.GetString ("Image larger than canvas");
+			string secondary = Catalog.GetString ("The image being pasted is larger than the canvas size. What would you like to do?");
+			string message = string.Format (markup, primary, secondary);
+
+			var enlarge_dialog = new MessageDialog (PintaCore.Chrome.MainWindow, DialogFlags.Modal, MessageType.Question, ButtonsType.None, message);
+			enlarge_dialog.AddButton (Catalog.GetString ("Expand canvas"), ResponseType.Accept);
+			enlarge_dialog.AddButton (Catalog.GetString ("Don't change canvas size"), ResponseType.Reject);
+			enlarge_dialog.AddButton (Stock.Cancel, ResponseType.Cancel);
+			enlarge_dialog.DefaultResponse = ResponseType.Accept;
+
+			ResponseType response = (ResponseType)enlarge_dialog.Run ();
+			enlarge_dialog.Destroy ();
+
+			return response;
+		}
+	}
+}
diff --git a/Pinta/Actions/Edit/PasteIntoNewImageAction.cs b/Pinta/Actions/Edit/PasteIntoNewImageAction.cs
index f2a695d..1a27b4c 100644
--- a/Pinta/Actions/Edit/PasteIntoNewImageAction.cs
+++ b/Pinta/Actions/Edit/PasteIntoNewImageAction.cs
@@ -57,25 +57,8 @@ namespace Pinta.Actions
 				PintaCore.Actions.Edit.Paste.Activate ();
 				PintaCore.Actions.Edit.Deselect.Activate ();
 			} else {
-				ClipboardEmptyError ();
+				Pinta.Dialogs.ClipboardEmptyDialog.Show ();
 			}
 		}
-
-		private void ClipboardEmptyError ()
-		{
-			var primary = Catalog.GetString ("Paste cancelled");
-			var secondary = Catalog.GetString ("The clipboard does not contain an image");
-			var markup = "<span weight=\"bold\" size=\"larger\">{0}</span>\n\n{1}\n";
-			markup = string.Format (markup, primary, secondary);
-
-			var md = new MessageDialog (PintaCore.Chrome.MainWindow, DialogFlags.Modal,
-						    MessageType.Error, ButtonsType.None, true,
-						    markup);
-
-			md.AddButton (Stock.Ok, ResponseType.Yes);
-
-			md.Run ();
-			md.Destroy ();
-		}
 	}
 }
diff --git a/Pinta/Actions/Edit/PasteIntoNewLayerAction.cs b/Pinta/Actions/Edit/PasteIntoNewLayerAction.cs
index 1222e1d..fe3093d 100644
--- a/Pinta/Actions/Edit/PasteIntoNewLayerAction.cs
+++ b/Pinta/Actions/Edit/PasteIntoNewLayerAction.cs
@@ -67,25 +67,8 @@ namespace Pinta.Actions
 				AddLayerHistoryItem hist = new AddLayerHistoryItem (Stock.Paste, Catalog.GetString ("Paste Into New Layer"), PintaCore.Layers.IndexOf (l));
 				PintaCore.History.PushNewItem (hist);
 			} else {
-				ClipboardEmptyError ();
+				Pinta.Dialogs.ClipboardEmptyDialog.Show ();
 			}
 		}
-
-		private void ClipboardEmptyError ()
-		{
-			var primary = Catalog.GetString ("Paste cancelled");
-			var secondary = Catalog.GetString ("The clipboard does not contain an image");
-			var markup = "<span weight=\"bold\" size=\"larger\">{0}</span>\n\n{1}\n";
-			markup = string.Format (markup, primary, secondary);
-
-			var md = new MessageDialog (PintaCore.Chrome.MainWindow, DialogFlags.Modal,
-						    MessageType.Error, ButtonsType.None, true,
-						    markup);
-
-			md.AddButton (Stock.Ok, ResponseType.Yes);
-
-			md.Run ();
-			md.Destroy ();
-		}
 	}
 }
diff --git a/Pinta/Actions/File/NewDocumentAction.cs b/Pinta/Actions/File/NewDocumentAction.cs
index aa73407..363c9a1 100644
--- a/Pinta/Actions/File/NewDocumentAction.cs
+++ b/Pinta/Actions/File/NewDocumentAction.cs
@@ -47,12 +47,8 @@ namespace Pinta.Actions
 		{
 			NewImageDialog dialog = new NewImageDialog ();
 
-			Gtk.Clipboard cb = Gtk.Clipboard.Get (Gdk.Atom.Intern ("CLIPBOARD", false));
-			if (cb.WaitIsImageAvailable ()) {
-				Gdk.Pixbuf image = cb.WaitForImage ();
-				dialog.NewImageWidth = image.Width;
-				dialog.NewImageHeight = image.Height;
-			} else {
+			if (!TryUseClipboardImageSize (dialog))
+			{
 				dialog.NewImageWidth = PintaCore.Settings.GetSetting<int> ("new-image-width", 800);
 				dialog.NewImageHeight = PintaCore.Settings.GetSetting<int> ("new-image-height", 600);
 			}
@@ -71,5 +67,31 @@ namespace Pinta.Actions
 
 			dialog.Destroy ();
 		}
+
+		/// <summary>
+		/// Sets the dialog to use the clipboard image's dimensions, if possible.
+		/// </summary>
+		/// <returns>True if an image was on the clipboard, false otherwise.</returns>
+		private static bool TryUseClipboardImageSize (NewImageDialog dialog)
+		{
+			bool clipboardUsed = false;
+
+			Gtk.Clipboard cb = Gtk.Clipboard.Get (Gdk.Atom.Intern ("CLIPBOARD", false));
+			if (cb.WaitIsImageAvailable ())
+			{
+				Gdk.Pixbuf image = cb.WaitForImage ();
+				if (image != null)
+				{
+					clipboardUsed = true;
+					dialog.NewImageWidth = image.Width;
+					dialog.NewImageHeight = image.Height;
+					image.Dispose ();
+				}
+			}
+
+			cb.Dispose ();
+
+			return clipboardUsed;
+		}
 	}
 }
diff --git a/Pinta/Actions/File/OpenDocumentAction.cs b/Pinta/Actions/File/OpenDocumentAction.cs
index 414663e..a701291 100644
--- a/Pinta/Actions/File/OpenDocumentAction.cs
+++ b/Pinta/Actions/File/OpenDocumentAction.cs
@@ -53,8 +53,14 @@ namespace Pinta.Actions
 
 			// Add image files filter
 			FileFilter ff = new FileFilter ();
-			ff.AddPixbufFormats ();
-			ff.AddPattern ("*.ora");
+            foreach (var format in PintaCore.System.ImageFormats.Formats)
+            {
+                foreach (var ext in format.Extensions)
+                {
+                    ff.AddPattern (string.Format("*.{0}", ext));
+                }
+            }
+
 			ff.Name = Catalog.GetString ("Image files");
 			fcd.AddFilter (ff);
 
@@ -64,7 +70,7 @@ namespace Pinta.Actions
 			fcd.AddFilter (ff2);
 
 			fcd.AlternativeButtonOrder = new int[] { (int)ResponseType.Ok, (int)ResponseType.Cancel };
-			fcd.SetCurrentFolder (PintaCore.System.LastDialogDirectory);
+            fcd.SetCurrentFolder (PintaCore.System.GetDialogDirectory ());
 			fcd.SelectMultiple = true;
 
 			fcd.AddImagePreview ();
diff --git a/Pinta/Actions/File/SaveDocumentImplementationAction.cs b/Pinta/Actions/File/SaveDocumentImplementationAction.cs
index 031fab3..90c5dd8 100644
--- a/Pinta/Actions/File/SaveDocumentImplementationAction.cs
+++ b/Pinta/Actions/File/SaveDocumentImplementationAction.cs
@@ -80,7 +80,7 @@ namespace Pinta.Actions
 									       Gtk.Stock.Save, Gtk.ResponseType.Ok);
 
 			fcd.DoOverwriteConfirmation = true;
-			fcd.SetCurrentFolder (PintaCore.System.LastDialogDirectory);
+            fcd.SetCurrentFolder (PintaCore.System.GetDialogDirectory ());
 			fcd.AlternativeButtonOrder = new int[] { (int)ResponseType.Ok, (int)ResponseType.Cancel };
 
 			bool hasFile = document.HasFile;
@@ -201,7 +201,24 @@ namespace Pinta.Actions
 			// Commit any pending changes
 			PintaCore.Tools.Commit ();
 
-			format.Exporter.Export (document, file);
+			try {
+				format.Exporter.Export (document, file);
+			} catch (GLib.GException e) { // Errors from GDK
+				if (e.Message == "Image too large to be saved as ICO") {
+					string primary = Catalog.GetString ("Image too large");
+					string secondary = Catalog.GetString ("ICO files can not be larger than 255 x 255 pixels.");
+					string message = string.Format (markup, primary, secondary);
+
+					MessageDialog md = new MessageDialog (PintaCore.Chrome.MainWindow, DialogFlags.Modal, MessageType.Error,
+					ButtonsType.Ok, message);
+
+					md.Run ();
+					md.Destroy ();
+					return false;
+				} else {
+					throw e; // Only catch exceptions we know the reason for
+				}
+			}
 
 			document.Filename = Path.GetFileName (file);
 			document.IsDirty = false;
@@ -230,17 +247,24 @@ namespace Pinta.Actions
 			return response == (int)ResponseType.Ok;
 		}
 
-        private void OnFilterChanged(object o, GLib.NotifyArgs args)
-        {
-            FileChooserDialog fcd = (FileChooserDialog)o;
-    
-            // find the FormatDescriptor
-            FormatDescriptor format_desc = PintaCore.System.ImageFormats.Formats.Single (f => f.Filter == fcd.Filter);
-
-            // adjust the filename
-            var p = fcd.Filename;
-            p = Path.ChangeExtension(Path.GetFileName(p), format_desc.Extensions[0]);
-            fcd.CurrentName = p;
-        }
+		private void OnFilterChanged (object o, GLib.NotifyArgs args)
+		{
+			FileChooserDialog fcd = (FileChooserDialog)o;
+
+			// Ensure that the file filter is never blank.
+			if (fcd.Filter == null)
+			{
+				fcd.Filter = PintaCore.System.ImageFormats.GetDefaultSaveFormat ().Filter;
+				return;
+			}
+
+			// find the FormatDescriptor
+			FormatDescriptor format_desc = PintaCore.System.ImageFormats.Formats.Single (f => f.Filter == fcd.Filter);
+
+			// adjust the filename
+			var p = fcd.Filename;
+			p = Path.ChangeExtension (Path.GetFileName (p), format_desc.Extensions[0]);
+			fcd.CurrentName = p;
+		}
 	}
 }
diff --git a/Pinta/Actions/Help/ExtensionManagerAction.cs b/Pinta/Actions/Help/ExtensionManagerAction.cs
deleted file mode 100644
index 1e86e99..0000000
--- a/Pinta/Actions/Help/ExtensionManagerAction.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-// 
-// AboutDialogAction.cs
-//  
-// Author:
-//       Jonathan Pobst <monkey@jpobst.com>
-// 
-// Copyright (c) 2010 Jonathan Pobst
-// 
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-// 
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-// 
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-using System;
-using Gtk;
-using Mono.Unix;
-using Pinta.Core;
-using Mono.Addins.Gui;
-
-namespace Pinta.Actions
-{
-	class ExtensionManagerAction : IActionHandler
-	{
-		#region IActionHandler Members
-		public void Initialize ()
-		{
-			PintaCore.Actions.Help.ExtensionManager.Activated += Activated;
-		}
-
-		public void Uninitialize ()
-		{
-			PintaCore.Actions.Help.ExtensionManager.Activated -= Activated;
-		}
-		#endregion
-
-		private void Activated (object sender, EventArgs e)
-		{
-			AddinManagerWindow.AllowInstall = false;
-
-			AddinManagerWindow.Run (PintaCore.Chrome.MainWindow);
-
-			//dlg.DeleteEvent += delegate { dlg.Destroy (); };
-		}
-	}
-}
diff --git a/Pinta/DialogHandlers.cs b/Pinta/DialogHandlers.cs
index 224fe81..848fd3f 100644
--- a/Pinta/DialogHandlers.cs
+++ b/Pinta/DialogHandlers.cs
@@ -50,9 +50,11 @@ namespace Pinta
 			action_handlers.Add (new SaveDocumentImplmentationAction ());
 
 			// Edit
+			action_handlers.Add (new PasteAction ());
 			action_handlers.Add (new PasteIntoNewLayerAction ());
 			action_handlers.Add (new PasteIntoNewImageAction ());
 			action_handlers.Add (new ResizePaletteAction ());
+			action_handlers.Add (new AddinManagerAction ());
 
 			// Image
 			action_handlers.Add (new ResizeImageAction ());
@@ -71,7 +73,6 @@ namespace Pinta
 
 			// Help
 			action_handlers.Add (new AboutDialogAction ());
-			action_handlers.Add (new ExtensionManagerAction ());
 
 			// Initialize each action handler
 			foreach (var action in action_handlers)
diff --git a/Pinta/Dialogs/AboutDialog.cs b/Pinta/Dialogs/AboutDialog.cs
index 9efea27..80b5aa8 100644
--- a/Pinta/Dialogs/AboutDialog.cs
+++ b/Pinta/Dialogs/AboutDialog.cs
@@ -59,20 +59,19 @@ namespace Pinta
 		internal uint TimerHandle;
 
 		string[] authors = new string[] {
-			"Adam Doppelt",
-			"Adolfo Jayme Barrientos",
 			"Cameron White",
-			"Ciprian Mustiata",
-			"Felix Schmutz",
-			"Mikhail Makarov",
-			"Olivier Dufour",
+			"Jonathan Pobst",
 			"Robert Nordan"
 		};
 
 		string[] oldAuthors = new string[] {
 			"Aaron Bockover",
+			"Adam Doppelt",
+			"Adolfo Jayme Barrientos",
 			"Anirudh Sanjeev",
 			"Cameron White",
+			"Ciprian Mustiata",
+			"Felix Schmutz",
 			"Greg Lowe",
 			"Hanh Pham",
 			"James Gifford",
@@ -88,6 +87,7 @@ namespace Pinta
 			"Marco Rolappe",
 			"Martin Geier",
 			"Mathias Fussenegger",
+			"Mikhail Makarov",
 			"Obinou Conseil",
 			"Olivier Dufour",
 			"Richard Cohn",
diff --git a/Pinta/Dialogs/AboutPintaTabPage.cs b/Pinta/Dialogs/AboutPintaTabPage.cs
index 641071f..1a965a3 100644
--- a/Pinta/Dialogs/AboutPintaTabPage.cs
+++ b/Pinta/Dialogs/AboutPintaTabPage.cs
@@ -39,7 +39,7 @@ namespace Pinta
 			label.Markup = String.Format (
 			    "<b>{0}</b>\n    {1}",
 			    Catalog.GetString ("Version"),
-			    "1.2");
+			    "1.3");
 			    
 			HBox hBoxVersion = new HBox ();
 			hBoxVersion.PackStart (label, false, false, 5);
@@ -54,7 +54,7 @@ namespace Pinta
 
 			label = null;
 			label = new Label ();
-			label.Markup = string.Format ("<b>{0}</b>\n    (c) 2010-2011 {1}", Catalog.GetString ("Copyright"), Catalog.GetString ("by Pinta contributors"));
+			label.Markup = string.Format ("<b>{0}</b>\n    (c) 2010-2012 {1}", Catalog.GetString ("Copyright"), Catalog.GetString ("by Pinta contributors"));
 			HBox hBoxCopyright = new HBox ();
 			hBoxCopyright.PackStart (label, false, false, 5);
 			this.PackStart (hBoxCopyright, false, true, 5);
diff --git a/Pinta/Dialogs/ClipboardEmptyDialog.cs b/Pinta/Dialogs/ClipboardEmptyDialog.cs
new file mode 100644
index 0000000..28d3e07
--- /dev/null
+++ b/Pinta/Dialogs/ClipboardEmptyDialog.cs
@@ -0,0 +1,51 @@
+// 
+// ClipboardEmptyDialog.cs
+//  
+// Author:
+//       Cameron White <cameronwhite91@gmail.com>
+// 
+// Copyright (c) 2012 Cameron White
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using Gtk;
+using Mono.Unix;
+
+namespace Pinta.Dialogs
+{
+	public static class ClipboardEmptyDialog
+	{
+		public static void Show ()
+		{
+			var primary = Catalog.GetString ("Image cannot be pasted");
+			var secondary = Catalog.GetString ("The clipboard does not contain an image.");
+			var markup = "<span weight=\"bold\" size=\"larger\">{0}</span>\n\n{1}\n";
+			markup = string.Format (markup, primary, secondary);
+
+			var md = new MessageDialog (Pinta.Core.PintaCore.Chrome.MainWindow, DialogFlags.Modal,
+						    MessageType.Error, ButtonsType.None, true,
+						    markup);
+
+			md.AddButton (Stock.Ok, ResponseType.Yes);
+
+			md.Run ();
+			md.Destroy ();
+		}
+	}
+}
diff --git a/Pinta/Dialogs/ErrorDialog.cs b/Pinta/Dialogs/ErrorDialog.cs
index 88285a4..6993779 100644
--- a/Pinta/Dialogs/ErrorDialog.cs
+++ b/Pinta/Dialogs/ErrorDialog.cs
@@ -26,6 +26,7 @@
 
 using System;
 using Gtk;
+using Pinta.Core;
 
 namespace Pinta
 {
@@ -121,7 +122,7 @@ namespace Pinta
 			this.image884 = new global::Gtk.Image ();
 			this.image884.Name = "image884";
 			this.image884.Yalign = 0f;
-			this.image884.Pixbuf = Gtk.IconTheme.Default.LoadIcon ("gtk-dialog-error", 32, Gtk.IconLookupFlags.UseBuiltin);
+			this.image884.Pixbuf = PintaCore.Resources.GetIcon (Stock.DialogError, 32);
 			this.hbox1.Add (this.image884);
 			global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1[this.image884]));
 			w2.Position = 0;
diff --git a/Pinta/Dialogs/NewImageDialog.cs b/Pinta/Dialogs/NewImageDialog.cs
index 8ef2760..470b750 100644
--- a/Pinta/Dialogs/NewImageDialog.cs
+++ b/Pinta/Dialogs/NewImageDialog.cs
@@ -36,7 +36,7 @@ namespace Pinta
 		{
 			this.Build ();
 
-			this.Icon = Gtk.IconTheme.Default.LoadIcon ("gtk-new", 16, IconLookupFlags.UseBuiltin);
+			this.Icon = PintaCore.Resources.GetIcon (Stock.New, 16);
 			DefaultResponse = ResponseType.Ok;
 			AlternativeButtonOrder = new int[] { (int) ResponseType.Ok, (int) ResponseType.Cancel };
 
diff --git a/Pinta/Main.cs b/Pinta/Main.cs
index e16653b..02ea56b 100644
--- a/Pinta/Main.cs
+++ b/Pinta/Main.cs
@@ -86,32 +86,33 @@ namespace Pinta
 			
 			if (threads != -1)
 				Pinta.Core.PintaCore.System.RenderThreads = threads;
-				
-			if (extra.Count > 0) {
-				// Not sure what this does for Mac, so I'm not touching it
-				if (PintaCore.System.OperatingSystem == OS.Mac) {
-					string arg = args[0];
 
-					if (args[0].StartsWith ("-psn_")) {
-						if (args.Length > 1)
-							arg = args[1];
-						else
-							arg = null;
-					}
-				
-					if (!string.IsNullOrEmpty (arg)) {
-						PintaCore.Workspace.OpenFile (arg);
-					}
-				} else {
-					foreach (var file in extra)
-						PintaCore.Workspace.OpenFile (file);
-				}				
-			} else {
+			OpenFilesFromCommandLine (extra);
+			
+			Application.Run ();
+		}
+
+		private static void OpenFilesFromCommandLine (List<string> extra)
+		{
+			// Ignore the process serial number parameter on Mac OS X
+			if (PintaCore.System.OperatingSystem == OS.Mac && extra.Count > 0)
+			{
+				if (extra[0].StartsWith ("-psn_"))
+				{
+					extra.RemoveAt (0);
+				}
+			}
+
+			if (extra.Count > 0)
+			{
+				foreach (var file in extra)
+					PintaCore.Workspace.OpenFile (file);
+			}
+			else
+			{
 				// Create a blank document
 				PintaCore.Workspace.NewDocument (new Gdk.Size (800, 600), false);
 			}
-			
-			Application.Run ();
 		}
 
 		private static void ExceptionManager_UnhandledException (GLib.UnhandledExceptionArgs args)
diff --git a/Pinta/MainWindow.cs b/Pinta/MainWindow.cs
index bb102b8..cbb3560 100644
--- a/Pinta/MainWindow.cs
+++ b/Pinta/MainWindow.cs
@@ -235,9 +235,19 @@ namespace Pinta
 			container.PackStart (dock, true, true, 0);
 			
 			string layout_file = System.IO.Path.Combine (PintaCore.Settings.GetUserSettingsDirectory (), "layouts.xml");
-			
-			if (System.IO.File.Exists (layout_file))
-				dock.LoadLayouts (layout_file);
+
+            if (System.IO.File.Exists(layout_file))
+            {
+                try
+                {
+                    dock.LoadLayouts(layout_file);
+                }
+                // If parsing layouts.xml fails for some reason, proceed to create the default layout.
+                catch (Exception e)
+                {
+                    System.Console.Error.WriteLine ("Error reading layouts.xml: " + e.ToString());
+                }
+            }
 			
 			if (!dock.HasLayout ("Default"))
 				dock.CreateLayout ("Default", false);
diff --git a/Pinta/Pads/HistoryPad.cs b/Pinta/Pads/HistoryPad.cs
index 2f17ac6..279459f 100644
--- a/Pinta/Pads/HistoryPad.cs
+++ b/Pinta/Pads/HistoryPad.cs
@@ -41,7 +41,7 @@ namespace Pinta
 			DockItemToolbar history_tb = history_item.GetToolbar (PositionType.Bottom);
 
 			history_item.Label = Catalog.GetString ("History");
-			history_item.DefaultLocation = "Layers/Bottom";
+			history_item.DefaultLocation = "Images/Bottom";
 			history_item.Content = history;
 			history_item.Icon = PintaCore.Resources.GetIcon ("Menu.Layers.DuplicateLayer.png");
 
diff --git a/Pinta/Pads/OpenImagesPad.cs b/Pinta/Pads/OpenImagesPad.cs
index ad1c02c..a1976c7 100644
--- a/Pinta/Pads/OpenImagesPad.cs
+++ b/Pinta/Pads/OpenImagesPad.cs
@@ -39,8 +39,10 @@ namespace Pinta
 			const string pad_name = "Images";
 
 			DockItem open_images_item = workspace.AddItem (pad_name);
+            open_images_item.DefaultLocation = "Layers/Bottom";
 			open_images_item.Label = Catalog.GetString (pad_name);
 			open_images_item.Content = new OpenImagesListWidget ();
+            open_images_item.Icon = PintaCore.Resources.GetIcon ("Menu.Effects.Default.png");
 
 			ToggleAction show_open_images = padMenu.AppendToggleAction (pad_name, Catalog.GetString (pad_name), null, null);
 
diff --git a/Pinta/Pinta.csproj b/Pinta/Pinta.csproj
index 8b49d44..be4311e 100644
--- a/Pinta/Pinta.csproj
+++ b/Pinta/Pinta.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"; ToolsVersion="4.0">
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -101,9 +101,11 @@
     </EmbeddedResource>
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Actions\Edit\PasteAction.cs" />
     <Compile Include="Actions\Edit\ResizePaletteAction.cs" />
     <Compile Include="Actions\Edit\PasteIntoNewImageAction.cs" />
     <Compile Include="Actions\Edit\PasteIntoNewLayerAction.cs" />
+    <Compile Include="Actions\Edit\AddinManagerAction.cs" />
     <Compile Include="Actions\File\CloseDocumentAction.cs" />
     <Compile Include="Actions\File\SaveDocumentImplementationAction.cs" />
     <Compile Include="Actions\File\ModifyCompressionAction.cs" />
@@ -115,7 +117,6 @@
     <Compile Include="Actions\File\NewScreenshotAction.cs" />
     <Compile Include="Actions\File\NewDocumentAction.cs" />
     <Compile Include="Actions\Help\AboutDialogAction.cs" />
-    <Compile Include="Actions\Help\ExtensionManagerAction.cs" />
     <Compile Include="Actions\IActionHandler.cs" />
     <Compile Include="Actions\Image\ResizeCanvasAction.cs" />
     <Compile Include="Actions\Image\ResizeImageAction.cs" />
@@ -126,6 +127,7 @@
     <Compile Include="Actions\Window\SaveAllDocumentsAction.cs" />
     <Compile Include="Dialogs\AboutPintaTabPage.cs" />
     <Compile Include="Dialogs\AboutDialog.cs" />
+    <Compile Include="Dialogs\ClipboardEmptyDialog.cs" />
     <Compile Include="Dialogs\ErrorDialog.cs" />
     <Compile Include="Dialogs\JpegCompressionDialog.cs" />
     <Compile Include="Dialogs\SpinButtonEntryDialog.cs" />
diff --git a/Pinta/Properties/AssemblyInfo.cs b/Pinta/Properties/AssemblyInfo.cs
index efc74f7..c504a85 100644
--- a/Pinta/Properties/AssemblyInfo.cs
+++ b/Pinta/Properties/AssemblyInfo.cs
@@ -17,7 +17,7 @@ using System.Runtime.CompilerServices;
 // The form "{Major}.{Minor}.*" will automatically update the build and revision,
 // and "{Major}.{Minor}.{Build}.*" will update just the revision.
 
-[assembly: AssemblyVersion ("1.2.0.0")]
+[assembly: AssemblyVersion ("1.3.0.0")]
 
 // The following attributes are used to specify the signing key for the assembly, 
 // if desired. See the Mono documentation for more information about signing.
diff --git a/configure b/configure
index d46a159..908fe34 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for pinta 1.2.
+# Generated by GNU Autoconf 2.68 for pinta 1.3.
 #
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -557,8 +557,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='pinta'
 PACKAGE_TARNAME='pinta'
-PACKAGE_VERSION='1.2'
-PACKAGE_STRING='pinta 1.2'
+PACKAGE_VERSION='1.3'
+PACKAGE_STRING='pinta 1.3'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1306,7 +1306,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures pinta 1.2 to adapt to many kinds of systems.
+\`configure' configures pinta 1.3 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1372,7 +1372,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of pinta 1.2:";;
+     short | recursive ) echo "Configuration of pinta 1.3:";;
    esac
   cat <<\_ACEOF
 
@@ -1479,7 +1479,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-pinta configure 1.2
+pinta configure 1.3
 generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1844,7 +1844,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by pinta $as_me 1.2, which was
+It was created by pinta $as_me 1.3, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
@@ -2659,7 +2659,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='pinta'
- VERSION='1.2'
+ VERSION='1.3'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -6639,7 +6639,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by pinta $as_me 1.2, which was
+This file was extended by pinta $as_me 1.3, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -6696,7 +6696,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-pinta config.status 1.2
+pinta config.status 1.3
 configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index 0590bc5..90ae4ae 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-AC_INIT([pinta], [1.2])
+AC_INIT([pinta], [1.3])
 AM_INIT_AUTOMAKE([tar-ustar foreign])
 
 
diff --git a/debian/changelog b/debian/changelog
index bf1a575..fccdb17 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+pinta (1.3-1) experimental; urgency=low
+
+  * [527a4c3] Sort "preview" versions lower than release versions
+  * [1037f1e] Imported Upstream version 1.3
+  * [8dfe7e4] Update copyright file
+  * [3de343b] Standards-Version → 3,9.3, no changes required
+
+ -- Iain Lane <laney@debian.org>  Thu, 05 Jul 2012 13:07:14 +0100
+
 pinta (1.2-1) unstable; urgency=low
 
   * [2c6b414] Imported Upstream version 1.2
diff --git a/debian/control b/debian/control
index 23aec2a..7c06440 100644
--- a/debian/control
+++ b/debian/control
@@ -12,7 +12,7 @@ Build-Depends-Indep: intltool,
                      libglade2.0-cil-dev,
                      libmono-addins-cil-dev,
                      libmono-addins-gui-cil-dev
-Standards-Version: 3.9.2
+Standards-Version: 3.9.3
 Homepage: http://pinta-project.com/
 Vcs-Git: git://git.debian.org/pkg-cli-apps/packages/pinta.git
 Vcs-Browser: http://git.debian.org/?p=pkg-cli-apps/packages/pinta.git
diff --git a/debian/copyright b/debian/copyright
index 9516f0d..1659cb9 100644
diff --git a/debian/watch b/debian/watch
index aef82c1..3d6208d 100644
--- a/debian/watch
+++ b/debian/watch
@@ -1,4 +1,4 @@
 version=3
 
-opts=dversionmangle=s/\+dfsg(\d)*$// \
+opts=dversionmangle=s/\+dfsg(\d)*$//,uversionmangle=s/-preview/~preview/ \
 https://github.com/PintaProject/Pinta/downloads /downloads/PintaProject/Pinta/pinta-(.*).tar.gz
diff --git a/po/Makefile b/po/Makefile
index 4f867a7..50a62d1 100644
diff --git a/po/Makefile.in b/po/Makefile.in
index 2617363..14c0bd5 100644
diff --git a/po/af.po b/po/af.po
index d12eb71..8793e27 100644
diff --git a/po/ar.po b/po/ar.po
index 1c33ec9..9991741 100644
diff --git a/po/bg.po b/po/bg.po
index 0ec50dc..7d3caec 100644
diff --git a/po/br.po b/po/br.po
index 024b4eb..a06de4e 100644
diff --git a/po/bs.po b/po/bs.po
index 122be0f..b170990 100644
diff --git a/po/ca.po b/po/ca.po
index acf6b62..d940fdd 100644
diff --git a/po/cs.po b/po/cs.po
index 5a1521b..aef46b5 100644
diff --git a/po/da.po b/po/da.po
index 08762b6..81aa85b 100644
diff --git a/po/de.po b/po/de.po
index 212f0bd..1707da2 100644
diff --git a/po/el.po b/po/el.po
index 12ff4b1..09f2109 100644
diff --git a/po/en_AU.po b/po/en_AU.po
index 44afd25..371c053 100644
diff --git a/po/en_CA.po b/po/en_CA.po
index 44afd25..2b4a20e 100644
diff --git a/po/en_GB.po b/po/en_GB.po
index 8f227ac..aca60a5 100644
diff --git a/po/eo.po b/po/eo.po
index 5cef1fe..7002962 100644
diff --git a/po/es.po b/po/es.po
index c6ed16c..95a3d10 100644
diff --git a/po/et.po b/po/et.po
index 9313623..bfba7b4 100644
diff --git a/po/eu.po b/po/eu.po
index fdb8577..fc9e09a 100644
diff --git a/po/fi.po b/po/fi.po
index 90f1bc4..02f0868 100644
diff --git a/po/fil.po b/po/fil.po
index a60de4a..a65a296 100644
diff --git a/po/fo.po b/po/fo.po
index e21c862..c91e16e 100644
diff --git a/po/fr.po b/po/fr.po
index d7bc74d..f07274c 100644
diff --git a/po/ga.po b/po/ga.po
index 72ca9fd..edc2cd7 100644
diff --git a/po/gl.po b/po/gl.po
index ff9001d..db0f7d2 100644
diff --git a/po/he.po b/po/he.po
index fa9a6a8..36badad 100644
diff --git a/po/hi.po b/po/hi.po
index b6a6f87..9810c3b 100644
diff --git a/po/hr.po b/po/hr.po
index a2997b3..cdbfa09 100644
diff --git a/po/hu.po b/po/hu.po
index 35e643d..938ac8c 100644
diff --git a/po/hy.po b/po/hy.po
index aa78859..86e7738 100644
diff --git a/po/id.po b/po/id.po
index d86a218..b1d2e53 100644
diff --git a/po/it.po b/po/it.po
index 18d9c64..63dd442 100644
diff --git a/po/ja.po b/po/ja.po
index 8b37a66..3245524 100644
diff --git a/po/ko.po b/po/ko.po
index 0a9635b..8596a3c 100644
diff --git a/po/la.po b/po/la.po
index 08d95dc..92d645e 100644
diff --git a/po/lt.po b/po/lt.po
index 59972e2..370d356 100644
diff --git a/po/lv.po b/po/lv.po
index 2aff020..4b06786 100644
diff --git a/po/messages.in b/po/messages.in
index ae943a0..03d22d5 100644
diff --git a/po/messages.pot b/po/messages.pot
index d337b8f..ef7995b 100644
diff --git a/po/ms.po b/po/ms.po
index 1912e1e..e985037 100644
diff --git a/po/nb.po b/po/nb.po
index 3c190c8..c7c0892 100644
diff --git a/po/nl.po b/po/nl.po
index 9455d1c..272c860 100644
diff --git a/po/nn.po b/po/nn.po
index e56ae2d..abeff7a 100644
diff --git a/po/oc.po b/po/oc.po
index cc6ddb7..c942678 100644
diff --git a/po/pl.po b/po/pl.po
index 7e21516..955219e 100644
diff --git a/po/pt.po b/po/pt.po
index 5a847f8..c68de64 100644
diff --git a/po/pt_BR.po b/po/pt_BR.po
index b49fd37..487a84f 100644
diff --git a/po/ro.po b/po/ro.po
index 4857a26..a5d854e 100644
diff --git a/po/ru.po b/po/ru.po
index c8b26f4..21c8aaa 100644
diff --git a/po/sk.po b/po/sk.po
index 2402340..dc5f726 100644
diff --git a/po/sl.po b/po/sl.po
index f98f623..0bf0cef 100644
diff --git a/po/sq.po b/po/sq.po
index 3b514aa..49454e1 100644
diff --git a/po/sr.po b/po/sr.po
index df65999..37b11dc 100644
diff --git a/po/sv.po b/po/sv.po
index edf4e89..f574372 100644
diff --git a/po/th.po b/po/th.po
index 155e9f6..a52382d 100644
diff --git a/po/tr.po b/po/tr.po
index 8a7f9fa..7507014 100644
diff --git a/po/uk.po b/po/uk.po
index 1010915..77c98bf 100644
diff --git a/po/vi.po b/po/vi.po
index e656e68..c982c53 100644
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 4582937..0fe2aa1 100644
diff --git a/po/zh_TW.po b/po/zh_TW.po
index f2ad51b..4fd682c 100644
diff --git a/xdg/Makefile b/xdg/Makefile
index 551bdc3..eeccae9 100644
--- a/xdg/Makefile
+++ b/xdg/Makefile
@@ -70,12 +70,12 @@ NROFF = nroff
 MANS = $(man_MANS)
 DATA = $(desktop_DATA)
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = ${SHELL} /home/cameron/code/Pinta/missing --run aclocal-1.11
+ACLOCAL = ${SHELL} /home/cameron/code/release-1.3/Pinta/missing --run aclocal-1.11
 ALL_LINGUAS = af ar bg br bs ca cs da de el en_AU en_CA en_GB es et eu fi fil fo fr ga gl he hi hr hu hy id it ja ko la lt lv ms nb nl nn oc pl pt pt_BR ro ru sk sl sq sr sv th tr uk vi zh_CN zh_TW
-AMTAR = ${SHELL} /home/cameron/code/Pinta/missing --run tar
-AUTOCONF = ${SHELL} /home/cameron/code/Pinta/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/cameron/code/Pinta/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/cameron/code/Pinta/missing --run automake-1.11
+AMTAR = ${SHELL} /home/cameron/code/release-1.3/Pinta/missing --run tar
+AUTOCONF = ${SHELL} /home/cameron/code/release-1.3/Pinta/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/cameron/code/release-1.3/Pinta/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/cameron/code/release-1.3/Pinta/missing --run automake-1.11
 AWK = gawk
 CATALOGS =  af.gmo ar.gmo bg.gmo br.gmo bs.gmo ca.gmo cs.gmo da.gmo de.gmo el.gmo en_AU.gmo en_CA.gmo en_GB.gmo es.gmo et.gmo eu.gmo fi.gmo fil.gmo fo.gmo fr.gmo ga.gmo gl.gmo he.gmo hi.gmo hr.gmo hu.gmo hy.gmo id.gmo it.gmo ja.gmo ko.gmo la.gmo lt.gmo lv.gmo ms.gmo nb.gmo nl.gmo nn.gmo oc.gmo pl.gmo pt.gmo pt_BR.gmo ro.gmo ru.gmo sk.gmo sl.gmo sq.gmo sr.gmo sv.gmo th.gmo tr.gmo uk.gmo vi.gmo zh_CN.gmo zh_TW.gmo
 CATOBJEXT = .gmo
@@ -86,7 +86,7 @@ CPP = gcc -E
 CPPFLAGS = 
 CYGPATH_W = echo
 DATADIRNAME = share
-DEFS = -DPACKAGE_NAME=\"pinta\" -DPACKAGE_TARNAME=\"pinta\" -DPACKAGE_VERSION=\"1.2\" -DPACKAGE_STRING=\"pinta\ 1.2\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pinta\" -DVERSION=\"1.2\" -DGETTEXT_PACKAGE=\"pinta\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LOCALE_H=1 -DHAVE_LC_MESSAGES=1 -DHAVE_BIND_TEXTDOMAIN_CODESET=1 -DHAVE_GETTEXT=1 -DHAVE_DCGETTEXT=1 -DENABLE_NLS=1
+DEFS = -DPACKAGE_NAME=\"pinta\" -DPACKAGE_TARNAME=\"pinta\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"pinta\ 1.3\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pinta\" -DVERSION=\"1.3\" -DGETTEXT_PACKAGE=\"pinta\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LOCALE_H=1 -DHAVE_LC_MESSAGES=1 -DHAVE_BIND_TEXTDOMAIN_CODESET=1 -DHAVE_GETTEXT=1 -DHAVE_DCGETTEXT=1 -DENABLE_NLS=1
 DEPDIR = .deps
 ECHO_C = 
 ECHO_N = -n
@@ -116,7 +116,7 @@ LDFLAGS =
 LIBOBJS = 
 LIBS = 
 LTLIBOBJS = 
-MAKEINFO = ${SHELL} /home/cameron/code/Pinta/missing --run makeinfo
+MAKEINFO = ${SHELL} /home/cameron/code/release-1.3/Pinta/missing --run makeinfo
 MKDIR_P = /bin/mkdir -p
 MKINSTALLDIRS = ./mkinstalldirs
 MONO = /usr/bin/mono
@@ -131,10 +131,10 @@ OBJEXT = o
 PACKAGE = pinta
 PACKAGE_BUGREPORT = 
 PACKAGE_NAME = pinta
-PACKAGE_STRING = pinta 1.2
+PACKAGE_STRING = pinta 1.3
 PACKAGE_TARNAME = pinta
 PACKAGE_URL = 
-PACKAGE_VERSION = 1.2
+PACKAGE_VERSION = 1.3
 PATH_SEPARATOR = :
 PKG_CONFIG = /usr/bin/pkg-config
 PKG_CONFIG_LIBDIR = 
@@ -147,13 +147,13 @@ SET_MAKE =
 SHELL = /bin/bash
 STRIP = 
 USE_NLS = yes
-VERSION = 1.2
+VERSION = 1.3
 XBUILD = /usr/bin/xbuild
 XGETTEXT = /usr/bin/xgettext
-abs_builddir = /home/cameron/code/Pinta/xdg
-abs_srcdir = /home/cameron/code/Pinta/xdg
-abs_top_builddir = /home/cameron/code/Pinta
-abs_top_srcdir = /home/cameron/code/Pinta
+abs_builddir = /home/cameron/code/release-1.3/Pinta/xdg
+abs_srcdir = /home/cameron/code/release-1.3/Pinta/xdg
+abs_top_builddir = /home/cameron/code/release-1.3/Pinta
+abs_top_srcdir = /home/cameron/code/release-1.3/Pinta
 ac_ct_CC = gcc
 am__include = include
 am__leading_dot = .
@@ -172,7 +172,7 @@ host_alias =
 htmldir = ${docdir}
 includedir = ${prefix}/include
 infodir = ${datarootdir}/info
-install_sh = ${SHELL} /home/cameron/code/Pinta/install-sh
+install_sh = ${SHELL} /home/cameron/code/release-1.3/Pinta/install-sh
 libdir = ${exec_prefix}/lib
 libexecdir = ${exec_prefix}/libexec
 localedir = ${datarootdir}/locale

Attachment: signature.asc
Description: Digital signature


Reply to: