summaryrefslogtreecommitdiffstats
path: root/src/core/render_widget_host_view_qt.cpp
diff options
context:
space:
mode:
authorArvid Nilsson <anilsson@blackberry.com>2013-12-13 15:57:26 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-31 17:31:13 +0100
commita4b0e2183c23c0173167833c75f0e2970f3ab524 (patch)
tree43d60fee79115c6634991696e3db1c152eafcc4a /src/core/render_widget_host_view_qt.cpp
parentf55df93be18e990d6f8daf7f691c75303c57ad5f (diff)
Quick: Support reparenting
To support reparenting, we make the compositing surface independent of the window by using gfx::TEXTURE_TRANSPORT. We also need to be able to keep frame data across window changes so we can reconstruct the QSGNode tree in a new context, so extract that data into DelegatedFrameNodeData class. Any context-specific data is still stored in DelegatedFrameNode. Also hook up window changes to WebContents::WasShown/Hidden for Quick. Remove checking of Qt isVisible state, this mechanism is used to sync Chromium with Qt, not the other way around. WasShown/Hidden is orthogonal to Show/Hide, and can use different triggers. However for Widgets it probably makes sense to hook both up to widget visibility. Change-Id: I1ef4b50cd61b8e54b791e03f0b41929c42fec8bf Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'src/core/render_widget_host_view_qt.cpp')
-rw-r--r--src/core/render_widget_host_view_qt.cpp53
1 files changed, 21 insertions, 32 deletions
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index 0e85c5857..9279c57b0 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -141,11 +141,12 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget
: m_host(content::RenderWidgetHostImpl::From(widget))
, m_gestureRecognizer(ui::GestureRecognizer::Create(this))
, m_backingStore(0)
+ , m_frameNodeData(new DelegatedFrameNodeData)
+ , m_needsDelegatedFrameAck(false)
, m_adapterClient(0)
, m_anchorPositionWithinSelection(0)
, m_cursorPositionWithinSelection(0)
, m_initPending(false)
- , m_readyForSurface(false)
{
m_host->SetView(this);
}
@@ -244,8 +245,7 @@ gfx::NativeView RenderWidgetHostViewQt::GetNativeView() const
gfx::NativeViewId RenderWidgetHostViewQt::GetNativeViewId() const
{
- const_cast<RenderWidgetHostViewQt *>(this)->m_readyForSurface = true;
- return m_delegate->nativeWindowIdForCompositor();
+ return 0;
}
gfx::NativeViewAccessible RenderWidgetHostViewQt::GetNativeViewAccessible()
@@ -333,17 +333,11 @@ gfx::NativeView RenderWidgetHostViewQt::BuildInputMethodsGtkMenu()
void RenderWidgetHostViewQt::WasShown()
{
- if (m_delegate->isVisible())
- return;
-
m_host->WasShown();
}
void RenderWidgetHostViewQt::WasHidden()
{
- if (!m_delegate->isVisible())
- return;
-
m_host->WasHidden();
}
@@ -584,10 +578,12 @@ bool RenderWidgetHostViewQt::HasAcceleratedSurface(const gfx::Size&)
void RenderWidgetHostViewQt::OnSwapCompositorFrame(uint32 output_surface_id, scoped_ptr<cc::CompositorFrame> frame)
{
- Q_ASSERT(!m_pendingFrameData);
- Q_ASSERT(frame->delegated_frame_data);
+ Q_ASSERT(!m_needsDelegatedFrameAck);
+ m_needsDelegatedFrameAck = true;
m_pendingOutputSurfaceId = output_surface_id;
- m_pendingFrameData = frame->delegated_frame_data.Pass();
+ Q_ASSERT(frame->delegated_frame_data);
+ Q_ASSERT(!m_frameNodeData->frameData || m_frameNodeData->frameData->resource_list.empty());
+ m_frameNodeData->frameData = frame->delegated_frame_data.Pass();
m_delegate->update();
}
@@ -611,12 +607,9 @@ gfx::Rect RenderWidgetHostViewQt::GetBoundsInRootWindow()
gfx::GLSurfaceHandle RenderWidgetHostViewQt::GetCompositingSurface()
{
- gfx::NativeViewId nativeViewId = GetNativeViewId();
-#if defined(OS_WIN)
- return nativeViewId ? gfx::GLSurfaceHandle(reinterpret_cast<gfx::PluginWindowHandle>(nativeViewId), gfx::NATIVE_TRANSPORT) : gfx::GLSurfaceHandle();
-#else
- return nativeViewId ? gfx::GLSurfaceHandle(nativeViewId, gfx::NATIVE_TRANSPORT) : gfx::GLSurfaceHandle();
-#endif
+ if (!m_delegate->supportsHardwareAcceleration())
+ return gfx::GLSurfaceHandle();
+ return gfx::GLSurfaceHandle(gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT);
}
void RenderWidgetHostViewQt::SetHasHorizontalScrollbar(bool) { }
@@ -648,20 +641,19 @@ void RenderWidgetHostViewQt::paint(QPainter *painter, const QRectF& boundingRect
QSGNode *RenderWidgetHostViewQt::updatePaintNode(QSGNode *oldNode, QQuickWindow *window)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0))
- if (!m_pendingFrameData)
- return oldNode;
-
DelegatedFrameNode *frameNode = static_cast<DelegatedFrameNode *>(oldNode);
if (!frameNode)
frameNode = new DelegatedFrameNode(window);
- frameNode->commit(m_pendingFrameData.get(), &m_resourcesToRelease);
- m_pendingFrameData.reset();
+ frameNode->commit(m_frameNodeData.data(), &m_resourcesToRelease);
// This is possibly called from the Qt render thread, post the ack back to the UI
// to tell the child compositors to release resources and trigger a new frame.
- content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
- base::Bind(&RenderWidgetHostViewQt::sendDelegatedFrameAck, AsWeakPtr()));
+ if (m_needsDelegatedFrameAck) {
+ m_needsDelegatedFrameAck = false;
+ content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
+ base::Bind(&RenderWidgetHostViewQt::sendDelegatedFrameAck, AsWeakPtr()));
+ }
return frameNode;
#else
@@ -743,11 +735,10 @@ QVariant RenderWidgetHostViewQt::inputMethodQuery(Qt::InputMethodQuery query) co
}
}
-void RenderWidgetHostViewQt::compositingSurfaceUpdated()
+void RenderWidgetHostViewQt::windowChanged()
{
- // Don't report an update until we get asked at least once.
- if (m_readyForSurface)
- m_host->CompositingSurfaceUpdated();
+ if (m_delegate->window())
+ m_host->NotifyScreenInfoChanged();
}
void RenderWidgetHostViewQt::ProcessAckedTouchEvent(const content::TouchEventWithLatencyInfo &touch, content::InputEventAckState ack_result) {
@@ -767,12 +758,10 @@ void RenderWidgetHostViewQt::ProcessAckedTouchEvent(const content::TouchEventWit
void RenderWidgetHostViewQt::sendDelegatedFrameAck()
{
cc::CompositorFrameAck ack;
- cc::TransferableResource::ReturnResources(m_resourcesToRelease, &ack.resources);
+ m_resourcesToRelease.swap(ack.resources);
content::RenderWidgetHostImpl::SendSwapCompositorFrameAck(
m_host->GetRoutingID(), m_pendingOutputSurfaceId,
m_host->GetProcess()->GetID(), ack);
-
- m_resourcesToRelease.clear();
}
void RenderWidgetHostViewQt::Paint(const gfx::Rect& damage_rect)