diff options
Diffstat (limited to 'src/core/render_widget_host_view_qt_delegate_item.cpp')
-rw-r--r-- | src/core/render_widget_host_view_qt_delegate_item.cpp | 93 |
1 files changed, 50 insertions, 43 deletions
diff --git a/src/core/render_widget_host_view_qt_delegate_item.cpp b/src/core/render_widget_host_view_qt_delegate_item.cpp index dcf7e104c..23e5bc935 100644 --- a/src/core/render_widget_host_view_qt_delegate_item.cpp +++ b/src/core/render_widget_host_view_qt_delegate_item.cpp @@ -22,8 +22,10 @@ RenderWidgetHostViewQtDelegateItem::RenderWidgetHostViewQtDelegateItem(RenderWid { setFlag(ItemHasContents); setAcceptedMouseButtons(Qt::AllButtons); + setKeepMouseGrab(true); setAcceptHoverEvents(true); setAcceptTouchEvents(true); + setKeepTouchGrab(true); if (!isPopup) { setFocus(true); setActiveFocusOnTab(true); @@ -33,7 +35,7 @@ RenderWidgetHostViewQtDelegateItem::RenderWidgetHostViewQtDelegateItem(RenderWid RenderWidgetHostViewQtDelegateItem::~RenderWidgetHostViewQtDelegateItem() { - releaseVulkanResources(); + releaseTextureResources(); if (m_widgetDelegate) { m_widgetDelegate->Unbind(); m_widgetDelegate->Destroy(); @@ -204,6 +206,8 @@ void RenderWidgetHostViewQtDelegateItem::focusInEvent(QFocusEvent *event) if (QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(this)) { if (auto *focusChild = iface->focusChild()) { QAccessibleEvent focusEvent(focusChild, QAccessible::Focus); + if (focusEvent.object()) + focusEvent.setChild(-1); QAccessible::updateAccessibility(&focusEvent); } } @@ -319,14 +323,16 @@ void RenderWidgetHostViewQtDelegateItem::itemChange(ItemChange change, const Ite if (value.window) { m_windowConnections.append(connect(value.window, &QQuickWindow::beforeRendering, this, &RenderWidgetHostViewQtDelegateItem::onBeforeRendering, Qt::DirectConnection)); + m_windowConnections.append(connect(value.window, &QQuickWindow::afterFrameEnd, this, + &RenderWidgetHostViewQtDelegateItem::onAfterFrameEnd, + Qt::DirectConnection)); m_windowConnections.append(connect(value.window, SIGNAL(xChanged(int)), SLOT(onWindowPosChanged()))); - m_windowConnections.append(connect(value.window, SIGNAL(yChanged(int)), SLOT(onWindowPosChanged()))); -#if QT_CONFIG(webengine_vulkan) + m_windowConnections.append( + connect(value.window, SIGNAL(yChanged(int)), SLOT(onWindowPosChanged()))); m_windowConnections.append( connect(value.window, &QQuickWindow::sceneGraphAboutToStop, this, - &RenderWidgetHostViewQtDelegateItem::releaseVulkanResources, + &RenderWidgetHostViewQtDelegateItem::releaseTextureResources, Qt::DirectConnection)); -#endif if (!m_isPopup) m_windowConnections.append(connect(value.window, SIGNAL(closing(QQuickCloseEvent *)), SLOT(onHide()))); } @@ -346,15 +352,22 @@ QSGNode *RenderWidgetHostViewQtDelegateItem::updatePaintNode(QSGNode *oldNode, U { auto comp = compositor(); if (!comp) - return nullptr; + return oldNode; QQuickWindow *win = QQuickItem::window(); + QSGImageNode *node = nullptr; // Delete old node before swapFrame to decrement refcount of // QImage in software mode. - delete oldNode; - QSGImageNode *node = win->createImageNode(); - node->setOwnsTexture(true); + if (comp->type() == Compositor::Type::Software) + delete oldNode; + else + node = static_cast<QSGImageNode*>(oldNode); + + if (!node) { + node = win->createImageNode(); + node->setOwnsTexture(true); + } comp->swapFrame(); @@ -362,32 +375,22 @@ QSGNode *RenderWidgetHostViewQtDelegateItem::updatePaintNode(QSGNode *oldNode, U QSizeF texSizeInDips = QSizeF(texSize) / comp->devicePixelRatio(); node->setRect(QRectF(QPointF(0, 0), texSizeInDips)); - if (comp->type() == Compositor::Type::Software) { - QImage image = comp->image(); - node->setTexture(win->createTextureFromImage(image)); -#if QT_CONFIG(opengl) - } else if (comp->type() == Compositor::Type::OpenGL) { - QQuickWindow::CreateTextureOptions texOpts; - if (comp->hasAlphaChannel()) - texOpts.setFlag(QQuickWindow::TextureHasAlphaChannel); - int texId = comp->textureId(); - node->setTexture(QNativeInterface::QSGOpenGLTexture::fromNative(texId, win, texSize, texOpts)); - node->setTextureCoordinatesTransform(QSGImageNode::MirrorVertically); -#endif -#if QT_CONFIG(webengine_vulkan) - } else if (comp->type() == Compositor::Type::Vulkan) { - QQuickWindow::CreateTextureOptions texOpts; - if (comp->hasAlphaChannel()) - texOpts.setFlag(QQuickWindow::TextureHasAlphaChannel); - - VkImage image = comp->vkImage(win); - VkImageLayout layout = comp->vkImageLayout(); - node->setTexture(QNativeInterface::QSGVulkanTexture::fromNative(image, layout, win, texSize, - texOpts)); - node->setTextureCoordinatesTransform(QSGImageNode::MirrorVertically); -#endif // QT_CONFIG(webengine_vulkan) + QQuickWindow::CreateTextureOptions texOpts; + if (comp->requiresAlphaChannel() || m_clearColor.alpha() < 255) + texOpts.setFlag(QQuickWindow::TextureHasAlphaChannel); + else + texOpts.setFlag(QQuickWindow::TextureIsOpaque); + QSGTexture *texture = comp->texture(win, texOpts); + if (texture) { + node->setTexture(texture); + if (comp->textureIsFlipped()) + node->setTextureCoordinatesTransform(QSGImageNode::MirrorVertically); } else { - Q_UNREACHABLE(); + if (!oldNode || comp->type() == Compositor::Type::Software) { + qDebug("Compositor returned null texture"); + delete node; + return nullptr; + } } return node; @@ -401,6 +404,14 @@ void RenderWidgetHostViewQtDelegateItem::onBeforeRendering() comp->waitForTexture(); } +void RenderWidgetHostViewQtDelegateItem::onAfterFrameEnd() +{ + auto comp = compositor(); + if (!comp || comp->type() != Compositor::Type::Native) + return; + comp->releaseTexture(); +} + void RenderWidgetHostViewQtDelegateItem::onWindowPosChanged() { m_client->visualPropertiesChanged(); @@ -412,15 +423,13 @@ void RenderWidgetHostViewQtDelegateItem::onHide() m_client->forwardEvent(&event); } -void RenderWidgetHostViewQtDelegateItem::releaseVulkanResources() +void RenderWidgetHostViewQtDelegateItem::releaseTextureResources() { -#if QT_CONFIG(webengine_vulkan) auto comp = compositor(); - if (!comp || comp->type() != Compositor::Type::Vulkan) + if (!comp || comp->type() != Compositor::Type::Native) return; - comp->releaseVulkanResources(QQuickItem::window()); -#endif + comp->releaseResources(); } void RenderWidgetHostViewQtDelegateItem::adapterClientChanged(WebContentsAdapterClient *client) @@ -439,10 +448,8 @@ void RenderWidgetHostViewQtDelegateItem::updateAdapterClientIfNeeded(WebContents void RenderWidgetHostViewQtDelegateItem::unhandledWheelEvent(QWheelEvent *ev) { - if (QWindow *w = Window()) { - if (QWindow *p = w->parent()) - qApp->sendEvent(p, ev); - } + if (m_widgetDelegate) + m_widgetDelegate->unhandledWheelEvent(ev); } } // namespace QtWebEngineCore |