a95948e
--- nautilus-2.12.1/src/nautilus-window-manage-views.c.stretch	2005-07-11 04:37:43.000000000 -0400
a95948e
+++ nautilus-2.12.1/src/nautilus-window-manage-views.c	2005-10-27 14:35:29.000000000 -0400
a95948e
@@ -1532,10 +1532,7 @@
a95948e
 	action = gtk_action_group_get_action (window->details->main_action_group,
a95948e
 					      NAUTILUS_ACTION_ZOOM_NORMAL);
a95948e
 	gtk_action_set_visible (action, supports_zooming);
a95948e
-	gtk_action_set_sensitive (action,
a95948e
-				  TRUE);
a95948e
-       
a95948e
-	/* FIXME bugzilla.gnome.org 43442: Desensitize "Zoom Normal"? */
a95948e
+	gtk_action_set_sensitive (action, supports_zooming);
a95948e
 }
a95948e
 
a95948e
 static void
a95948e
--- nautilus-2.12.1/libnautilus-private/nautilus-icon-canvas-item.h.stretch	2005-06-22 12:25:45.000000000 -0400
a95948e
+++ nautilus-2.12.1/libnautilus-private/nautilus-icon-canvas-item.h	2005-10-27 14:35:29.000000000 -0400
a95948e
@@ -84,7 +84,8 @@
a95948e
 gboolean    nautilus_icon_canvas_item_hit_test_rectangle       (NautilusIconCanvasItem       *item,
a95948e
 								ArtIRect                      canvas_rect);
a95948e
 gboolean    nautilus_icon_canvas_item_hit_test_stretch_handles (NautilusIconCanvasItem       *item,
a95948e
-								ArtPoint                      world_point);
a95948e
+								ArtPoint                      world_point,
a95948e
+								GtkCornerType *corner);
a95948e
 void        nautilus_icon_canvas_item_invalidate_label_size    (NautilusIconCanvasItem       *item);
a95948e
 ArtDRect    nautilus_icon_canvas_item_get_icon_rectangle       (const NautilusIconCanvasItem *item);
a95948e
 ArtDRect    nautilus_icon_canvas_item_get_text_rectangle       (const NautilusIconCanvasItem *item);
a95948e
--- nautilus-2.12.1/libnautilus-private/nautilus-icon-container.c.stretch	2005-10-03 04:00:26.000000000 -0400
a95948e
+++ nautilus-2.12.1/libnautilus-private/nautilus-icon-container.c	2005-10-27 14:45:53.000000000 -0400
a95948e
@@ -3367,6 +3367,8 @@
a95948e
 	NautilusIcon *icon;
a95948e
 	ArtPoint world_point;
a95948e
 	GtkWidget *toplevel;
a95948e
+	GtkCornerType corner;
a95948e
+	GdkCursor *cursor;
a95948e
 
a95948e
 	details = container->details;
a95948e
 	icon = details->stretch_icon;
a95948e
@@ -3374,11 +3376,27 @@
a95948e
 	/* Check if we hit the stretch handles. */
a95948e
 	world_point.x = details->drag_x;
a95948e
 	world_point.y = details->drag_y;
a95948e
-	if (!nautilus_icon_canvas_item_hit_test_stretch_handles
a95948e
-	    (icon->item, world_point)) {
a95948e
+	if (!nautilus_icon_canvas_item_hit_test_stretch_handles (icon->item, world_point, &corner)) {
a95948e
 		return FALSE;
a95948e
 	}
a95948e
 
a95948e
+	switch (corner) {
a95948e
+	case GTK_CORNER_TOP_LEFT:
a95948e
+		cursor = gdk_cursor_new (GDK_TOP_LEFT_CORNER);
a95948e
+		break;
a95948e
+	case GTK_CORNER_BOTTOM_LEFT:
a95948e
+		cursor = gdk_cursor_new (GDK_BOTTOM_LEFT_CORNER);
a95948e
+		break;
a95948e
+	case GTK_CORNER_TOP_RIGHT:
a95948e
+		cursor = gdk_cursor_new (GDK_TOP_RIGHT_CORNER);
a95948e
+		break;
a95948e
+	case GTK_CORNER_BOTTOM_RIGHT:
a95948e
+		cursor = gdk_cursor_new (GDK_BOTTOM_RIGHT_CORNER);
a95948e
+		break;
a95948e
+	default: 
a95948e
+		cursor = NULL;
a95948e
+		break;
a95948e
+	}
a95948e
 	/* Set up the dragging. */
a95948e
 	details->drag_state = DRAG_STATE_STRETCH;
a95948e
 	eel_canvas_w2c (EEL_CANVAS (container),
a95948e
@@ -3396,8 +3414,10 @@
a95948e
 	eel_canvas_item_grab (EEL_CANVAS_ITEM (icon->item),
a95948e
 				(GDK_POINTER_MOTION_MASK
a95948e
 				 | GDK_BUTTON_RELEASE_MASK),
a95948e
-				NULL,
a95948e
+				cursor,
a95948e
 				GDK_CURRENT_TIME);
a95948e
+	if (cursor)
a95948e
+		gdk_cursor_unref (cursor);
a95948e
 
a95948e
 	/* Ensure the window itself is focused.. */
a95948e
 	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (container));
a95948e
@@ -3458,6 +3478,43 @@
a95948e
 	}
