[f-spot] Replace old, slow SlideView screensaver view



commit d01c272907f2fef5195d92051157f56286d19033
Author: Gabriel Burt <gabriel burt gmail com>
Date:   Tue Feb 2 16:46:54 2010 -0800

    Replace old, slow SlideView screensaver view
    
    Use the new SlideShow code instead
    
    Fixes bgo #608849

 .../Tools/ScreensaverConfig/ScreensaverConfig.cs   |    5 +-
 src/Core/App.cs                                    |   17 +-
 src/Makefile.am                                    |    2 +-
 src/Preferences.cs                                 |    3 +
 src/SingleView.cs                                  |   13 -
 src/SlideView.cs                                   |  558 --------------------
 src/Widgets/SlideShow.cs                           |   13 +-
 src/XScreenSaverSlide.cs                           |   60 +++
 8 files changed, 86 insertions(+), 585 deletions(-)
---
diff --git a/extensions/Tools/ScreensaverConfig/ScreensaverConfig.cs b/extensions/Tools/ScreensaverConfig/ScreensaverConfig.cs
index 969fbfa..8824ddf 100644
--- a/extensions/Tools/ScreensaverConfig/ScreensaverConfig.cs
+++ b/extensions/Tools/ScreensaverConfig/ScreensaverConfig.cs
@@ -27,9 +27,8 @@ namespace ScreensaverConfig
 		const string SaverMode = "single";
 		const string GNOME_SCREENSAVER_THEME = "/apps/gnome-screensaver/themes";
 		const string GNOME_SCREENSAVER_MODE = "/apps/gnome-screensaver/mode";
-		const string SCREENSAVER = "screensaver/";
-		const string SCREENSAVER_TAG = Preferences.APP_FSPOT + SCREENSAVER + "tag_id";
-		const string SCREENSAVER_DELAY = Preferences.APP_FSPOT + SCREENSAVER + "delay";
+		const string SCREENSAVER_TAG = Preferences.SCREENSAVER_TAG;
+		const string SCREENSAVER_DELAY = Preferences.SCREENSAVER_DELAY;
 		const double default_delay = 2.0;
 
 		public void Run (object o, EventArgs e)
