summaryrefslogtreecommitdiffstats
path: root/src/core/render_widget_host_view_qt_delegate_item.cpp
diff options
context:
space:
mode:
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.cpp93
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