a95948e
 }
a95948e
 
a95948e
+static gboolean
a95948e
+keyboard_stretching (NautilusIconContainer *container,
a95948e
+		     GdkEventKey           *event)
a95948e
+{
a95948e
+	NautilusIcon *icon;
a95948e
+	guint size;
a95948e
+
a95948e
+	icon = container->details->stretch_icon;
a95948e
+
a95948e
+	if (icon == NULL || !icon->is_selected) {
a95948e
+		return FALSE;
a95948e
+	}
a95948e
+
a95948e
+	icon_get_size (container, icon, &size);
a95948e
+
a95948e
+	switch (event->keyval) {
a95948e
+	case GDK_equal:
a95948e
+	case GDK_plus:
a95948e
+	case GDK_KP_Add:
a95948e
+		icon_set_size (container, icon, size + 5, FALSE, FALSE);
a95948e
+		break;
a95948e
+	case GDK_minus:
a95948e
+	case GDK_KP_Subtract:
a95948e
+		icon_set_size (container, icon, size - 5, FALSE, FALSE);
a95948e
+		break;
a95948e
+	case GDK_0:
a95948e
+	case GDK_KP_0:
a95948e
+		nautilus_icon_container_move_icon (container, icon,
a95948e
+						   icon->x, icon->y,
a95948e
+						   1.0, 1.0,
a95948e
+						   FALSE, TRUE, TRUE);
a95948e
+		break;
a95948e
+	}
a95948e
+	
a95948e
+	return TRUE;
a95948e
+}
a95948e
+
a95948e
 static void
a95948e
 ungrab_stretch_icon (NautilusIconContainer *container)
a95948e
 {
a95948e
@@ -3489,7 +3546,7 @@
a95948e
 	redo_layout (container);
a95948e
 }
a95948e
 
a95948e
-static void
a95948e
+static gboolean
a95948e
 undo_stretching (NautilusIconContainer *container)
