compositor: Add a repaint debugging mechanism
Toggle on/off with Super+SPACE.
diff --git a/src/shell.c b/src/shell.c
index 2b61202..4725335 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -73,6 +73,8 @@
struct wl_list surfaces;
struct weston_process process;
} screensaver;
+
+ struct weston_surface *debug_repaint_surface;
};
enum shell_surface_type {
@@ -1970,6 +1972,41 @@
}
static void
+debug_repaint_binding(struct wl_input_device *device, uint32_t time,
+ uint32_t key, uint32_t button, uint32_t state, void *data)
+{
+ struct weston_compositor *compositor = data;
+ struct wl_shell *shell =
+ container_of(compositor->shell, struct wl_shell, shell);
+ struct weston_surface *surface;
+
+ if (shell->debug_repaint_surface) {
+ weston_surface_destroy(shell->debug_repaint_surface);
+ shell->debug_repaint_surface = NULL;
+ } else {
+ surface = weston_surface_create(compositor);
+ weston_surface_set_color(surface, 1.0, 0.0, 0.0, 0.2);
+ weston_surface_configure(surface, 0, 0, 8192, 8192);
+ wl_list_insert(&compositor->fade_layer.surface_list,
+ &surface->layer_link);
+ weston_surface_assign_output(surface);
+ pixman_region32_init(&surface->input);
+
+ /* Here's the dirty little trick that makes the
+ * repaint debugging work: we force an
+ * update_transform first to update dependent state
+ * and clear the geometry.dirty bit. Then we clear
+ * the surface damage so it only gets repainted
+ * piecewise as we repaint other things. */
+
+ weston_surface_update_transform(surface);
+ pixman_region32_fini(&surface->damage);
+ pixman_region32_init(&surface->damage);
+ shell->debug_repaint_surface = surface;
+ }
+}
+
+static void
shell_destroy(struct weston_shell *base)
{
struct wl_shell *shell = container_of(base, struct wl_shell, shell);
@@ -2060,6 +2097,9 @@
weston_compositor_add_binding(ec, KEY_BRIGHTNESSUP, 0, 0,
backlight_binding, ec);
+ weston_compositor_add_binding(ec, KEY_SPACE, 0, MODIFIER_SUPER,
+ debug_repaint_binding, ec);
+
ec->shell = &shell->shell;
return 0;