diff options
author | Arvid Nilsson <anilsson@blackberry.com> | 2013-12-13 15:57:26 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-31 17:31:13 +0100 |
commit | a4b0e2183c23c0173167833c75f0e2970f3ab524 (patch) | |
tree | 43d60fee79115c6634991696e3db1c152eafcc4a /src/core/render_widget_host_view_qt.cpp | |
parent | f55df93be18e990d6f8daf7f691c75303c57ad5f (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.cpp | 53 |
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) |