a95948e
 {
a95948e
 	NautilusIcon *stretched_icon;
a95948e
@@ -3497,7 +3554,7 @@
a95948e
 	stretched_icon = container->details->stretch_icon;
a95948e
 
a95948e
 	if (stretched_icon == NULL) {
a95948e
-		return;
a95948e
+		return FALSE;
a95948e
 	}
a95948e
 
a95948e
 	if (container->details->drag_state == DRAG_STATE_STRETCH) {
a95948e
@@ -3519,6 +3576,8 @@
a95948e
 	container->details->stretch_icon = NULL;				
a95948e
 	emit_stretch_ended (container, stretched_icon);
a95948e
 	redo_layout (container);
a95948e
+
a95948e
+	return TRUE;
a95948e
 }
a95948e
 
a95948e
 static gboolean
a95948e
@@ -3857,9 +3916,19 @@
a95948e
 			
a95948e
 			handled = TRUE;
a95948e
 			break;
a95948e
-		case GDK_Escape:
a95948e
-			undo_stretching (container);
a95948e
-			handled = TRUE;
a95948e
+ 		case GDK_Escape:
a95948e
+			handled = undo_stretching (container);
a95948e
+			break;
a95948e
+ 		case GDK_plus:
a95948e
+ 		case GDK_minus:
a95948e
+ 		case GDK_equal:
a95948e
+ 		case GDK_KP_Add:
a95948e
+ 		case GDK_KP_Subtract:
a95948e
+ 		case GDK_0:
a95948e
+ 		case GDK_KP_0:
a95948e
+			if (event->state & GDK_CONTROL_MASK) {
a95948e
+				handled = keyboard_stretching (container, event);
a95948e
+			}
a95948e
 			break;
a95948e
 		case GDK_F10:
a95948e
 			/* handle Ctrl+F10 because we want to display the
a95948e
--- nautilus-2.12.1/libnautilus-private/nautilus-icon-canvas-item.c.stretch	2005-09-26 11:30:05.000000000 -0400
a95948e
+++ nautilus-2.12.1/libnautilus-private/nautilus-icon-canvas-item.c	2005-10-27 14:35:29.000000000 -0400
a95948e
@@ -44,6 +44,7 @@
a95948e
 #include <eel/eel-accessibility.h>
a95948e
 #include <gdk-pixbuf/gdk-pixbuf.h>
a95948e
 #include <gtk/gtksignal.h>
a95948e
+#include <gdk/gdk.h>
a95948e
 #include <libart_lgpl/art_rgb.h>
a95948e
 #include <libart_lgpl/art_rgb_affine.h>
a95948e
 #include <libart_lgpl/art_rgb_rgba_affine.h>
a95948e
@@ -209,7 +210,8 @@
a95948e
 						      GdkGC                         *gc);
a95948e
 
a95948e
 static gboolean hit_test_stretch_handle              (NautilusIconCanvasItem        *item,
a95948e
-						      ArtIRect                       canvas_rect);
a95948e
+						      ArtIRect                       canvas_rect,
a95948e
+						      GtkCornerType *corner);
a95948e
 static void     clear_rounded_corners                (GdkPixbuf                     *destination_pixbuf,
a95948e
 						      GdkPixbuf                     *corner_pixbuf,
a95948e
 						      int                            corner_size);
a95948e
@@ -1152,12 +1154,30 @@
a95948e
 	draw_or_measure_label_text (item, drawable, create_mask, icon_rect);
a95948e
 }
a95948e
 
a95948e
+static GdkPixbuf *
a95948e
+get_knob_pixbuf (void)
a95948e
+{
a95948e
+	GdkPixbuf *knob_pixbuf;
a95948e
+	char *knob_filename;
a95948e
+
a95948e
+	knob_pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
a95948e
+						"stock-nautilus-knob",
a95948e
+						8, 0, NULL);
a95948e
+	if (!knob_pixbuf) {
a95948e
+		knob_filename = nautilus_pixmap_file ("knob.png");
a95948e
+		knob_pixbuf = gdk_pixbuf_new_from_file (knob_filename, NULL);
a95948e
+		g_free (knob_filename);
a95948e
+	}
a95948e
+
a95948e
+	return knob_pixbuf;
a95948e
+}
a95948e
+
a95948e
 static void
a95948e
 draw_stretch_handles (NautilusIconCanvasItem *item, GdkDrawable *drawable,
a95948e
 		      const ArtIRect *rect)
a95948e
 {
a95948e
+	GtkWidget *widget;
a95948e
 	GdkGC *gc;
a95948e
-	char *knob_filename;
a95948e
 	GdkPixbuf *knob_pixbuf;
a95948e
 	GdkBitmap *stipple;
a95948e
 	int knob_width, knob_height;
a95948e
@@ -1166,17 +1186,27 @@
a95948e
 		return;
a95948e
 	}
a95948e
 
a95948e
+	widget = GTK_WIDGET (EEL_CANVAS_ITEM (item)->canvas);
a95948e
+
a95948e
 	gc = gdk_gc_new (drawable);
a95948e
 
a95948e
-	knob_filename = nautilus_pixmap_file ("knob.png");
a95948e
-	knob_pixbuf = gdk_pixbuf_new_from_file (knob_filename, NULL);
a95948e
+	knob_pixbuf = get_knob_pixbuf ();
a95948e
 	knob_width = gdk_pixbuf_get_width (knob_pixbuf);
a95948e
 	knob_height = gdk_pixbuf_get_height (knob_pixbuf);
a95948e
 
a95948e
 	stipple = eel_stipple_bitmap_for_screen (
a95948e
 			gdk_drawable_get_screen (GDK_DRAWABLE (drawable)));
a95948e
 	
a95948e
-	/* first draw the box */		
a95948e
+	/* first draw the box */
a95948e
+	gdk_gc_set_rgb_fg_color (gc, &widget->style->white);
a95948e
+	gdk_draw_rectangle
a95948e
+		(drawable, gc, FALSE,
a95948e
+			    rect->x0,
a95948e
+			    rect->y0,
a95948e
+			    rect->x1 - rect->x0 - 1,
a95948e
+			    rect->y1 - rect->y0 - 1);
a95948e
+
a95948e
+	gdk_gc_set_rgb_fg_color (gc, &widget->style->black);
a95948e
 	gdk_gc_set_stipple (gc, stipple);
a95948e
 	gdk_gc_set_fill (gc, GDK_STIPPLED);
a95948e
 	gdk_draw_rectangle
a95948e
@@ -1192,8 +1222,6 @@
a95948e
 	draw_pixbuf (knob_pixbuf, drawable, rect->x0, rect->y1 - knob_height);
a95948e
 	draw_pixbuf (knob_pixbuf, drawable, rect->x1 - knob_width, rect->y0);
a95948e
 	draw_pixbuf (knob_pixbuf, drawable, rect->x1 - knob_width, rect->y1 - knob_height);
a95948e
-	
a95948e
-	g_free (knob_filename);
a95948e
 	g_object_unref (knob_pixbuf);	
a95948e
 
a95948e
 	g_object_unref (gc);
a95948e
@@ -1828,7 +1856,7 @@
a95948e
 	}
