diff -ur control-center-2.8.1/capplets/background/gnome-wp-capplet.c control-center-2.8.1-bgzoom/capplets/background/gnome-wp-capplet.c
--- control-center-2.8.1/capplets/background/gnome-wp-capplet.c	2004-09-10 03:34:56.000000000 +0100
+++ control-center-2.8.1-bgzoom/capplets/background/gnome-wp-capplet.c	2004-12-12 17:22:12.000000000 +0000
@@ -257,6 +257,9 @@
     } else if (!strcmp (value, "scaled")) {
       gtk_option_menu_set_history (GTK_OPTION_MENU (capplet->wp_opts),
 				   GNOME_WP_SCALE_TYPE_SCALED);
+    } else if (!strcmp (value, "zoom")) {
+      gtk_option_menu_set_history (GTK_OPTION_MENU (capplet->wp_opts),
+				    GNOME_WP_SCALE_TYPE_ZOOM);
     } else {
       gtk_option_menu_set_history (GTK_OPTION_MENU (capplet->wp_opts),
 				   GNOME_WP_SCALE_TYPE_TILED);
@@ -419,6 +422,9 @@
   case GNOME_WP_SCALE_TYPE_SCALED:
     item->options = g_strdup ("scaled");
     break;
+  case GNOME_WP_SCALE_TYPE_ZOOM:
+    item->options = g_strdup ("zoom");
+    break;
   case GNOME_WP_SCALE_TYPE_TILED:
     item->options = g_strdup ("wallpaper");
     break;
@@ -1113,6 +1119,27 @@
   gtk_widget_show (mitem);
 
   mitem = gtk_menu_item_new ();
+  set_accessible_name (mitem, _("Zoom"));
+  icofile = gnome_icon_theme_lookup_icon (capplet->theme,
+                                 	"stock_wallpaper-zoom",
+                                          16, NULL, NULL);
+  mbox = gtk_hbox_new (FALSE, 6);
+  gtk_container_add (GTK_CONTAINER (mitem), mbox);
+  gtk_widget_show (mbox);
+
+  if (icofile != NULL) {
+	capplet->sitem = gtk_image_new_from_file (icofile);
+	gtk_box_pack_start (GTK_BOX (mbox), capplet->sitem, FALSE, FALSE, 0);
+    gtk_widget_show (capplet->sitem);
+  }
+  label = gtk_label_new (_("Zoom"));
+  gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+  gtk_box_pack_start (GTK_BOX (mbox), label, TRUE, TRUE, 0);
+  gtk_widget_show (label);
+  gtk_menu_append (GTK_MENU (menu), mitem);
+  gtk_widget_show (mitem);
+
+  mitem = gtk_menu_item_new ();
   set_accessible_name (mitem, _("Tiled"));
   icofile = gnome_icon_theme_lookup_icon (capplet->theme,
 					  "stock_wallpaper-tile",
diff -ur control-center-2.8.1/capplets/background/gnome-wp-capplet.h control-center-2.8.1-bgzoom/capplets/background/gnome-wp-capplet.h
--- control-center-2.8.1/capplets/background/gnome-wp-capplet.h	2004-07-02 15:59:28.000000000 +0100
+++ control-center-2.8.1-bgzoom/capplets/background/gnome-wp-capplet.h	2004-12-12 17:24:30.000000000 +0000
@@ -96,6 +96,7 @@
   GNOME_WP_SCALE_TYPE_CENTERED,
   GNOME_WP_SCALE_TYPE_STRETCHED,
   GNOME_WP_SCALE_TYPE_SCALED,
+  GNOME_WP_SCALE_TYPE_ZOOM,
   GNOME_WP_SCALE_TYPE_TILED
 } GnomeWPScaleType;
 
diff -ur control-center-2.8.1/capplets/background/gnome-wp-item.c control-center-2.8.1-bgzoom/capplets/background/gnome-wp-item.c
--- control-center-2.8.1/capplets/background/gnome-wp-item.c	2004-10-14 18:35:56.000000000 +0100
+++ control-center-2.8.1-bgzoom/capplets/background/gnome-wp-item.c	2004-12-12 17:22:12.000000000 +0000
@@ -265,6 +265,15 @@
 	tw = bw;
       }
       scaled = gnome_wp_pixbuf_center (pixbuf, bgpixbuf, tw, th);
