diff options
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r-- | src/widgets/kernel/kernel.pri | 4 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 12 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 259 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.h | 6 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget_p.h | 29 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget_qpa.cpp | 38 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetbackingstore.cpp (renamed from src/widgets/kernel/qbackingstore.cpp) | 345 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetbackingstore_p.h (renamed from src/widgets/kernel/qbackingstore_p.h) | 34 |
8 files changed, 118 insertions, 609 deletions
diff --git a/src/widgets/kernel/kernel.pri b/src/widgets/kernel/kernel.pri index 6be316bae9..a4754018b2 100644 --- a/src/widgets/kernel/kernel.pri +++ b/src/widgets/kernel/kernel.pri @@ -11,7 +11,7 @@ HEADERS += \ kernel/qactiongroup.h \ kernel/qapplication.h \ kernel/qapplication_p.h \ - kernel/qbackingstore_p.h \ + kernel/qwidgetbackingstore_p.h \ kernel/qboxlayout.h \ kernel/qdesktopwidget.h \ kernel/qformlayout.h \ @@ -46,7 +46,7 @@ SOURCES += \ kernel/qaction.cpp \ kernel/qactiongroup.cpp \ kernel/qapplication.cpp \ - kernel/qbackingstore.cpp \ + kernel/qwidgetbackingstore.cpp \ kernel/qboxlayout.cpp \ kernel/qformlayout.cpp \ kernel/qgridlayout.cpp \ diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index ec7c3a5712..7595290d11 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -503,17 +503,7 @@ bool qt_tabletChokeMouse = false; inline bool QApplicationPrivate::isAlien(QWidget *widget) { - if (!widget) - return false; -#if defined(Q_WS_QWS) || defined(Q_WS_QPA) - return !widget->isWindow() -# ifdef Q_BACKINGSTORE_SUBSURFACES - && !(widget->d_func()->maybeTopData() && widget->d_func()->maybeTopData()->windowSurface) -# endif - ; -#else - return !widget->internalWinId(); -#endif + return widget && !widget->isWindow(); } // ######## move to QApplicationPrivate diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 9a7ad9fc0c..9889a66aa6 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -70,12 +70,6 @@ # include "qtoolbar.h" # include <private/qmainwindowlayout_p.h> #endif -#if defined(Q_WS_QWS) -# include "qwsdisplay_qws.h" -# include "qwsmanager_qws.h" -# include "qpaintengine.h" // for PorterDuff -# include "private/qwindowsurface_qws_p.h" -#endif #if defined(Q_WS_QPA) #include "qplatformwindow_qpa.h" #include "private/qwidgetwindow_qpa_p.h" @@ -100,8 +94,8 @@ #endif #include <private/qgraphicseffect_p.h> -#include <private/qwindowsurface_p.h> -#include <private/qbackingstore_p.h> +#include <qbackingstore.h> +#include <private/qwidgetbackingstore_p.h> #ifdef Q_WS_MAC # include <private/qpaintengine_mac_p.h> #endif @@ -137,9 +131,7 @@ QT_BEGIN_NAMESPACE -#if !defined(Q_WS_QWS) static bool qt_enable_backingstore = true; -#endif #ifdef Q_WS_X11 // for compatibility with Qt 4.0 Q_WIDGETS_EXPORT void qt_x11_set_global_double_buffer(bool enable) @@ -352,32 +344,6 @@ QWidgetPrivate::~QWidgetPrivate() #endif //QT_NO_GRAPHICSEFFECT } -class QDummyWindowSurface : public QWindowSurface -{ -public: - QDummyWindowSurface(QWindow *window) : QWindowSurface(window) {} - QPaintDevice *paintDevice() { return static_cast<QWidgetWindow *>(window())->widget(); } - void flush(QWindow *, const QRegion &, const QPoint &) {} -}; - -QWindowSurface *QWidgetPrivate::createDefaultWindowSurface() -{ - Q_Q(QWidget); - - QWindowSurface *surface; -#ifndef QT_NO_PROPERTIES - if (q->property("_q_DummyWindowSurface").toBool()) { - surface = new QDummyWindowSurface(q->windowHandle()); - } else -#endif - { - QWindow *win = topData()->window; - surface = QGuiApplicationPrivate::platformIntegration()->createWindowSurface(win, win->winId()); - } - - return surface; -} - /*! \internal */ @@ -393,10 +359,8 @@ void QWidgetPrivate::scrollChildren(int dx, int dy) QPoint oldp = w->pos(); QRect r(w->pos() + pd, w->size()); w->data->crect = r; -#ifndef Q_WS_QWS if (w->testAttribute(Qt::WA_WState_Created)) w->d_func()->setWSGeometry(); -#endif w->d_func()->setDirtyOpaqueRegion(); QMoveEvent e(r.topLeft(), oldp); QApplication::sendEvent(w, &e); @@ -1508,9 +1472,9 @@ void QWidget::create(WId window, bool initializeWindow, bool destroyOldWindow) // a real toplevel window needs a backing store if (isWindow() && windowType() != Qt::Desktop) { - d->topData()->backingStore.destroy(); + d->topData()->backingStoreTracker.destroy(); if (hasBackingStoreSupport()) - d->topData()->backingStore.create(this); + d->topData()->backingStoreTracker.create(this); } d->setModal_sys(); @@ -1625,7 +1589,7 @@ QWidget::~QWidget() else if (!internalWinId() && isVisible()) { qApp->d_func()->sendSyntheticEnterLeave(this); } -#elif defined(Q_WS_QWS) || defined(Q_WS_QPA) +#elif defined(Q_WS_QPA) else if (isVisible()) { qApp->d_func()->sendSyntheticEnterLeave(this); } @@ -1732,7 +1696,7 @@ void QWidgetPrivate::createTLExtra() QTLWExtra* x = extra->topextra = new QTLWExtra; x->icon = 0; x->iconPixmap = 0; - x->windowSurface = 0; + x->backingStore = 0; x->sharedPainter = 0; x->incw = x->inch = 0; x->basew = x->baseh = 0; @@ -1815,13 +1779,10 @@ void QWidgetPrivate::deleteExtra() #endif if (extra->topextra) { deleteTLSysExtra(); - extra->topextra->backingStore.destroy(); + extra->topextra->backingStoreTracker.destroy(); delete extra->topextra->icon; delete extra->topextra->iconPixmap; -#if defined(Q_WS_QWS) && !defined(QT_NO_QWS_MANAGER) - delete extra->topextra->qwsManager; -#endif - delete extra->topextra->windowSurface; + delete extra->topextra->backingStore; delete extra->topextra; } delete extra; @@ -2212,9 +2173,7 @@ void QWidgetPrivate::clipToEffectiveMask(QRegion ®ion) const bool QWidgetPrivate::paintOnScreen() const { -#if defined(Q_WS_QWS) - return false; -#elif defined(QT_NO_BACKINGSTORE) +#if defined(QT_NO_BACKINGSTORE) return true; #else Q_Q(const QWidget); @@ -2376,10 +2335,6 @@ void QWidgetPrivate::paintBackground(QPainter *painter, const QRegion &rgn, int if ((flags & DrawAsRoot) && !(q->autoFillBackground() && autoFillBrush.isOpaque())) { const QBrush bg = q->palette().brush(QPalette::Window); -#ifdef Q_WS_QWS - if (!(flags & DontSetCompositionMode) && painter->paintEngine()->hasFeature(QPaintEngine::PorterDuff)) - painter->setCompositionMode(QPainter::CompositionMode_Source); //copy alpha straight in -#endif fillRegion(painter, rgn, bg); } @@ -3891,19 +3846,6 @@ bool QWidgetPrivate::setMinimumSize_helper(int &minw, int &minh) { Q_Q(QWidget); -#ifdef Q_WS_QWS - if (q->isWindow()) { - const QRect maxWindowRect = QApplication::desktop()->availableGeometry(QApplication::desktop()->screenNumber(q)); - if (!maxWindowRect.isEmpty()) { - // ### This is really just a work-around. Layout shouldn't be - // asking for minimum sizes bigger than the screen. - if (minw > maxWindowRect.width()) - minw = maxWindowRect.width(); - if (minh > maxWindowRect.height()) - minh = maxWindowRect.height(); - } - } -#endif int mw = minw, mh = minh; if (mw == QWIDGETSIZE_MAX) mw = 0; @@ -4094,15 +4036,7 @@ void QWidget::setFixedSize(const QSize & s) void QWidget::setFixedSize(int w, int h) { Q_D(QWidget); -#ifdef Q_WS_QWS - // temporary fix for 4.3.x. - // Should move the embedded spesific contraints in setMinimumSize_helper into QLayout - int tmpW = w; - int tmpH = h; - bool minSizeSet = d->setMinimumSize_helper(tmpW, tmpH); -#else bool minSizeSet = d->setMinimumSize_helper(w, h); -#endif bool maxSizeSet = d->setMaximumSize_helper(w, h); if (!minSizeSet && !maxSizeSet) return; @@ -5050,7 +4984,7 @@ void QWidget::setCursor(const QCursor &cursor) { Q_D(QWidget); // On Mac we must set the cursor even if it is the ArrowCursor. -#if !defined(Q_WS_MAC) && !defined(Q_WS_QWS) +#if !defined(Q_WS_MAC) if (cursor.shape() != Qt::ArrowCursor || (d->extra && d->extra->curs)) #endif @@ -5538,7 +5472,7 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP //actually send the paint event QPaintEvent e(toBePainted); QCoreApplication::sendSpontaneousEvent(q, &e); -#if !defined(Q_WS_QWS) && !defined(Q_WS_QPA) +#if !defined(Q_WS_QPA) if (backingStore && !onScreen && !asRoot && (q->internalWinId() || !q->nativeParentWidget()->isWindow())) backingStore->markDirtyOnScreen(toBePainted, q, offset); #endif @@ -5587,9 +5521,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP if (recursive && !children.isEmpty()) { paintSiblingsRecursive(pdev, children, children.size() - 1, rgn, offset, flags & ~DrawAsRoot -#ifdef Q_BACKINGSTORE_SUBSURFACES - , q->windowSurface() -#endif , sharedPainter, backingStore); } } @@ -5661,10 +5592,6 @@ void QWidgetPrivate::render(QPaintDevice *target, const QPoint &targetOffset, else flags |= DontSubtractOpaqueChildren; -#ifdef Q_WS_QWS - flags |= DontSetCompositionMode; -#endif - if (target->devType() == QInternal::Printer) { QPainter p(target); render_helper(&p, targetOffset, paintRegion, renderFlags); @@ -5686,9 +5613,6 @@ void QWidgetPrivate::render(QPaintDevice *target, const QPoint &targetOffset, void QWidgetPrivate::paintSiblingsRecursive(QPaintDevice *pdev, const QObjectList& siblings, int index, const QRegion &rgn, const QPoint &offset, int flags -#ifdef Q_BACKINGSTORE_SUBSURFACES - , const QWindowSurface *currentSurface -#endif , QPainter *sharedPainter, QWidgetBackingStore *backingStore) { QWidget *w = 0; @@ -5707,13 +5631,8 @@ void QWidgetPrivate::paintSiblingsRecursive(QPaintDevice *pdev, const QObjectLis } if (qRectIntersects(boundingRect, x->d_func()->effectiveRectFor(x->data->crect))) { -#ifdef Q_BACKINGSTORE_SUBSURFACES - if (x->windowSurface() == currentSurface) -#endif - { - w = x; - break; - } + w = x; + break; } } --index; @@ -5730,9 +5649,6 @@ void QWidgetPrivate::paintSiblingsRecursive(QPaintDevice *pdev, const QObjectLis if (wd->isOpaque) wr -= hasMask ? wd->extra->mask.translated(widgetPos) : w->data->crect; paintSiblingsRecursive(pdev, siblings, --index, wr, offset, flags -#ifdef Q_BACKINGSTORE_SUBSURFACES - , currentSurface -#endif , sharedPainter, backingStore); } @@ -7582,7 +7498,7 @@ void QWidgetPrivate::hide_helper() // next bit tries to move the focus if the focus widget is now // hidden. if (wasVisible) { -#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined (Q_WS_QWS) || defined(Q_WS_MAC) || defined(Q_WS_QPA) +#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined(Q_WS_MAC) || defined(Q_WS_QPA) qApp->d_func()->sendSyntheticEnterLeave(q); #endif @@ -7653,9 +7569,6 @@ void QWidget::setVisible(bool visible) #if defined(Q_WS_X11) if (windowType() == Qt::Window) QApplicationPrivate::applyX11SpecificCommandLineArguments(this); -#elif defined(Q_WS_QWS) - if (windowType() == Qt::Window) - QApplicationPrivate::applyQWSSpecificCommandLineArguments(this); #endif bool wasResized = testAttribute(Qt::WA_Resized); @@ -7714,7 +7627,7 @@ void QWidget::setVisible(bool visible) d->show_helper(); -#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined (Q_WS_QWS) || defined(Q_WS_MAC) || defined(Q_WS_QPA) +#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined(Q_WS_MAC) || defined(Q_WS_QPA) qApp->d_func()->sendSyntheticEnterLeave(this); #endif } @@ -7846,7 +7759,7 @@ void QWidgetPrivate::hideChildren(bool spontaneous) widget->d_func()->hide_sys(); } } -#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined (Q_WS_QWS) || defined(Q_WS_MAC) || defined(Q_WS_QPA) +#if defined(Q_WS_WIN) || defined(Q_WS_X11) || defined(Q_WS_MAC) || defined(Q_WS_QPA) qApp->d_func()->sendSyntheticEnterLeave(widget); #endif #ifndef QT_NO_ACCESSIBILITY @@ -8049,13 +7962,6 @@ QRegion QWidget::visibleRegion() const QRegion r(clipRect); d->subtractOpaqueChildren(r, clipRect); d->subtractOpaqueSiblings(r); -#ifdef Q_WS_QWS - const QWSWindowSurface *surface = static_cast<const QWSWindowSurface*>(windowSurface()); - if (surface) { - const QPoint offset = mapTo(surface->window(), QPoint()); - r &= surface->clipRegion().translated(-offset); - } -#endif return r; } @@ -8807,10 +8713,6 @@ void QWidget::changeEvent(QEvent * event) updateGeometry(); if (d->layout) d->layout->invalidate(); -#ifdef Q_WS_QWS - if (isWindow()) - d->data.fstrut_dirty = true; -#endif break; } @@ -9588,31 +9490,6 @@ bool QWidget::x11Event(XEvent *) } #endif -#if defined(Q_WS_QWS) - -/*! - \fn bool QWidget::qwsEvent(QWSEvent *event) - - This special event handler can be reimplemented in a subclass to - receive native Qt for Embedded Linux events which are passed in the - \a event parameter. - - In your reimplementation of this function, if you want to stop the - event being handled by Qt, return true. If you return false, this - native event is passed back to Qt, which translates the event into - a Qt event and sends it to the widget. - - \warning This function is not portable. - - \sa QApplication::qwsEventFilter() -*/ -bool QWidget::qwsEvent(QWSEvent *) -{ - return false; -} - -#endif - /*! Ensures that the widget has been polished by QStyle (i.e., has a @@ -10132,34 +10009,18 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f) focusWidget()->clearFocus(); QTLWExtra *oldTopExtra = window()->d_func()->maybeTopData(); - QWidgetBackingStoreTracker *oldBsTracker = oldTopExtra ? &oldTopExtra->backingStore : 0; + QWidgetBackingStoreTracker *oldBsTracker = oldTopExtra ? &oldTopExtra->backingStoreTracker : 0; d->setParent_sys(parent, f); QTLWExtra *topExtra = window()->d_func()->maybeTopData(); - QWidgetBackingStoreTracker *bsTracker = topExtra ? &topExtra->backingStore : 0; + QWidgetBackingStoreTracker *bsTracker = topExtra ? &topExtra->backingStoreTracker : 0; if (oldBsTracker && oldBsTracker != bsTracker) oldBsTracker->unregisterWidgetSubtree(this); if (desktopWidget) parent = 0; -#ifdef Q_BACKINGSTORE_SUBSURFACES - QTLWExtra *extra = d->maybeTopData(); - QWindowSurface *windowSurface = (extra ? extra->windowSurface : 0); - if (newParent && windowSurface) { - QWidgetBackingStore *oldBs = oldtlw->d_func()->maybeBackingStore(); - if (oldBs) - oldBs->subSurfaces.removeAll(windowSurface); - - if (parent) { - QWidgetBackingStore *newBs = parent->d_func()->maybeBackingStore(); - if (newBs) - newBs->subSurfaces.append(windowSurface); - } - } -#endif - if (QWidgetBackingStore *oldBs = oldtlw->d_func()->maybeBackingStore()) { if (newParent) oldBs->removeDirtyWidget(this); @@ -10405,7 +10266,7 @@ void QWidget::repaint(const QRect &rect) QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) { tlwExtra->inRepaint = true; - tlwExtra->backingStore->markDirty(rect, this, true); + tlwExtra->backingStoreTracker->markDirty(rect, this, true); tlwExtra->inRepaint = false; } } else { @@ -10440,7 +10301,7 @@ void QWidget::repaint(const QRegion &rgn) QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) { tlwExtra->inRepaint = true; - tlwExtra->backingStore->markDirty(rgn, this, true); + tlwExtra->backingStoreTracker->markDirty(rgn, this, true); tlwExtra->inRepaint = false; } } else { @@ -10502,7 +10363,7 @@ void QWidget::update(const QRect &rect) #endif // QT_MAC_USE_COCOA QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) - tlwExtra->backingStore->markDirty(rect, this); + tlwExtra->backingStoreTracker->markDirty(rect, this); } else { d_func()->repaint_sys(rect); } @@ -10532,7 +10393,7 @@ void QWidget::update(const QRegion &rgn) #endif // QT_MAC_USE_COCOA QTLWExtra *tlwExtra = window()->d_func()->maybeTopData(); if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) - tlwExtra->backingStore->markDirty(rgn, this); + tlwExtra->backingStoreTracker->markDirty(rgn, this); } else { d_func()->repaint_sys(rgn); } @@ -10873,14 +10734,6 @@ void QWidget::setAttribute(Qt::WidgetAttribute attribute, bool on) // from the desktop. show_sys will only update platform specific // attributes at this point. d->hide_sys(); -#ifdef Q_WS_QWS - // Release the region for this window from qws if the widget has - // been shown before the attribute was set. - if (QWSWindowSurface *surface = static_cast<QWSWindowSurface *>(windowSurface())) { - QWidget::qwsDisplay()->requestRegion(surface->winId(), surface->key(), - surface->permanentState(), QRegion()); - } -#endif d->show_sys(); } break; @@ -11029,10 +10882,8 @@ void QWidget::setWindowOpacity(qreal opacity) extra->opacity = uint(opacity * 255); setAttribute(Qt::WA_WState_WindowOpacitySet); -#ifndef Q_WS_QWS if (!testAttribute(Qt::WA_WState_Created)) return; -#endif #ifndef QT_NO_GRAPHICSVIEW if (QGraphicsProxyWidget *proxy = graphicsProxyWidget()) { @@ -11322,7 +11173,7 @@ void QWidget::setShortcutAutoRepeat(int id, bool enable) */ void QWidget::updateMicroFocus() { -#if !defined(QT_NO_IM) && (defined(Q_WS_X11) || defined(Q_WS_QWS) || defined(Q_OS_SYMBIAN)) +#if !defined(QT_NO_IM) && (defined(Q_WS_X11) || defined(Q_OS_SYMBIAN)) Q_D(QWidget); // and optimization to update input context only it has already been created. if (d->assignedInputContext() || qApp->d_func()->inputContext) { @@ -12102,83 +11953,55 @@ bool QWidgetPrivate::inTabWidget(QWidget *widget) #endif /*! - \preliminary - \since 4.2 - \obsolete + \since 5.0 + \internal - Sets the window surface to be the \a surface specified. - The QWidget takes will ownership of the \a surface. - widget itself is deleted. + Sets the backing store to be the \a store specified. + The QWidget will take ownership of the \a store. */ -void QWidget::setWindowSurface(QWindowSurface *surface) +void QWidget::setBackingStore(QBackingStore *store) { // ### createWinId() ?? -#ifndef Q_BACKINGSTORE_SUBSURFACES if (!isTopLevel()) return; -#endif Q_D(QWidget); QTLWExtra *topData = d->topData(); - if (topData->windowSurface == surface) + if (topData->backingStore == store) return; - QWindowSurface *oldSurface = topData->windowSurface; - delete topData->windowSurface; - topData->windowSurface = surface; + QBackingStore *oldStore = topData->backingStore; + delete topData->backingStore; + topData->backingStore = store; QWidgetBackingStore *bs = d->maybeBackingStore(); if (!bs) return; if (isTopLevel()) { - if (bs->windowSurface != oldSurface && bs->windowSurface != surface) - delete bs->windowSurface; - bs->windowSurface = surface; - } -#ifdef Q_BACKINGSTORE_SUBSURFACES - else { - bs->subSurfaces.append(surface); + if (bs->store != oldStore && bs->store != store) + delete bs->store; + bs->store = store; } - bs->subSurfaces.removeOne(oldSurface); -#endif } /*! - \preliminary - \since 4.2 + \since 5.0 - Returns the QWindowSurface this widget will be drawn into. + Returns the QBackingStore this widget will be drawn into. */ -QWindowSurface *QWidget::windowSurface() const +QBackingStore *QWidget::backingStore() const { Q_D(const QWidget); QTLWExtra *extra = d->maybeTopData(); - if (extra && extra->windowSurface) - return extra->windowSurface; + if (extra && extra->backingStore) + return extra->backingStore; QWidgetBackingStore *bs = d->maybeBackingStore(); -#ifdef Q_BACKINGSTORE_SUBSURFACES - if (bs && bs->subSurfaces.isEmpty()) - return bs->windowSurface; - - if (!isTopLevel()) { - const QWidget *w = parentWidget(); - while (w) { - QTLWExtra *extra = w->d_func()->maybeTopData(); - if (extra && extra->windowSurface) - return extra->windowSurface; - if (w->isTopLevel()) - break; - w = w->parentWidget(); - } - } -#endif // Q_BACKINGSTORE_SUBSURFACES - - return bs ? bs->windowSurface : 0; + return bs ? bs->store : 0; } void QWidgetPrivate::getLayoutItemMargins(int *left, int *top, int *right, int *bottom) const diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h index 2be5e5f52d..755feb8849 100644 --- a/src/widgets/kernel/qwidget.h +++ b/src/widgets/kernel/qwidget.h @@ -97,7 +97,7 @@ class QShowEvent; class QHideEvent; class QInputContext; class QIcon; -class QWindowSurface; +class QBackingStore; class QPlatformWindow; class QLocale; class QGraphicsProxyWidget; @@ -631,8 +631,7 @@ public: bool autoFillBackground() const; void setAutoFillBackground(bool enabled); - void setWindowSurface(QWindowSurface *surface); - QWindowSurface *windowSurface() const; + QBackingStore *backingStore() const; #if defined(Q_WS_QPA) void setWindowHandle(QWindow *window); @@ -730,6 +729,7 @@ protected: protected: QWidget(QWidgetPrivate &d, QWidget* parent, Qt::WindowFlags f); private: + void setBackingStore(QBackingStore *store); bool testAttribute_helper(Qt::WidgetAttribute) const; diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index 46c5ecfe33..f3838ee3dd 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -163,8 +163,8 @@ struct QTLWExtra { // Regular pointers (keep them together to avoid gaps on 64 bits architectures). QIcon *icon; // widget icon QPixmap *iconPixmap; - QWidgetBackingStoreTracker backingStore; - QWindowSurface *windowSurface; + QWidgetBackingStoreTracker backingStoreTracker; + QBackingStore *backingStore; QPainter *sharedPainter; // Implicit pointers (shared_null). @@ -458,11 +458,8 @@ public: void paintSiblingsRecursive(QPaintDevice *pdev, const QObjectList& children, int index, - const QRegion &rgn, const QPoint &offset, int flags -#ifdef Q_BACKINGSTORE_SUBSURFACES - , const QWindowSurface *currentSurface -#endif - , QPainter *sharedPainter, QWidgetBackingStore *backingStore); + const QRegion &rgn, const QPoint &offset, int flags, + QPainter *sharedPainter, QWidgetBackingStore *backingStore); QPainter *beginSharedPainter(); @@ -470,8 +467,6 @@ public: #ifndef QT_NO_GRAPHICSVIEW static QGraphicsProxyWidget * nearestGraphicsProxyWidget(const QWidget *origin); #endif - QWindowSurface *createDefaultWindowSurface(); - QWindowSurface *createDefaultWindowSurface_sys(); void repaint_sys(const QRegion &rgn); QRect clipRect() const; @@ -884,20 +879,6 @@ public: static OSStatus qt_widget_event(EventHandlerCallRef er, EventRef event, void *); static bool qt_widget_rgn(QWidget *, short, RgnHandle, bool); void registerTouchWindow(bool enable = true); -#elif defined(Q_WS_QWS) // <--------------------------------------------------------- QWS - void setMaxWindowState_helper(); - void setFullScreenSize_helper(); - void moveSurface(QWindowSurface *surface, const QPoint &offset); - QRegion localRequestedRegion() const; - QRegion localAllocatedRegion() const; - - friend class QWSManager; - friend class QWSManagerPrivate; - friend class QDecoration; -#ifndef QT_NO_CURSOR - void updateCursor() const; -#endif - QScreen* getScreen() const; #elif defined(Q_WS_QPA) // <--------------------------------------------------------- QPA void setMaxWindowState_helper(); void setFullScreenSize_helper(); @@ -1026,7 +1007,7 @@ inline QWidgetBackingStore *QWidgetPrivate::maybeBackingStore() const { Q_Q(const QWidget); QTLWExtra *x = q->window()->d_func()->maybeTopData(); - return x ? x->backingStore.data() : 0; + return x ? x->backingStoreTracker.data() : 0; } QT_END_NAMESPACE diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp index caaa065b64..9aa7e5afb6 100644 --- a/src/widgets/kernel/qwidget_qpa.cpp +++ b/src/widgets/kernel/qwidget_qpa.cpp @@ -42,7 +42,7 @@ #include "QtWidgets/qwidget.h" #include "QtGui/qevent.h" #include "QtWidgets/qapplication.h" -#include "private/qbackingstore_p.h" +#include "private/qwidgetbackingstore_p.h" #include "private/qwidget_p.h" #include "private/qwidgetwindow_qpa_p.h" #include "private/qapplication_p.h" @@ -94,8 +94,6 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO if (!q->testAttribute(Qt::WA_NativeWindow) && !q->isWindow()) return; // we only care about real toplevels - QWindowSurface *surface = q->windowSurface(); - QWindow *win = topData()->window; // topData() ensures the extra is created but does not ensure 'window' is non-null // in case the extra was already valid. @@ -129,13 +127,13 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO data.window_flags = win->windowFlags(); - if (!surface ) { - if (win) { - surface = QGuiApplicationPrivate::platformIntegration()->createWindowSurface(win, win->winId()); - q->setWindowSurface(surface); - } else { - q->setAttribute(Qt::WA_PaintOnScreen,true); - } + QBackingStore *store = q->backingStore(); + + if (!store) { + if (win) + q->setBackingStore(new QBackingStore(win)); + else + q->setAttribute(Qt::WA_PaintOnScreen, true); } setWinId(win->winId()); @@ -449,12 +447,15 @@ void QWidgetPrivate::show_sys() if (windowRect != geomRect) { window->setGeometry(geomRect); } - if (QWindowSurface *surface = q->windowSurface()) { - if (windowRect.size() != geomRect.size()) { - surface->resize(geomRect.size()); + + if (QBackingStore *store = q->backingStore()) { + if (store->size() != geomRect.size()) { + store->resize(geomRect.size()); } } + invalidateBuffer(q->rect()); + if (window) window->setVisible(true); } @@ -663,9 +664,9 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove) q->windowHandle()->setGeometry(QRect(posInNativeParent,r.size())); } const QWidgetBackingStore *bs = maybeBackingStore(); - if (bs->windowSurface) { + if (bs->store) { if (isResize) - bs->windowSurface->resize(r.size()); + bs->store->resize(r.size()); } if (needsShow) @@ -854,13 +855,6 @@ QPaintEngine *QWidget::paintEngine() const return 0; //##### @@@ } -QWindowSurface *QWidgetPrivate::createDefaultWindowSurface_sys() -{ - //This function should not be called. - Q_ASSERT(false); - return 0; -} - void QWidgetPrivate::setModal_sys() { Q_Q(QWidget); diff --git a/src/widgets/kernel/qbackingstore.cpp b/src/widgets/kernel/qwidgetbackingstore.cpp index 1d5fbbc8f9..1cb6f51619 100644 --- a/src/widgets/kernel/qbackingstore.cpp +++ b/src/widgets/kernel/qwidgetbackingstore.cpp @@ -42,7 +42,7 @@ #include "qplatformdefs.h" -#include "qbackingstore_p.h" +#include "qwidgetbackingstore_p.h" #include <QtCore/qglobal.h> #include <QtCore/qdebug.h> @@ -76,20 +76,19 @@ static inline bool qRectIntersects(const QRect &r1, const QRect &r2) } /** - * Flushes the contents of the \a windowSurface into the screen area of \a widget. + * Flushes the contents of the \a backingStore into the screen area of \a widget. * \a tlwOffset is the position of the top level widget relative to the window surface. * \a region is the region to be updated in \a widget coordinates. */ -static inline void qt_flush(QWidget *widget, const QRegion ®ion, QWindowSurface *windowSurface, +static inline void qt_flush(QWidget *widget, const QRegion ®ion, QBackingStore *backingStore, QWidget *tlw, const QPoint &tlwOffset) { Q_ASSERT(widget); Q_ASSERT(!region.isEmpty()); - Q_ASSERT(windowSurface); + Q_ASSERT(backingStore); Q_ASSERT(tlw); -#if !defined(QT_NO_PAINT_DEBUG) && !defined(Q_WS_QWS) - // QWS does flush update in QWindowSurface::flush (because it needs to lock the surface etc). +#if !defined(QT_NO_PAINT_DEBUG) static int flushUpdate = qgetenv("QT_FLUSH_UPDATE").toInt(); if (flushUpdate > 0) QWidgetBackingStore::showYellowThing(widget, region, flushUpdate * 10, false); @@ -111,9 +110,9 @@ static inline void qt_flush(QWidget *widget, const QRegion ®ion, QWindowSurfa } } if (widget != tlw) - windowSurface->flush(widget->windowHandle(), region, tlwOffset + widget->mapTo(tlw, QPoint())); + backingStore->flush(region, widget->windowHandle(), tlwOffset + widget->mapTo(tlw, QPoint())); else - windowSurface->flush(widget->windowHandle(), region, tlwOffset); + backingStore->flush(region, widget->windowHandle(), tlwOffset); } #ifndef QT_NO_PAINT_DEBUG @@ -263,7 +262,7 @@ void QWidgetBackingStore::unflushPaint(QWidget *widget, const QRegion &rgn) return; const QPoint offset = widget->mapTo(tlw, QPoint()); - qt_flush(widget, rgn, tlwExtra->backingStore->windowSurface, tlw, offset); + qt_flush(widget, rgn, tlwExtra->backingStoreTracker->store, tlw, offset); } #endif // QT_NO_PAINT_DEBUG @@ -277,21 +276,13 @@ bool QWidgetBackingStore::bltRect(const QRect &rect, int dx, int dy, QWidget *wi const QRect tlwRect(QRect(pos, rect.size())); if (fullUpdatePending || dirty.intersects(tlwRect)) return false; // We don't want to scroll junk. - return windowSurface->scroll(tlwRect, dx, dy); + return store->scroll(tlwRect, dx, dy); } void QWidgetBackingStore::releaseBuffer() { - if (windowSurface) -#if defined(Q_WS_QPA) - windowSurface->resize(QSize()); -#else - windowSurface->setGeometry(QRect()); -#endif -#ifdef Q_BACKINGSTORE_SUBSURFACES - for (int i = 0; i < subSurfaces.size(); ++i) - subSurfaces.at(i)->setGeometry(QRect()); -#endif + if (store) + store->resize(QSize()); } /*! @@ -300,80 +291,17 @@ void QWidgetBackingStore::releaseBuffer() The \a toClean region might be clipped by the window surface. */ -void QWidgetBackingStore::beginPaint(QRegion &toClean, QWidget *widget, QWindowSurface *windowSurface, +void QWidgetBackingStore::beginPaint(QRegion &toClean, QWidget *widget, QBackingStore *backingStore, BeginPaintInfo *returnInfo, bool toCleanIsInTopLevelCoordinates) { -#ifdef Q_WS_QWS - QWSWindowSurface *surface = static_cast<QWSWindowSurface *>(windowSurface); - QWidget *surfaceWidget = surface->window(); - - if (!surface->isValid()) { - // this looks strange but it really just releases the surface - surface->releaseSurface(); - // the old window surface is deleted in setWindowSurface, which is - // called from QWindowSurface constructor. - windowSurface = tlw->d_func()->createDefaultWindowSurface(); - surface = static_cast<QWSWindowSurface *>(windowSurface); - // createDefaultWindowSurface() will set topdata->windowSurface on the - // widget to zero. However, if this is a sub-surface, it should point - // to the widget's sub windowSurface, so we set that here: - if (!surfaceWidget->isWindow()) - surfaceWidget->d_func()->topData()->windowSurface = windowSurface; - surface->setGeometry(topLevelRect()); - returnInfo->windowSurfaceRecreated = true; - } - - const QRegion toCleanUnclipped(toClean); - - if (surfaceWidget->isWindow()) - tlwOffset = surface->painterOffset(); -#ifdef Q_BACKINGSTORE_SUBSURFACES - else if (toCleanIsInTopLevelCoordinates) - toClean &= surface->clipRegion().translated(surfaceWidget->mapTo(tlw, QPoint())); - if (!toCleanIsInTopLevelCoordinates && windowSurface == this->windowSurface) - toClean &= surface->clipRegion().translated(-widget->mapTo(surfaceWidget, QPoint())); -#else - toClean &= surface->clipRegion(); -#endif - - if (toClean.isEmpty()) { - if (surfaceWidget->isWindow()) { - dirtyFromPreviousSync += toCleanUnclipped; - hasDirtyFromPreviousSync = true; - } - - returnInfo->nothingToPaint = true; - // Nothing to repaint. However, we might have newly exposed areas on the - // screen, so we have to make sure those are flushed. - flush(); - return; - } - - if (surfaceWidget->isWindow()) { - if (toCleanUnclipped != toClean) { - dirtyFromPreviousSync += (toCleanUnclipped - surface->clipRegion()); - hasDirtyFromPreviousSync = true; - } - if (hasDirtyFromPreviousSync) { - dirtyFromPreviousSync -= toClean; - hasDirtyFromPreviousSync = !dirtyFromPreviousSync.isEmpty(); - } - } - -#endif // Q_WS_QWS - Q_UNUSED(widget); Q_UNUSED(toCleanIsInTopLevelCoordinates); // Always flush repainted areas. dirtyOnScreen += toClean; -#if defined(Q_WS_QWS) && !defined(Q_BACKINGSTORE_SUBSURFACES) - toClean.translate(tlwOffset); -#endif - #ifdef QT_NO_PAINT_DEBUG - windowSurface->beginPaint(toClean); + backingStore->beginPaint(toClean); #else returnInfo->wasFlushed = QWidgetBackingStore::flushPaint(tlw, toClean); // Avoid deadlock with QT_FLUSH_PAINT: the server will wait for @@ -381,30 +309,27 @@ void QWidgetBackingStore::beginPaint(QRegion &toClean, QWidget *widget, QWindowS // never release the Communication lock that we are waiting for in // sendSynchronousCommand if (!returnInfo->wasFlushed) - windowSurface->beginPaint(toClean); + backingStore->beginPaint(toClean); #endif Q_UNUSED(returnInfo); } -void QWidgetBackingStore::endPaint(const QRegion &cleaned, QWindowSurface *windowSurface, +void QWidgetBackingStore::endPaint(const QRegion &cleaned, QBackingStore *backingStore, BeginPaintInfo *beginPaintInfo) { #ifndef QT_NO_PAINT_DEBUG if (!beginPaintInfo->wasFlushed) - windowSurface->endPaint(cleaned); + backingStore->endPaint(); else QWidgetBackingStore::unflushPaint(tlw, cleaned); #else Q_UNUSED(beginPaintInfo); - windowSurface->endPaint(cleaned); + Q_UNUSED(cleaned); + backingStore->endPaint(); #endif -#ifdef Q_BACKINGSTORE_SUBSURFACES - flush(static_cast<QWSWindowSurface *>(windowSurface)->window(), windowSurface); -#else flush(); -#endif } /*! @@ -417,11 +342,7 @@ QRegion QWidgetBackingStore::dirtyRegion(QWidget *widget) const { const bool widgetDirty = widget && widget != tlw; const QRect tlwRect(topLevelRect()); -#if defined(Q_WS_QPA) - const QRect surfaceGeometry(tlwRect.topLeft(), windowSurface->size()); -#else - const QRect surfaceGeometry(windowSurface->geometry()); -#endif + const QRect surfaceGeometry(tlwRect.topLeft(), store->size()); if (fullUpdatePending || (surfaceGeometry != tlwRect && surfaceGeometry.size() != tlwRect.size())) { if (widgetDirty) { const QRect dirtyTlwRect = QRect(QPoint(), tlwRect.size()); @@ -472,11 +393,7 @@ QRegion QWidgetBackingStore::dirtyRegion(QWidget *widget) const QRegion QWidgetBackingStore::staticContents(QWidget *parent, const QRect &withinClipRect) const { if (!parent && tlw->testAttribute(Qt::WA_StaticContents)) { -#if defined(Q_WS_QPA) - const QSize surfaceGeometry(windowSurface->size()); -#else - const QRect surfaceGeometry(windowSurface->geometry()); -#endif + const QSize surfaceGeometry(store->size()); QRect surfaceRect(0, 0, surfaceGeometry.width(), surfaceGeometry.height()); if (!withinClipRect.isEmpty()) surfaceRect &= withinClipRect; @@ -585,12 +502,6 @@ void QWidgetBackingStore::markDirty(const QRegion &rgn, QWidget *widget, bool up return; } - if (!windowSurface->hasFeature(QWindowSurface::PartialUpdates)) { - fullUpdatePending = true; - sendUpdateRequest(tlw, updateImmediately); - return; - } - const QPoint offset = widget->mapTo(tlw, QPoint()); const QRect widgetRect = widget->d_func()->effectiveRectFor(widget->rect()); if (qt_region_strictContains(dirty, widgetRect.translated(offset))) { @@ -680,12 +591,6 @@ void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget, bool upd return; } - if (!windowSurface->hasFeature(QWindowSurface::PartialUpdates)) { - fullUpdatePending = true; - sendUpdateRequest(tlw, updateImmediately); - return; - } - const QRect widgetRect = widget->d_func()->effectiveRectFor(rect); const QRect translatedRect(widgetRect.translated(widget->mapTo(tlw, QPoint()))); if (qt_region_strictContains(dirty, translatedRect)) { @@ -787,73 +692,6 @@ void QWidgetBackingStore::removeDirtyWidget(QWidget *w) } } -#if defined(Q_WS_QWS) && !defined(QT_NO_QWS_MANAGER) -bool QWidgetBackingStore::hasDirtyWindowDecoration() const -{ - QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData(); - if (tlwExtra && tlwExtra->qwsManager) - return !tlwExtra->qwsManager->d_func()->dirtyRegions.isEmpty(); - return false; -} - -void QWidgetBackingStore::paintWindowDecoration() -{ - if (!hasDirtyWindowDecoration()) - return; - - QDecoration &decoration = QApplication::qwsDecoration(); - const QRect decorationRect = tlw->rect(); - QRegion decorationRegion = decoration.region(tlw, decorationRect); - - QWSManagerPrivate *managerPrivate = tlw->d_func()->topData()->qwsManager->d_func(); - const bool doClipping = !managerPrivate->entireDecorationNeedsRepaint - && !managerPrivate->dirtyClip.isEmpty(); - - if (doClipping) { - decorationRegion &= static_cast<QWSWindowSurface *>(windowSurface)->clipRegion(); - decorationRegion &= managerPrivate->dirtyClip; - } - - if (decorationRegion.isEmpty()) - return; - - //### The QWS decorations do not always paint the pixels they promise to paint. - // This causes painting problems with QWSMemorySurface. Since none of the other - // window surfaces actually use the region, passing an empty region is a safe - // workaround. - - windowSurface->beginPaint(QRegion()); - - QPaintEngine *engine = windowSurface->paintDevice()->paintEngine(); - Q_ASSERT(engine); - const QRegion oldSystemClip(engine->systemClip()); - engine->setSystemClip(decorationRegion.translated(tlwOffset)); - - QPainter painter(windowSurface->paintDevice()); - painter.setFont(QApplication::font()); - painter.translate(tlwOffset); - - const int numDirty = managerPrivate->dirtyRegions.size(); - for (int i = 0; i < numDirty; ++i) { - const int area = managerPrivate->dirtyRegions.at(i); - - QRegion clipRegion = decoration.region(tlw, decorationRect, area); - if (!clipRegion.isEmpty()) { - // Decoration styles changes the clip and assumes the old clip is non-empty, - // so we have to set it, but in theory it shouldn't be required. - painter.setClipRegion(clipRegion); - decoration.paint(&painter, tlw, area, managerPrivate->dirtyStates.at(i)); - } - } - markDirtyOnScreen(decorationRegion, tlw, QPoint()); - - painter.end(); - windowSurface->endPaint(decorationRegion); - managerPrivate->clearDirtyRegions(); - engine->setSystemClip(oldSystemClip); -} -#endif - void QWidgetBackingStore::updateLists(QWidget *cur) { if (!cur) @@ -870,28 +708,14 @@ void QWidgetBackingStore::updateLists(QWidget *cur) if (cur->testAttribute(Qt::WA_StaticContents)) addStaticWidget(cur); - -#ifdef Q_BACKINGSTORE_SUBSURFACES - QTLWExtra *extra = cur->d_func()->maybeTopData(); - if (extra && extra->windowSurface && cur != tlw) - subSurfaces.append(extra->windowSurface); -#endif } QWidgetBackingStore::QWidgetBackingStore(QWidget *topLevel) : tlw(topLevel), dirtyOnScreenWidgets(0), hasDirtyFromPreviousSync(false) , fullUpdatePending(0) { - windowSurface = tlw->windowSurface(); - if (!windowSurface) - windowSurface = topLevel->d_func()->createDefaultWindowSurface(); - - // The QWindowSurface constructor will call QWidget::setWindowSurface(), - // but automatically created surfaces should not be added to the topdata. -#ifdef Q_BACKINGSTORE_SUBSURFACES - Q_ASSERT(topLevel->d_func()->topData()->windowSurface == windowSurface); -#endif - topLevel->d_func()->topData()->windowSurface = 0; + store = tlw->backingStore(); + Q_ASSERT(store); // Ensure all existing subsurfaces and static widgets are added to their respective lists. updateLists(topLevel); @@ -903,8 +727,6 @@ QWidgetBackingStore::~QWidgetBackingStore() resetWidget(dirtyWidgets.at(c)); } - delete windowSurface; - windowSurface = 0; delete dirtyOnScreenWidgets; dirtyOnScreenWidgets = 0; } @@ -962,7 +784,7 @@ void QWidgetPrivate::moveRect(const QRect &rect, int dx, int dy) invalidateBuffer((newRect & clipR).translated(-data.crect.topLeft())); } else { - QWidgetBackingStore *wbs = x->backingStore.data(); + QWidgetBackingStore *wbs = x->backingStoreTracker.data(); QRegion childExpose(newRect & clipR); if (sourceRect.isValid() && wbs->bltRect(sourceRect, dx, dy, pw)) @@ -1005,7 +827,7 @@ void QWidgetPrivate::scrollRect(const QRect &rect, int dx, int dy) if (x->inTopLevelResize) return; - QWidgetBackingStore *wbs = x->backingStore.data(); + QWidgetBackingStore *wbs = x->backingStoreTracker.data(); if (!wbs) return; @@ -1140,14 +962,9 @@ void QWidgetBackingStore::sync(QWidget *exposedWidget, const QRegion &exposedReg return; } - // If there's no preserved contents support we always need - // to do a full repaint before flushing - if (!windowSurface->hasFeature(QWindowSurface::PreservedContents)) - fullUpdatePending = true; - // Nothing to repaint. if (!isDirty()) { - qt_flush(exposedWidget, exposedRegion, windowSurface, tlw, tlwOffset); + qt_flush(exposedWidget, exposedRegion, store, tlw, tlwOffset); return; } @@ -1185,11 +1002,7 @@ void QWidgetBackingStore::sync() const bool inTopLevelResize = tlwExtra->inTopLevelResize; const QRect tlwRect(topLevelRect()); -#ifdef Q_WS_QPA - const QRect surfaceGeometry(tlwRect.topLeft(), windowSurface->size()); -#else - const QRect surfaceGeometry(windowSurface->geometry()); -#endif + const QRect surfaceGeometry(tlwRect.topLeft(), store->size()); if ((fullUpdatePending || inTopLevelResize || surfaceGeometry.size() != tlwRect.size()) && !updatesDisabled) { if (hasStaticContents()) { // Repaint existing dirty area and newly visible area. @@ -1198,7 +1011,7 @@ void QWidgetBackingStore::sync() QRegion newVisible(0, 0, tlwRect.width(), tlwRect.height()); newVisible -= staticRegion; dirty += newVisible; - windowSurface->setStaticContents(staticRegion); + store->setStaticContents(staticRegion); } else { // Repaint everything. dirty = QRegion(0, 0, tlwRect.width(), tlwRect.height()); @@ -1209,13 +1022,8 @@ void QWidgetBackingStore::sync() } } -#ifdef Q_WS_QPA if (inTopLevelResize || surfaceGeometry.size() != tlwRect.size()) - windowSurface->resize(tlwRect.size()); -#else - if (inTopLevelResize || surfaceGeometry != tlwRect) - windowSurface->setGeometry(tlwRect); -#endif + store->resize(tlwRect.size()); if (updatesDisabled) return; @@ -1296,16 +1104,14 @@ void QWidgetBackingStore::sync() } #endif -#ifndef Q_BACKINGSTORE_SUBSURFACES BeginPaintInfo beginPaintInfo; - beginPaint(toClean, tlw, windowSurface, &beginPaintInfo); + beginPaint(toClean, tlw, store, &beginPaintInfo); if (beginPaintInfo.nothingToPaint) { for (int i = 0; i < opaqueNonOverlappedWidgets.size(); ++i) resetWidget(opaqueNonOverlappedWidgets[i]); dirty = QRegion(); return; } -#endif // Must do this before sending any paint events because // the size may change in the paint event. @@ -1328,90 +1134,19 @@ void QWidgetBackingStore::sync() QRegion toBePainted(wd->dirty); resetWidget(w); -#ifdef Q_BACKINGSTORE_SUBSURFACES - QWindowSurface *subSurface = w->windowSurface(); - BeginPaintInfo beginPaintInfo; - - QPoint off = w->mapTo(tlw, QPoint()); - toBePainted.translate(off); - beginPaint(toBePainted, w, subSurface, &beginPaintInfo, true); - toBePainted.translate(-off); - - if (beginPaintInfo.nothingToPaint) - continue; - - if (beginPaintInfo.windowSurfaceRecreated) { - // Eep the window surface has changed. The old one may have been - // deleted, in which case we will segfault on the call to - // painterOffset() below. Use the new window surface instead. - subSurface = w->windowSurface(); - } - - QPoint offset(tlwOffset); - if (subSurface == windowSurface) - offset += w->mapTo(tlw, QPoint()); - else - offset = static_cast<QWSWindowSurface*>(subSurface)->painterOffset(); - wd->drawWidget(subSurface->paintDevice(), toBePainted, offset, flags, 0, this); - - endPaint(toBePainted, subSurface, &beginPaintInfo); -#else QPoint offset(tlwOffset); if (w != tlw) offset += w->mapTo(tlw, QPoint()); - wd->drawWidget(windowSurface->paintDevice(), toBePainted, offset, flags, 0, this); -#endif + wd->drawWidget(store->paintDevice(), toBePainted, offset, flags, 0, this); } // Paint the rest with composition. -#ifndef Q_BACKINGSTORE_SUBSURFACES if (repaintAllWidgets || !dirtyCopy.isEmpty()) { const int flags = QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawRecursive; - tlw->d_func()->drawWidget(windowSurface->paintDevice(), dirtyCopy, tlwOffset, flags, 0, this); + tlw->d_func()->drawWidget(store->paintDevice(), dirtyCopy, tlwOffset, flags, 0, this); } - endPaint(toClean, windowSurface, &beginPaintInfo); -#else - if (!repaintAllWidgets && dirtyCopy.isEmpty()) - return; // Nothing more to paint. - - QList<QWindowSurface *> surfaceList(subSurfaces); - surfaceList.prepend(windowSurface); - const QRect dirtyBoundingRect(dirtyCopy.boundingRect()); - - // Loop through all window surfaces (incl. the top-level surface) and - // repaint those intersecting with the bounding rect of the dirty region. - for (int i = 0; i < surfaceList.size(); ++i) { - QWindowSurface *subSurface = surfaceList.at(i); - QWidget *w = subSurface->window(); - QWidgetPrivate *wd = w->d_func(); - - const QRect clipRect = wd->clipRect().translated(w->mapTo(tlw, QPoint())); - if (!qRectIntersects(dirtyBoundingRect, clipRect)) - continue; - - toClean = dirtyCopy; - BeginPaintInfo beginPaintInfo; - beginPaint(toClean, w, subSurface, &beginPaintInfo); - if (beginPaintInfo.nothingToPaint) - continue; - - if (beginPaintInfo.windowSurfaceRecreated) { - // Eep the window surface has changed. The old one may have been - // deleted, in which case we will segfault on the call to - // painterOffset() below. Use the new window surface instead. - subSurface = w->windowSurface(); - } - - int flags = QWidgetPrivate::DrawRecursive; - if (w == tlw) - flags |= QWidgetPrivate::DrawAsRoot; - const QPoint painterOffset = static_cast<QWSWindowSurface*>(subSurface)->painterOffset(); - wd->drawWidget(subSurface->paintDevice(), toClean, painterOffset, flags, 0, this); - - endPaint(toClean, subSurface, &beginPaintInfo); - } -#endif + endPaint(toClean, store, &beginPaintInfo); } /*! @@ -1419,15 +1154,11 @@ void QWidgetBackingStore::sync() If the \a widget is non-zero, the content is flushed to the \a widget. If the \a surface is non-zero, the content of the \a surface is flushed. */ -void QWidgetBackingStore::flush(QWidget *widget, QWindowSurface *surface) +void QWidgetBackingStore::flush(QWidget *widget, QBackingStore *backingStore) { -#if defined(Q_WS_QWS) && !defined(QT_NO_QWS_MANAGER) - paintWindowDecoration(); -#endif - if (!dirtyOnScreen.isEmpty()) { QWidget *target = widget ? widget : tlw; - QWindowSurface *source = surface ? surface : windowSurface; + QBackingStore *source = store ? store : backingStore; qt_flush(target, dirtyOnScreen, source, tlw, tlwOffset); dirtyOnScreen = QRegion(); } @@ -1439,7 +1170,7 @@ void QWidgetBackingStore::flush(QWidget *widget, QWindowSurface *surface) QWidget *w = dirtyOnScreenWidgets->at(i); QWidgetPrivate *wd = w->d_func(); Q_ASSERT(wd->needsFlush); - qt_flush(w, *wd->needsFlush, windowSurface, tlw, tlwOffset); + qt_flush(w, *wd->needsFlush, backingStore, tlw, tlwOffset); *wd->needsFlush = QRegion(); } dirtyOnScreenWidgets->clear(); @@ -1574,7 +1305,7 @@ void QWidgetPrivate::invalidateBuffer(const QRegion &rgn) if (wrgn.isEmpty()) return; - tlwExtra->backingStore->markDirty(wrgn, q, false, true); + tlwExtra->backingStoreTracker->markDirty(wrgn, q, false, true); } /*! @@ -1598,7 +1329,7 @@ void QWidgetPrivate::invalidateBuffer(const QRect &rect) return; if (graphicsEffect || !extra || !extra->hasMask) { - tlwExtra->backingStore->markDirty(wRect, q, false, true); + tlwExtra->backingStoreTracker->markDirty(wRect, q, false, true); return; } @@ -1607,7 +1338,7 @@ void QWidgetPrivate::invalidateBuffer(const QRect &rect) if (wRgn.isEmpty()) return; - tlwExtra->backingStore->markDirty(wRgn, q, false, true); + tlwExtra->backingStoreTracker->markDirty(wRgn, q, false, true); } void QWidgetPrivate::repaint_sys(const QRegion &rgn) diff --git a/src/widgets/kernel/qbackingstore_p.h b/src/widgets/kernel/qwidgetbackingstore_p.h index cd41af31e1..4d43a90322 100644 --- a/src/widgets/kernel/qbackingstore_p.h +++ b/src/widgets/kernel/qwidgetbackingstore_p.h @@ -39,8 +39,8 @@ ** ****************************************************************************/ -#ifndef QBACKINGSTORE_P_H -#define QBACKINGSTORE_P_H +#ifndef QWIDGETBACKINGSTORE_P_H +#define QWIDGETBACKINGSTORE_P_H // // W A R N I N G @@ -56,20 +56,15 @@ #include <QDebug> #include <QtWidgets/qwidget.h> #include <private/qwidget_p.h> -#include <private/qwindowsurface_p.h> -#ifdef Q_WS_QWS -#include <private/qwindowsurface_qws_p.h> -#endif +#include <QtGui/qbackingstore.h> QT_BEGIN_NAMESPACE -class QWindowSurface; - struct BeginPaintInfo { - inline BeginPaintInfo() : wasFlushed(0), nothingToPaint(0), windowSurfaceRecreated(0) {} + inline BeginPaintInfo() : wasFlushed(0), nothingToPaint(0), backingStoreRecreated(0) {} uint wasFlushed : 1; uint nothingToPaint : 1; - uint windowSurfaceRecreated : 1; + uint backingStoreRecreated : 1; }; class Q_AUTOTEST_EXPORT QWidgetBackingStore @@ -82,11 +77,11 @@ public: void sync(QWidget *exposedWidget, const QRegion &exposedRegion); void sync(); - void flush(QWidget *widget = 0, QWindowSurface *surface = 0); + void flush(QWidget *widget = 0, QBackingStore *store = 0); inline QPoint topLevelOffset() const { return tlwOffset; } - QWindowSurface *surface() const { return windowSurface; } + QBackingStore *backingStore() const { return store; } inline bool isDirty() const { @@ -112,10 +107,7 @@ private: QVector<QWidget *> dirtyWidgets; QVector<QWidget *> *dirtyOnScreenWidgets; QList<QWidget *> staticWidgets; - QWindowSurface *windowSurface; -#ifdef Q_BACKINGSTORE_SUBSURFACES - QList<QWindowSurface*> subSurfaces; -#endif + QBackingStore *store; uint hasDirtyFromPreviousSync : 1; uint fullUpdatePending : 1; @@ -127,9 +119,9 @@ private: bool bltRect(const QRect &rect, int dx, int dy, QWidget *widget); void releaseBuffer(); - void beginPaint(QRegion &toClean, QWidget *widget, QWindowSurface *windowSurface, + void beginPaint(QRegion &toClean, QWidget *widget, QBackingStore *backingStore, BeginPaintInfo *returnInfo, bool toCleanIsInTopLevelCoordinates = true); - void endPaint(const QRegion &cleaned, QWindowSurface *windowSurface, BeginPaintInfo *beginPaintInfo); + void endPaint(const QRegion &cleaned, QBackingStore *backingStore, BeginPaintInfo *beginPaintInfo); QRegion dirtyRegion(QWidget *widget = 0) const; QRegion staticContents(QWidget *widget = 0, const QRect &withinClipRect = QRect()) const; @@ -262,15 +254,13 @@ private: } inline bool hasStaticContents() const - { return !staticWidgets.isEmpty() && windowSurface->hasFeature(QWindowSurface::StaticContents); } + { return !staticWidgets.isEmpty(); } friend QRegion qt_dirtyRegion(QWidget *); friend class QWidgetPrivate; friend class QWidget; - friend class QWSManagerPrivate; friend class QETWidget; - friend class QWindowSurface; - friend class QWSWindowSurface; + friend class QBackingStore; }; QT_END_NAMESPACE |