a95948e
 
a95948e
 	/* Check for hits in the stretch handles. */
a95948e
-	if (hit_test_stretch_handle (icon_item, canvas_rect)) {
a95948e
+	if (hit_test_stretch_handle (icon_item, canvas_rect, NULL)) {
a95948e
 		return TRUE;
a95948e
 	}
a95948e
 	
a95948e
@@ -2055,12 +2083,13 @@
a95948e
 /* Check if one of the stretch handles was hit. */
a95948e
 static gboolean
a95948e
 hit_test_stretch_handle (NautilusIconCanvasItem *item,
a95948e
-			 ArtIRect probe_canvas_rect)
a95948e
+			 ArtIRect probe_canvas_rect,
a95948e
+			 GtkCornerType *corner)
a95948e
 {
a95948e
 	ArtIRect icon_rect;
a95948e
-	char *knob_filename;
a95948e
 	GdkPixbuf *knob_pixbuf;
a95948e
 	int knob_width, knob_height;
a95948e
+	int hit_corner;
a95948e
 	
a95948e
 	g_return_val_if_fail (NAUTILUS_IS_ICON_CANVAS_ITEM (item), FALSE);
a95948e
 
a95948e
@@ -2075,24 +2104,36 @@
a95948e
 		return FALSE;
a95948e
 	}
a95948e
 
a95948e
-	knob_filename = nautilus_pixmap_file ("knob.png");
a95948e
-	knob_pixbuf = gdk_pixbuf_new_from_file (knob_filename, NULL);
a95948e
+	
a95948e
+	knob_pixbuf = get_knob_pixbuf ();
a95948e
 	knob_width = gdk_pixbuf_get_width (knob_pixbuf);
a95948e
 	knob_height = gdk_pixbuf_get_height (knob_pixbuf);
a95948e
+	g_object_unref (knob_pixbuf);
a95948e
 
a95948e
-	g_free (knob_filename);
a95948e
-	g_object_unref (knob_pixbuf);	
a95948e
-	
a95948e
 	/* Check for hits in the stretch handles. */
a95948e
-	return (probe_canvas_rect.x0 < icon_rect.x0 + knob_width
a95948e
-     		|| probe_canvas_rect.x1 >= icon_rect.x1 - knob_width)
a95948e
-		&& (probe_canvas_rect.y0 < icon_rect.y0 + knob_height
a95948e
-		    || probe_canvas_rect.y1 >= icon_rect.y1 - knob_height);
a95948e
+	hit_corner = -1;
a95948e
+	if (probe_canvas_rect.x0 < icon_rect.x0 + knob_width) {
a95948e
+		if (probe_canvas_rect.y0 < icon_rect.y0 + knob_height)
a95948e
+			hit_corner = GTK_CORNER_TOP_LEFT;
a95948e
+		else if (probe_canvas_rect.y1 >= icon_rect.y1 - knob_height)
a95948e
+			hit_corner = GTK_CORNER_BOTTOM_LEFT;
a95948e
+	}
a95948e
+	else if (probe_canvas_rect.x1 >= icon_rect.x1 - knob_width) {
a95948e
+		if (probe_canvas_rect.y0 < icon_rect.y0 + knob_height)
a95948e
+			hit_corner = GTK_CORNER_TOP_RIGHT;
a95948e
+		else if (probe_canvas_rect.y1 >= icon_rect.y1 - knob_height)
a95948e
+			hit_corner = GTK_CORNER_BOTTOM_RIGHT;
a95948e
+	}
a95948e
+	if (corner)
a95948e
+		*corner = hit_corner;
a95948e
+
a95948e
+	return hit_corner != -1;
a95948e
 }
a95948e
 
a95948e
 gboolean
a95948e
 nautilus_icon_canvas_item_hit_test_stretch_handles (NautilusIconCanvasItem *item,
a95948e
-						    ArtPoint world_point)
a95948e
+						    ArtPoint world_point,
a95948e
+						    GtkCornerType *corner)
a95948e
 {
a95948e
 	ArtIRect canvas_rect;
a95948e
 
a95948e
@@ -2105,7 +2146,7 @@
a95948e
 			  &canvas_rect.y0);
a95948e
 	canvas_rect.x1 = canvas_rect.x0 + 1;
a95948e
 	canvas_rect.y1 = canvas_rect.y0 + 1;
a95948e
-	return hit_test_stretch_handle (item, canvas_rect);
a95948e
+	return hit_test_stretch_handle (item, canvas_rect, corner);
a95948e
 }
a95948e
 
a95948e
 /* nautilus_icon_canvas_item_hit_test_rectangle