drm: Cancel any scheduled repaints in the leave vt handler
If we don't cancel the repaint, we end up pointlessly redrawing the output.
What's worse is that pageflipping to the new buffer eventually fails and
we miss the finish_frame callback, leaving the compositor stuck when we
re-enter the vt.
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index 90013d8..1f340b7 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -835,10 +835,21 @@
ec->prev_state = compositor->state;
compositor->state = WESTON_COMPOSITOR_SLEEPING;
+ /* If we have a repaint scheduled (either from a
+ * pending pageflip or the idle handler), make sure we
+ * cancel that so we don't try to pageflip when we're
+ * vt switched away. The SLEEPING state will prevent
+ * further attemps at repainting. When we switch
+ * back, we schedule a repaint, which will process
+ * pending frame callbacks. */
+
+ wl_list_for_each(output, &ec->base.output_list, link) {
+ output->repaint_needed = 0;
+ drm_output_set_cursor(output, NULL);
+ }
+
wl_list_for_each(input, &compositor->input_device_list, link)
evdev_remove_devices(input);
- wl_list_for_each(output, &ec->base.output_list, link)
- drm_output_set_cursor(output, NULL);
if (drmDropMaster(ec->drm.fd) < 0)
fprintf(stderr, "failed to drop master: %m\n");