-
Ken Thomases authored
Some Windows apps cause user32 to flush the window surface much faster than the display refresh rate. The Mac driver only marks its window as needing to be redrawn and lets Cocoa decide how often to actually redraw. Unfortunately, Cocoa redraws each time through the run loop and, since the Mac driver uses a run loop source to convey messages from background threads to the main thread, it redraws after every batch of messages. On some versions of OS X, this excessive drawing provokes synchronization with the window server's buffer swaps, preventing the main thread from being responsive. Even when that doesn't happen, it's wasteful. So, we set our windows' autodisplay property to false so that Cocoa never displays windows itself. Then, we arrange to call -displayIfNeeded once per display refresh cycle using a CVDisplayLink. We maintain one CVDisplayLink per display (on demand), move windows among them as the windows change screens, start them when they acquire their first window, and stop them when they have none left. Signed-off-by: Ken Thomases <ken@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
3beec95a