#include "config.h"
#include "DisplayLink.h"
#if ENABLE(WEBPROCESS_WINDOWSERVER_BLOCKING)
#include "DrawingAreaMessages.h"
#include "WebProcessMessages.h"
#include "WebProcessProxy.h"
#include <wtf/ProcessPrivilege.h>
namespace WebKit {
DisplayLink::DisplayLink(WebCore::PlatformDisplayID displayID, WebProcessProxy& webProcessProxy)
: m_connection(webProcessProxy.connection())
, m_displayID(displayID)
{
ASSERT(hasProcessPrivilege(ProcessPrivilege::CanCommunicateWithWindowServer));
CVReturn error = CVDisplayLinkCreateWithCGDisplay(displayID, &m_displayLink);
if (error) {
WTFLogAlways("Could not create a display link: %d", error);
return;
}
error = CVDisplayLinkSetOutputCallback(m_displayLink, displayLinkCallback, this);
if (error) {
WTFLogAlways("Could not set the display link output callback: %d", error);
return;
}
error = CVDisplayLinkStart(m_displayLink);
if (error)
WTFLogAlways("Could not start the display link: %d", error);
}
DisplayLink::~DisplayLink()
{
ASSERT(hasProcessPrivilege(ProcessPrivilege::CanCommunicateWithWindowServer));
ASSERT(m_displayLink);
if (!m_displayLink)
return;
CVDisplayLinkStop(m_displayLink);
CVDisplayLinkRelease(m_displayLink);
}
void DisplayLink::addObserver(unsigned observerID)
{
m_observers.add(observerID);
}
void DisplayLink::removeObserver(unsigned observerID)
{
m_observers.remove(observerID);
}
bool DisplayLink::hasObservers() const
{
return !m_observers.isEmpty();
}
CVReturn DisplayLink::displayLinkCallback(CVDisplayLinkRef displayLinkRef, const CVTimeStamp*, const CVTimeStamp*, CVOptionFlags, CVOptionFlags*, void* data)
{
DisplayLink* displayLink = static_cast<DisplayLink*>(data);
displayLink->m_connection->send(Messages::WebProcess::DisplayWasRefreshed(displayLink->m_displayID), 0);
return kCVReturnSuccess;
}
}
#endif