+    } else if (!strcmp (item->options, "zoom")) {
+      if ((gdouble) ph * (gdouble) bw < (gdouble) pw * (gdouble) bh) {
+	tw = 0.5 + (gdouble) pw * (gdouble) bh / (gdouble) ph; 
+	th = bh;
+      } else {
+	th = 0.5 + (gdouble) ph * (gdouble) bw / (gdouble) pw;
+	tw = bw;
+      }
+      scaled = gnome_wp_pixbuf_center (pixbuf, bgpixbuf, tw, th);
     }
   }
 
diff -ur control-center-2.8.1/libbackground/applier.c control-center-2.8.1-bgzoom/libbackground/applier.c
--- control-center-2.8.1/libbackground/applier.c	2004-07-02 15:59:28.000000000 +0100
+++ control-center-2.8.1-bgzoom/libbackground/applier.c	2004-12-12 19:34:07.642958248 +0000
@@ -1224,6 +1224,27 @@
 
 		break;
 
+	case WPTYPE_ZOOM:
+		asp = (gdouble) pwidth / (gdouble) virtual_geom->width;
+
+		if (asp > (gdouble) pheight / virtual_geom->height) {
+			src_geom->width = pwidth * virtual_geom->height / pheight;
+			src_geom->height = pheight;
+			src_geom->x = (pwidth - src_geom->width) / 2;
+			src_geom->y = 0;
+		} else {
+			src_geom->width = pwidth;
+			src_geom->height = pheight * virtual_geom->width / pwidth;
+			src_geom->x = 0;
+			src_geom->y = (pheight - src_geom->height) / 2;
+		}
+
+		dest_geom->x = dest_geom->y = 0;
+		dest_geom->width = field_geom->width;
+		dest_geom->height = field_geom->height;
+
+		break;
+
 	case WPTYPE_STRETCHED:
 		dest_geom->width = field_geom->width;
 		dest_geom->height = field_geom->height;
diff -ur control-center-2.8.1/libbackground/preferences.c control-center-2.8.1-bgzoom/libbackground/preferences.c
--- control-center-2.8.1/libbackground/preferences.c	2002-04-19 17:57:58.000000000 +0100
+++ control-center-2.8.1-bgzoom/libbackground/preferences.c	2004-12-12 17:22:12.000000000 +0000
@@ -49,6 +49,7 @@
 	{ WPTYPE_CENTERED, "WPTYPE_CENTERED", "centered"},
 	{ WPTYPE_SCALED, "WPTYPE_SCALED", "scaled"},
 	{ WPTYPE_STRETCHED, "WPTYPE_STRETCHED", "stretched"},
+	{ WPTYPE_ZOOM, "WPTYPE_ZOOM", "zoom"},
 	{ WPTYPE_NONE, "WPTYPE_NONE", "none"},
 	{ 0, NULL, NULL }
 };
@@ -360,6 +361,8 @@
 			type =  WPTYPE_SCALED;
 		} else if (!strncmp (string, "stretched", sizeof ("stretched"))) {
 			type =  WPTYPE_STRETCHED;
+		} else if (!strncmp (string, "zoom", sizeof ("zoom"))) {
+			type =  WPTYPE_ZOOM;
 		}
 		g_free (string);
 	}
@@ -409,6 +412,8 @@
 			return "scaled";
 		case WPTYPE_STRETCHED:
 			return "stretched";
+		case WPTYPE_ZOOM:
+			return "zoom";
 		case WPTYPE_NONE:
 			return "none";
 	        case WPTYPE_UNSET:
diff -ur control-center-2.8.1/libbackground/preferences.h control-center-2.8.1-bgzoom/libbackground/preferences.h
--- control-center-2.8.1/libbackground/preferences.h	2002-03-20 03:30:11.000000000 +0000
+++ control-center-2.8.1-bgzoom/libbackground/preferences.h	2004-12-12 17:22:12.000000000 +0000
@@ -52,7 +52,7 @@
 
 typedef enum _wallpaper_type_t {
 	WPTYPE_TILED = 0, WPTYPE_CENTERED, WPTYPE_SCALED,
-	WPTYPE_STRETCHED, WPTYPE_NONE,
+	WPTYPE_STRETCHED, WPTYPE_ZOOM, WPTYPE_NONE,
 	WPTYPE_UNSET
 } wallpaper_type_t;
 
