diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-03-28 17:14:30 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-08 14:00:10 +0200 |
commit | 96425960f9d57387c33e3ba50785aaa81255bc98 (patch) | |
tree | 01799f1235c85ffef420c06c5598ebd4e028339e /src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp | |
parent | 84f31c11b77a62212451cb77adae63219e06de96 (diff) |
Render the widgets view using the scene graph into a QOpenGLWidget
This means that widgets application now need to setup the GL context
sharing as well. QWebEngineWidgets::initialize() must be called,
which has the same effect as QWebEngine::initialize().
The QtWebEngineWidgets now depends on the QtWebEngine module to make
this happen.
Since QOpenGLWidget is only available in Qt 5.3, this patch also
disables the webenginewidgets module completely when building using
Qt 5.2.
Change-Id: I0e99a779d1eb080f2ccf5a338ff0763ad64e6eba
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp')
-rw-r--r-- | src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp | 77 |
1 files changed, 49 insertions, 28 deletions
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp index 71d6e235e..308735f70 100644 --- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp +++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp @@ -41,19 +41,21 @@ #include "render_widget_host_view_qt_delegate_widget.h" -#include "qwebengineview.h" #include "qwebenginepage_p.h" -#include <QtGlobal> +#include "qwebengineview.h" #include <QLayout> -#include <QResizeEvent> -#include <QPainter> -#include <QPaintEvent> -#include <QWindow> -#include <QtWidgets/QApplication> +#include <QSGNode> +#include <private/qsgadaptationlayer_p.h> +#include <private/qsgcontext_p.h> +#include <private/qsgrenderer_p.h> +#include <private/qwidget_p.h> RenderWidgetHostViewQtDelegateWidget::RenderWidgetHostViewQtDelegateWidget(RenderWidgetHostViewQtDelegateClient *client, QWidget *parent) - : QWidget(parent) + : QOpenGLWidget(parent) , m_client(client) + , sgContext(QSGContext::createDefaultContext()) + , sgRenderContext(new QSGRenderContext(sgContext.data())) + , rootNode(new QSGRootNode) , m_isPopup(false) { setFocusPolicy(Qt::ClickFocus); @@ -68,7 +70,7 @@ void RenderWidgetHostViewQtDelegateWidget::initAsChild(WebContentsAdapterClient* QWebEnginePagePrivate *pagePrivate = static_cast<QWebEnginePagePrivate *>(container); if (pagePrivate->view) { pagePrivate->view->layout()->addWidget(this); - QWidget::show(); + QOpenGLWidget::show(); } else setParent(0); } @@ -108,38 +110,38 @@ void RenderWidgetHostViewQtDelegateWidget::show() // Check if we're attached to a QWebEngineView, we don't // want to show anything else than popups as top-level. if (parent() || m_isPopup) - QWidget::show(); + QOpenGLWidget::show(); } void RenderWidgetHostViewQtDelegateWidget::hide() { - QWidget::hide(); + QOpenGLWidget::hide(); } bool RenderWidgetHostViewQtDelegateWidget::isVisible() const { - return QWidget::isVisible(); + return QOpenGLWidget::isVisible(); } QWindow* RenderWidgetHostViewQtDelegateWidget::window() const { - const QWidget* root = QWidget::window(); + const QWidget* root = QOpenGLWidget::window(); return root ? root->windowHandle() : 0; } -void RenderWidgetHostViewQtDelegateWidget::update(const QRect& rect) +void RenderWidgetHostViewQtDelegateWidget::update(const QRect&) { - QWidget::update(rect); + updateGL(); } void RenderWidgetHostViewQtDelegateWidget::updateCursor(const QCursor &cursor) { - QWidget::setCursor(cursor); + QOpenGLWidget::setCursor(cursor); } void RenderWidgetHostViewQtDelegateWidget::resize(int width, int height) { - QWidget::resize(width, height); + QOpenGLWidget::resize(width, height); } void RenderWidgetHostViewQtDelegateWidget::move(const QPoint &screenPos) @@ -153,7 +155,7 @@ void RenderWidgetHostViewQtDelegateWidget::inputMethodStateChanged(bool editorVi if (qApp->inputMethod()->isVisible() == editorVisible) return; - QWidget::setAttribute(Qt::WA_InputMethodEnabled, editorVisible); + QOpenGLWidget::setAttribute(Qt::WA_InputMethodEnabled, editorVisible); qApp->inputMethod()->update(Qt::ImQueryInput | Qt::ImEnabled | Qt::ImHints); qApp->inputMethod()->setVisible(editorVisible); } @@ -170,25 +172,44 @@ QVariant RenderWidgetHostViewQtDelegateWidget::inputMethodQuery(Qt::InputMethodQ bool RenderWidgetHostViewQtDelegateWidget::supportsHardwareAcceleration() const { - return false; -} - -void RenderWidgetHostViewQtDelegateWidget::paintEvent(QPaintEvent * event) -{ - QPainter painter(this); - m_client->fetchBackingStore(); - m_client->paint(&painter, event->rect()); + return true; } void RenderWidgetHostViewQtDelegateWidget::resizeEvent(QResizeEvent *resizeEvent) { - Q_UNUSED(resizeEvent); + QOpenGLWidget::resizeEvent(resizeEvent); m_client->notifyResize(); } bool RenderWidgetHostViewQtDelegateWidget::event(QEvent *event) { if (!m_client->forwardEvent(event)) - return QWidget::event(event); + return QOpenGLWidget::event(event); return true; } + +void RenderWidgetHostViewQtDelegateWidget::initializeGL() +{ + sgRenderContext->initialize(QOpenGLContext::currentContext()); + sgRenderer.reset(sgRenderContext->createRenderer()); + sgRenderer->setRootNode(rootNode.data()); +} + +void RenderWidgetHostViewQtDelegateWidget::paintGL() +{ + QSGNode *paintNode = m_client->updatePaintNode(rootNode->firstChild(), sgRenderContext.data()); + if (paintNode != rootNode->firstChild()) { + delete rootNode->firstChild(); + rootNode->appendChildNode(paintNode); + } + + rootNode->markDirty(QSGNode::DirtyForceUpdate); // Force matrix, clip and opacity update. + sgRenderer->nodeChanged(rootNode.data(), QSGNode::DirtyForceUpdate); // Force render list update. + + sgRenderer->setDeviceRect(size()); + sgRenderer->setViewportRect(size()); + sgRenderer->setProjectionMatrixToRect(QRectF(QPointF(), size())); + sgRenderer->setClearColor(Qt::transparent); + + sgRenderContext->renderNextFrame(sgRenderer.data(), defaultFramebufferObject()); +} |