Introduce output zoom.

Ideally, we would want to use <modifier>+Scroll binding but that will have
to wait for axis events. For now we just use keybindings. Zoom in/out with
Super+Up/Down.
diff --git a/src/shell.c b/src/shell.c
index 8628462..ee71dcc 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -1035,6 +1035,50 @@
 }
 
 static void
+zoom_in_binding(struct wl_input_device *device, uint32_t time,
+	       uint32_t key, uint32_t button, uint32_t state, void *data)
+{
+	struct weston_input_device *wd = (struct weston_input_device *) device;
+	struct weston_compositor *compositor = wd->compositor;
+	struct weston_output *output;
+
+	wl_list_for_each(output, &compositor->output_list, link) {
+		if (pixman_region32_contains_point(&output->region,
+						device->x, device->y, NULL)) {
+			output->zoom.active = 1;
+			output->zoom.level -= output->zoom.increment;
+
+			if (output->zoom.level < output->zoom.increment)
+				output->zoom.level = output->zoom.increment;
+
+			weston_output_update_zoom(output, device->x, device->y);
+		}
+	}
+}
+
+static void
+zoom_out_binding(struct wl_input_device *device, uint32_t time,
+	       uint32_t key, uint32_t button, uint32_t state, void *data)
+{
+	struct weston_input_device *wd = (struct weston_input_device *) device;
+	struct weston_compositor *compositor = wd->compositor;
+	struct weston_output *output;
+
+	wl_list_for_each(output, &compositor->output_list, link) {
+		if (pixman_region32_contains_point(&output->region,
+						device->x, device->y, NULL)) {
+			output->zoom.level += output->zoom.increment;
+			if (output->zoom.level >= 1.0) {
+				output->zoom.active = 0;
+				output->zoom.level = 1.0;
+			}
+
+			weston_output_update_zoom(output, device->x, device->y);
+		}
+	}
+}
+
+static void
 terminate_binding(struct wl_input_device *device, uint32_t time,
 		  uint32_t key, uint32_t button, uint32_t state, void *data)
 {
@@ -1833,6 +1877,10 @@
 				    terminate_binding, ec);
 	weston_compositor_add_binding(ec, 0, BTN_LEFT, 0,
 				    click_to_activate_binding, ec);
+	weston_compositor_add_binding(ec, KEY_UP, 0, MODIFIER_SUPER,
+				    zoom_in_binding, shell);
+	weston_compositor_add_binding(ec, KEY_DOWN, 0, MODIFIER_SUPER,
+				    zoom_out_binding, shell);
 	weston_compositor_add_binding(ec, 0, BTN_LEFT,
 				      MODIFIER_SUPER | MODIFIER_ALT,
 				      rotate_binding, NULL);