diff --git a/src/Core/App.cs b/src/Core/App.cs
index 4c847da..a68e072 100644
--- a/src/Core/App.cs
+++ b/src/Core/App.cs
@@ -231,7 +231,7 @@ namespace FSpot
 		void HandleSlideshow (string tagname)
 		{
 			Tag tag;
-			SlideView slideview = null;
+			FSpot.Widgets.SlideShow slideshow = null;
 
 			if (!String.IsNullOrEmpty (tagname))
 				tag = Database.Tags.GetTagByName (tagname);
@@ -246,17 +246,18 @@ namespace FSpot
 			else
 				photos = new Photo [0];
 
-			var delay = Math.Max (1.0, Preferences.Get<double> (Preferences.APP_FSPOT + "screensaver/delay"));
+			// Minimum delay 1 second; default is 4s
+			var delay = Math.Max (1.0, Preferences.Get<double> (Preferences.SCREENSAVER_DELAY));
+
 			var window = new XScreenSaverSlide ();
 			window.ModifyFg (Gtk.StateType.Normal, new Gdk.Color (127, 127, 127));
 			window.ModifyBg (Gtk.StateType.Normal, new Gdk.Color (0, 0, 0));
 
 			if (photos.Length > 0) {
 				Array.Sort (photos, new Photo.RandomSort ());
-				Gdk.Pixbuf black = new Gdk.Pixbuf (Gdk.Colorspace.Rgb, false, 8, 1, 1);
-				black.Fill (0x00000000);
-				slideview = new SlideView (black, photos, delay);
-				window.Add (slideview);
+				slideshow = new FSpot.Widgets.SlideShow (new BrowsablePointer (new PhotoList (photos), 0), (uint)(delay * 1000), true);
+				slideshow.Transition = new FSpot.Widgets.DissolveTransition ();
+				window.Add (slideshow);
 			} else {
 				Gtk.HBox outer = new Gtk.HBox ();
 				Gtk.HBox hbox = new Gtk.HBox ();
@@ -304,8 +305,8 @@ namespace FSpot
 
 			Register (window);
 			GLib.Idle.Add (delegate {
-				if (slideview != null)
-					slideview.Play ();
+				if (slideshow != null)
+					slideshow.Start ();
 				return false;
 			});
 		}
diff --git a/src/Makefile.am b/src/Makefile.am
index 8d7eb29..35800c1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -242,7 +242,7 @@ F_SPOT_CSDISTFILES =				\
 	$(srcdir)/RollStore.cs			\
 	$(srcdir)/SelectionDataExtensions.cs	\
 	$(srcdir)/SendEmail.cs                  \
-	$(srcdir)/SlideView.cs			\
+	$(srcdir)/XScreenSaverSlide.cs		\
 	$(srcdir)/SingleView.cs			\
 	$(srcdir)/SimpleCalendar.cs		\
 	$(srcdir)/Sharpener.cs			\
diff --git a/src/Preferences.cs b/src/Preferences.cs
index 144eab7..19d4fd3 100644
--- a/src/Preferences.cs
+++ b/src/Preferences.cs
@@ -66,6 +66,7 @@ namespace FSpot
 		public const string IMPORT_GUI_ROLL_HISTORY = APP_FSPOT + "import/gui_roll_history";
 
 		public const string SCREENSAVER_TAG = APP_FSPOT + "screensaver/tag_id";
+		public const string SCREENSAVER_DELAY = APP_FSPOT + "screensaver/delay";
 
 		public const string STORAGE_PATH = APP_FSPOT + "import/storage_path";
 
@@ -145,6 +146,8 @@ namespace FSpot
 
 			case SCREENSAVER_TAG:
 				return 1;
+			case SCREENSAVER_DELAY:
+				return 4.0;
 			case STORAGE_PATH:
 				return System.IO.Path.Combine (FSpot.Global.HomeDirectory, Catalog.GetString("Photos"));
 			case EXPORT_EMAIL_SIZE:
diff --git a/src/SingleView.cs b/src/SingleView.cs
index 6cf74e1..99369bc 100644
--- a/src/SingleView.cs
+++ b/src/SingleView.cs
@@ -360,19 +360,6 @@ namespace FSpot {
 			chooser.Destroy ();
 		}
 
-		private bool SlideShow ()
-		{
-			IBrowsableItem [] items = new IBrowsableItem [collection.Count];
-			for (int i = 0; i < collection.Count; i++) {
-				items [i] = collection [i];
-			}
-
-			FSpot.FullSlide full = new FSpot.FullSlide (Window, items);
-			full.Play ();
-			this.Window.GdkWindow.Cursor = null;
-			return false;
-		}
-
 		private void HandleViewFullscreen (object sender, System.EventArgs args)
 		{
 			if (fsview != null)
diff --git a/src/Widgets/SlideShow.cs b/src/Widgets/SlideShow.cs
index 8c8ba18..03d7bc9 100644
--- a/src/Widgets/SlideShow.cs
+++ b/src/Widgets/SlideShow.cs
@@ -23,7 +23,12 @@ namespace FSpot.Widgets
 		bool running;
 		BrowsablePointer item;
 #region Public API
-		public SlideShow (BrowsablePointer item) : base ()
+
+		public SlideShow (BrowsablePointer item) : this (item, 6000, false)
+		{
+		}
+
+		public SlideShow (BrowsablePointer item, uint interval_ms, bool init) : base ()
 		{
 			this.item = item;
 			DoubleBuffered = false;
@@ -37,8 +42,12 @@ namespace FSpot.Widgets
 				transitions.Add (transition.Transition);
 			}
 
-			flip = new Delay (6000, delegate {item.MoveNext (true); return true;});
+			flip = new Delay (interval_ms, delegate {item.MoveNext (true); return true;});
 			animation = new DoubleAnimation (0, 1, new TimeSpan (0, 0, 2), HandleProgressChanged, GLib.Priority.Default);
+
+			if (init) {
+				HandleItemChanged (null, null);
+			}
 		}
 
 		SlideShowTransition transition;
diff --git a/src/XScreenSaverSlide.cs b/src/XScreenSaverSlide.cs
new file mode 100644
index 0000000..815c055
--- /dev/null
+++ b/src/XScreenSaverSlide.cs
@@ -0,0 +1,60 @@
+using Gtk;
+using Gdk;
+using System;
+using GLib;
+using System.Runtime.InteropServices;
+using FSpot;
+using FSpot.Utils;
+
+namespace FSpot {
+	public class XScreenSaverSlide : Gtk.Window {
+		public const string ScreenSaverEnviroment = "XSCREENSAVER_WINDOW";
+
+		public XScreenSaverSlide () : base (String.Empty)
+		{
+		}
+	       
+		protected override void OnRealized ()
+		{
+			string env = Environment.GetEnvironmentVariable (ScreenSaverEnviroment);
+			
+			if (env != null) {
+				try {
+					env = env.ToLower ();
+					
+					if (env.StartsWith ("0x"))
+						env = env.Substring (2);
+
+					uint xid = UInt32.Parse (env, System.Globalization.NumberStyles.HexNumber);
+					
+					GdkWindow = Gdk.Window.ForeignNew (xid);
+					Style.Attach (GdkWindow);
+					GdkWindow.Events = EventMask.ExposureMask 
+						| EventMask.StructureMask 
+						| EventMask.EnterNotifyMask 
+						| EventMask.LeaveNotifyMask 
+						| EventMask.FocusChangeMask;
+					
+					Style.SetBackground (GdkWindow, Gtk.StateType.Normal);
+					GdkWindow.SetDecorations ((Gdk.WMDecoration) 0);
+					GdkWindow.UserData = this.Handle;
+					SetFlag (WidgetFlags.Realized);
+					SizeRequest ();
+					Gdk.Rectangle geom;
+					int depth;
+					GdkWindow.GetGeometry (out geom.X, out geom.Y, out geom.Width, out geom.Height, out depth);
+					SizeAllocate (new Gdk.Rectangle (geom.X, geom.Y, geom.Width, geom.Height));
+					Resize (geom.Width, geom.Height);
+					return;
+				} catch (System.Exception e) {
+					System.Console.WriteLine (e);
+				}
+			} else {
+				System.Console.WriteLine ("{0} not set, falling back to window", ScreenSaverEnviroment);
+			}
+
+			SetSizeRequest (640, 480);
+			base.OnRealized ();
+		}
+	}
+}		



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