Skip to content

clutter-actor: Keep is_dirty unchanged for culled actors

In a multi-monitor setup there is a separate paint run for each monitor. If an actor doesn't intersect the first monitor painted then it is culled out for that monitor to save time. Unfortunately this would mean clutter_actor_paint was setting is_dirty = FALSE before the actor had yet been painted on any monitor.

This meant that effects like ClutterOffscreenEffect were not receiving the flag CLUTTER_EFFECT_PAINT_ACTOR_DIRTY when they should have, and so would rightfully think they don't need to do a full internal invalidation. So ClutterOffscreenEffect, and probably other effects, did not repaint correctly unless on the first monitor in the list.

The fix is to simply avoid setting is_dirty = FALSE on those paint runs where the actor has been culled out (clutter_actor_continue_paint wasn't called). It is only safe to clear the flag after clutter_actor_continue_paint has been called at least once per stage paint.

Closes: gnome-shell#1049 (closed)

Edited by Daniel van Vugt

Merge request reports