e9550f71f5
The lock screen re-rendered and re-committed every output's full screen-sized cairo surface on every 16ms timer tick regardless of whether anything had changed, burning 60%+ of a core the entire time the session was locked. Track a dirty flag per surface and render only when state actually changes: a keystroke, a system-status change, the clock minute rolling over, or an in-flight animation. update() now reports whether it redrew, so the timer commits only the surfaces that changed. Also fix the fade-in never formally completing. The eased alpha approaches 1.0 asymptotically while the 0.001 step throttle suppresses the final sub-threshold increments, leaving fade_alpha stuck just under 1.0. Since "fade_alpha < 1.0" is the "still animating" signal, that kept it permanently true and forced a full render every frame. Snap alpha to exactly 1.0 once the fade duration elapses so the animation completes. Idle CPU while locked drops from 60%+ to ~2%.