Index: logout.c
===================================================================
RCS file: /cvs/gnome/gnome-session/gnome-session/logout.c,v
retrieving revision 1.44
diff -u -p -r1.44 logout.c
--- logout.c	15 Oct 2002 06:05:01 -0000	1.44
+++ logout.c	17 Feb 2003 19:03:53 -0000
@@ -54,63 +54,53 @@ static enum
 action = LOGOUT;
 
 typedef struct {
-	GdkScreen    *screen;
-	int           monitor;
-	GdkRectangle  iris_rect;
-	GdkWindow    *root_window;
-	int           iris_block;
-	GdkGC        *iris_gc;
+  GdkScreen    *screen;
+  int           monitor;
+  GdkRectangle  iris_rect;
+  GdkWindow    *root_window;
+  GdkPixbuf    *back_pb, *dest;
+  int           iris_block;
+  int           percent;
+  GdkGC        *iris_gc;
 } IrisData;
 
 static int num_iris_timeouts = 0;
 
-static gint
-iris_callback (IrisData *data)
+static gboolean
+iris_callback (gpointer data)
 {
-  gint i;
-  gint width_step;
-  gint height_step;
-  gint width;
-  gint height;
-
-  width_step = MIN (data->iris_rect.width / 2, data->iris_block);
-  height_step = MIN (data->iris_rect.width / 2, data->iris_block);
-
-  for (i = 0; i < MIN (width_step, height_step); i++)
-    {
-      width  = (gint)data->iris_rect.width  - 2 * i;
-      height = (gint)data->iris_rect.height - 2 * i;
+  IrisData *iris = data;
 
-      if (width < 0 || height < 0)
-        break;
-
-      gdk_draw_rectangle (data->root_window, data->iris_gc, FALSE,
-                          data->iris_rect.x + i,
-			  data->iris_rect.y + i,
-                          width, height);
+  if (iris->percent < 0) {
+    
+    g_object_unref (iris->iris_gc);
+    g_object_unref (iris->back_pb);
+    g_object_unref (iris->dest);
+    
+    g_free (iris);
+    
+    if (!--num_iris_timeouts) {
+      gtk_main_quit ();
     }
+    
+    return FALSE;
+  }
+  
+  gdk_pixbuf_saturate_and_pixelate (iris->back_pb, iris->dest,
+				    ((float) iris->percent) / 100.0, FALSE);
+
+  gdk_draw_pixbuf (iris->root_window, iris->iris_gc, iris->dest,
+		   0, 0, iris->iris_rect.x, iris->iris_rect.y,
+		   iris->iris_rect.width, iris->iris_rect.height,
+		   GDK_RGB_DITHER_NONE, 0, 0);
 
   gdk_flush ();
-
-  data->iris_rect.x += width_step;
-  data->iris_rect.y += height_step;
-  data->iris_rect.width -= MIN (data->iris_rect.width, data->iris_block * 2);
-  data->iris_rect.height -= MIN (data->iris_rect.height, data->iris_block * 2);
-
-  if (data->iris_rect.width == 0 || data->iris_rect.height == 0)
-    {
-      g_object_unref (data->iris_gc);
-      g_free (data);
-
-      if (!--num_iris_timeouts)
-        gtk_main_quit ();
-
-      return FALSE;
-    }
-  else
-    return TRUE;
+  
+  iris->percent -= 30;
+    
+  return TRUE;
 }
-
+  
 static void
 iris_on_screen (GdkScreen *screen,
 		int        monitor)
@@ -128,21 +118,23 @@ iris_on_screen (GdkScreen *screen,
   data->iris_rect.y = gsm_screen_get_y (screen, monitor);
   data->iris_rect.width = gsm_screen_get_width (screen, monitor);
   data->iris_rect.height = gsm_screen_get_height (screen, monitor);
-
+  data->percent = 90;
+  
   data->root_window = gdk_screen_get_root_window (screen);
-
-  values.line_style = GDK_LINE_ON_OFF_DASH;
+  data->back_pb = gdk_pixbuf_get_from_drawable (NULL, data->root_window,
+						NULL, data->iris_rect.x,
+						data->iris_rect.y,
+						0, 0, data->iris_rect.width,
+						data->iris_rect.height);
+  data->dest = gdk_pixbuf_copy (data->back_pb);
+  
+/*   values.line_style = GDK_LINE_ON_OFF_DASH; */
   values.subwindow_mode = GDK_INCLUDE_INFERIORS;
 
   data->iris_gc = gdk_gc_new_with_values (data->root_window,
 					  &values,
-					  GDK_GC_LINE_STYLE | GDK_GC_SUBWINDOW);
-  gdk_gc_set_dashes (data->iris_gc, 0, dash_list, 2);
-
-  /* Plan for a time of 0.5 seconds for effect */
-  data->iris_block = data->iris_rect.height / (500 / 20);
-  if (data->iris_block < 8)
-    data->iris_block = 8;
+					  GDK_GC_SUBWINDOW);
+/*   gdk_gc_set_dashes (data->iris_gc, 0, dash_list, 2); */
 
   g_timeout_add (20, (GSourceFunc) iris_callback, data);
   num_iris_timeouts++;

