Index: libs/gtkmm2ext/scroomer.cc
===================================================================
--- libs/gtkmm2ext/scroomer.cc	(revision 7223)
+++ libs/gtkmm2ext/scroomer.cc	(working copy)
@@ -103,17 +103,33 @@
 		unzoomed_val = max(unzoomed_val, adj.get_lower());
 		break;
 	case Handle1:
+
 		unzoomed_page += scale * fract * range;
 		unzoomed_page = min(unzoomed_page, adj.get_upper() - unzoomed_val);
 		unzoomed_page = max(unzoomed_page, min_page_size);
+		
+		if (pinch){
+			temp = unzoomed_val + unzoomed_page;
+			unzoomed_val -= scale * fract * range * 0.5;
+			unzoomed_val = min(unzoomed_val, temp - min_page_size);
+			unzoomed_val = max(unzoomed_val, adj.get_lower());
+		}
+		
 		break;
 	case Handle2:
 		temp = unzoomed_val + unzoomed_page;
 		unzoomed_val += scale * fract * range;
 		unzoomed_val = min(unzoomed_val, temp - min_page_size);
 		unzoomed_val = max(unzoomed_val, adj.get_lower());
-
+		
 		unzoomed_page = temp - unzoomed_val;
+		
+		if (pinch){
+			
+			unzoomed_page -= scale * fract * range;
+		}
+		
+		unzoomed_page = min(unzoomed_page, adj.get_upper() - unzoomed_val);		
 		unzoomed_page = max(unzoomed_page, min_page_size);
 		break;
 	default:
@@ -178,28 +194,18 @@
 		val = unzoomed_val;
 		page = unzoomed_page;
 	}
-
+	
 	adj.set_page_size(page);
+	adj.set_value(val);
+	adj.value_changed();
 	
-	if (val == adj.get_value()) {
-		adj.value_changed();
-	}
-
-	if (val < adj.get_lower()) {
-		adj.value_changed();
-	} else if (val > adj.get_upper()) {
-		adj.value_changed();
-	} else {
-		adj.set_value(val);
-	}
-
 	return true;
 }
 
 bool
 Scroomer::on_button_press_event (GdkEventButton* ev)
 {
-	if (ev->button == 1) {
+	if (ev->button == 1 || ev->button == 3) {
 		Component comp = point_in(ev->y);
 
 		if (comp == Total || comp == None) {
@@ -212,7 +218,13 @@
 		unzoomed_val = adj.get_value();
 		unzoomed_page = adj.get_page_size();
 		grab_window = ev->window;
+		pinch = false;
+		
+		if (ev->button == 3){
+			pinch = true;
+		}
 	}
+	
 	return false;
 }
 
@@ -229,7 +241,7 @@
 		return true;
 	}
 
-	if (ev->button != 1) {
+	if (ev->button != 1 && ev->button != 3) {
 		return true;
 	}
 
