Goodbye showYellowThing
The code hasn't been working for at least 5 years, and is just making the repaint manager more complex. We can always re-introduce the feature at a later point. Change-Id: Ib07c782c821f3e653f9452f6fbfe2f87effccc92 Fixes: QTBUG-36435 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>bb10
parent
b455a863a1
commit
44fc2914be
|
|
@ -850,10 +850,6 @@ Q_CORE_EXPORT void qt_assert(const char *assertion, const char *file, int line)
|
|||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(QT_NO_DEBUG) && !defined(QT_PAINT_DEBUG)
|
||||
#define QT_NO_PAINT_DEBUG
|
||||
#endif
|
||||
|
||||
#ifndef Q_CC_MSVC
|
||||
Q_NORETURN
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -627,12 +627,6 @@
|
|||
"condition": "features.listview",
|
||||
"output": [ "publicFeature", "feature" ]
|
||||
},
|
||||
"paint_debug": {
|
||||
"label": "Painting Debug Utilities",
|
||||
"purpose": "Enabled debugging painting with the environment variables QT_FLUSH_UPDATE and QT_FLUSH_PAINT.",
|
||||
"section": "Painting",
|
||||
"output": [ "publicFeature", "feature" ]
|
||||
},
|
||||
"completer": {
|
||||
"label": "QCompleter",
|
||||
"purpose": "Provides completions based on an item model.",
|
||||
|
|
|
|||
|
|
@ -5303,9 +5303,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
|
|||
q->setAttribute(Qt::WA_WState_InPaintEvent);
|
||||
|
||||
//clip away the new area
|
||||
#ifndef QT_NO_PAINT_DEBUG
|
||||
bool flushed = QWidgetRepaintManager::flushPaint(q, toBePainted);
|
||||
#endif
|
||||
QPaintEngine *paintEngine = pdev->paintEngine();
|
||||
if (paintEngine) {
|
||||
setRedirected(pdev, -offset);
|
||||
|
|
@ -5406,11 +5403,6 @@ void QWidgetPrivate::drawWidget(QPaintDevice *pdev, const QRegion &rgn, const QP
|
|||
if (paintEngine && paintEngine->autoDestruct()) {
|
||||
delete paintEngine;
|
||||
}
|
||||
|
||||
#ifndef QT_NO_PAINT_DEBUG
|
||||
if (flushed)
|
||||
QWidgetRepaintManager::unflushPaint(q, toBePainted);
|
||||
#endif
|
||||
} else if (q->isWindow()) {
|
||||
QPaintEngine *engine = pdev->paintEngine();
|
||||
if (engine) {
|
||||
|
|
|
|||
|
|
@ -63,11 +63,6 @@
|
|||
|
||||
#include <qpa/qplatformbackingstore.h>
|
||||
|
||||
#if defined(Q_OS_WIN) && !defined(QT_NO_PAINT_DEBUG)
|
||||
# include <QtCore/qt_windows.h>
|
||||
# include <qpa/qplatformnativeinterface.h>
|
||||
#endif
|
||||
|
||||
#include <private/qmemory_p.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
|
@ -98,11 +93,6 @@ void QWidgetRepaintManager::qt_flush(QWidget *widget, const QRegion ®ion, QBa
|
|||
Q_ASSERT(widget);
|
||||
Q_ASSERT(backingStore);
|
||||
Q_ASSERT(tlw);
|
||||
#if !defined(QT_NO_PAINT_DEBUG)
|
||||
static int flushUpdate = qEnvironmentVariableIntValue("QT_FLUSH_UPDATE");
|
||||
if (flushUpdate > 0)
|
||||
QWidgetRepaintManager::showYellowThing(widget, region, flushUpdate * 10, false);
|
||||
#endif
|
||||
|
||||
if (tlw->testAttribute(Qt::WA_DontShowOnScreen) || widget->testAttribute(Qt::WA_DontShowOnScreen))
|
||||
return;
|
||||
|
|
@ -164,144 +154,6 @@ void QWidgetRepaintManager::qt_flush(QWidget *widget, const QRegion ®ion, QBa
|
|||
backingStore->flush(effectiveRegion, widget->windowHandle(), offset);
|
||||
}
|
||||
|
||||
#ifndef QT_NO_PAINT_DEBUG
|
||||
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
||||
|
||||
static void showYellowThing_win(QWidget *widget, const QRegion ®ion, int msec)
|
||||
{
|
||||
// We expect to be passed a native parent.
|
||||
QWindow *nativeWindow = widget->windowHandle();
|
||||
if (!nativeWindow)
|
||||
return;
|
||||
void *hdcV = QGuiApplication::platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("getDC"), nativeWindow);
|
||||
if (!hdcV)
|
||||
return;
|
||||
const HDC hdc = reinterpret_cast<HDC>(hdcV);
|
||||
|
||||
static const COLORREF colors[] = {RGB(255, 255, 0), RGB(255, 200, 55), RGB(200, 255, 55), RGB(200, 200, 0)};
|
||||
|
||||
static size_t i = 0;
|
||||
const HBRUSH brush = CreateSolidBrush(colors[i]);
|
||||
i = (i + 1) % (sizeof(colors) / sizeof(colors[0]));
|
||||
|
||||
for (const QRect &rect : region) {
|
||||
RECT winRect;
|
||||
SetRect(&winRect, rect.left(), rect.top(), rect.right(), rect.bottom());
|
||||
FillRect(hdc, &winRect, brush);
|
||||
}
|
||||
DeleteObject(brush);
|
||||
QGuiApplication::platformNativeInterface()->nativeResourceForWindow(QByteArrayLiteral("releaseDC"), nativeWindow);
|
||||
::Sleep(msec);
|
||||
}
|
||||
#endif // defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
||||
|
||||
void QWidgetRepaintManager::showYellowThing(QWidget *widget, const QRegion &toBePainted, int msec, bool unclipped)
|
||||
{
|
||||
#ifdef Q_OS_WINRT
|
||||
Q_UNUSED(msec)
|
||||
#endif
|
||||
QRegion paintRegion = toBePainted;
|
||||
QRect widgetRect = widget->rect();
|
||||
|
||||
if (!hasPlatformWindow(widget)) {
|
||||
QWidget *nativeParent = widget->nativeParentWidget();
|
||||
const QPoint offset = widget->mapTo(nativeParent, QPoint(0, 0));
|
||||
paintRegion.translate(offset);
|
||||
widgetRect.translate(offset);
|
||||
widget = nativeParent;
|
||||
}
|
||||
|
||||
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
|
||||
Q_UNUSED(unclipped);
|
||||
showYellowThing_win(widget, paintRegion, msec);
|
||||
#else
|
||||
//flags to fool painter
|
||||
bool paintUnclipped = widget->testAttribute(Qt::WA_PaintUnclipped);
|
||||
if (unclipped && !widget->d_func()->paintOnScreen())
|
||||
widget->setAttribute(Qt::WA_PaintUnclipped);
|
||||
|
||||
const bool setFlag = !widget->testAttribute(Qt::WA_WState_InPaintEvent);
|
||||
if (setFlag)
|
||||
widget->setAttribute(Qt::WA_WState_InPaintEvent);
|
||||
|
||||
//setup the engine
|
||||
QPaintEngine *pe = widget->paintEngine();
|
||||
if (pe) {
|
||||
pe->setSystemClip(paintRegion);
|
||||
{
|
||||
QPainter p(widget);
|
||||
p.setClipRegion(paintRegion);
|
||||
static int i = 0;
|
||||
switch (i) {
|
||||
case 0:
|
||||
p.fillRect(widgetRect, QColor(255,255,0));
|
||||
break;
|
||||
case 1:
|
||||
p.fillRect(widgetRect, QColor(255,200,55));
|
||||
break;
|
||||
case 2:
|
||||
p.fillRect(widgetRect, QColor(200,255,55));
|
||||
break;
|
||||
case 3:
|
||||
p.fillRect(widgetRect, QColor(200,200,0));
|
||||
break;
|
||||
}
|
||||
i = (i+1) & 3;
|
||||
p.end();
|
||||
}
|
||||
}
|
||||
|
||||
if (setFlag)
|
||||
widget->setAttribute(Qt::WA_WState_InPaintEvent, false);
|
||||
|
||||
//restore
|
||||
widget->setAttribute(Qt::WA_PaintUnclipped, paintUnclipped);
|
||||
|
||||
if (pe)
|
||||
pe->setSystemClip(QRegion());
|
||||
|
||||
#if defined(Q_OS_UNIX)
|
||||
::usleep(1000 * msec);
|
||||
#endif
|
||||
#endif // !Q_OS_WIN
|
||||
}
|
||||
|
||||
bool QWidgetRepaintManager::flushPaint(QWidget *widget, const QRegion &rgn)
|
||||
{
|
||||
if (!widget)
|
||||
return false;
|
||||
|
||||
int delay = 0;
|
||||
if (widget->testAttribute(Qt::WA_WState_InPaintEvent)) {
|
||||
static int flushPaintEvent = qEnvironmentVariableIntValue("QT_FLUSH_PAINT_EVENT");
|
||||
if (!flushPaintEvent)
|
||||
return false;
|
||||
delay = flushPaintEvent;
|
||||
} else {
|
||||
static int flushPaint = qEnvironmentVariableIntValue("QT_FLUSH_PAINT");
|
||||
if (!flushPaint)
|
||||
return false;
|
||||
delay = flushPaint;
|
||||
}
|
||||
|
||||
QWidgetRepaintManager::showYellowThing(widget, rgn, delay * 10, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
void QWidgetRepaintManager::unflushPaint(QWidget *widget, const QRegion &rgn)
|
||||
{
|
||||
if (widget->d_func()->paintOnScreen() || rgn.isEmpty())
|
||||
return;
|
||||
|
||||
QWidget *tlw = widget->window();
|
||||
QTLWExtra *tlwExtra = tlw->d_func()->maybeTopData();
|
||||
if (!tlwExtra)
|
||||
return;
|
||||
|
||||
qt_flush(widget, rgn, tlwExtra->repaintManager->store, tlw, 0, tlw->d_func()->maybeRepaintManager());
|
||||
}
|
||||
#endif // QT_NO_PAINT_DEBUG
|
||||
|
||||
/*
|
||||
Moves the whole rect by (dx, dy) in widget's coordinate system.
|
||||
Doesn't generate any updates.
|
||||
|
|
@ -316,45 +168,21 @@ bool QWidgetRepaintManager::bltRect(const QRect &rect, int dx, int dy, QWidget *
|
|||
}
|
||||
|
||||
/*!
|
||||
Prepares the window surface to paint a\ toClean region of the \a widget and
|
||||
updates the BeginPaintInfo struct accordingly.
|
||||
Prepares the window surface to paint a\ toClean region of the \a widget.
|
||||
|
||||
The \a toClean region might be clipped by the window surface.
|
||||
*/
|
||||
void QWidgetRepaintManager::beginPaint(QRegion &toClean, QBackingStore *backingStore, BeginPaintInfo *returnInfo)
|
||||
void QWidgetRepaintManager::beginPaint(QRegion &toClean, QBackingStore *backingStore)
|
||||
{
|
||||
// Always flush repainted areas.
|
||||
dirtyOnScreen += toClean;
|
||||
|
||||
#ifdef QT_NO_PAINT_DEBUG
|
||||
backingStore->beginPaint(toClean);
|
||||
#else
|
||||
returnInfo->wasFlushed = QWidgetRepaintManager::flushPaint(tlw, toClean);
|
||||
// Avoid deadlock with QT_FLUSH_PAINT: the server will wait for
|
||||
// the BackingStore lock, so if we hold that, the server will
|
||||
// never release the Communication lock that we are waiting for in
|
||||
// sendSynchronousCommand
|
||||
if (!returnInfo->wasFlushed)
|
||||
backingStore->beginPaint(toClean);
|
||||
#endif
|
||||
|
||||
Q_UNUSED(returnInfo);
|
||||
}
|
||||
|
||||
void QWidgetRepaintManager::endPaint(const QRegion &cleaned, QBackingStore *backingStore,
|
||||
BeginPaintInfo *beginPaintInfo)
|
||||
void QWidgetRepaintManager::endPaint(QBackingStore *backingStore)
|
||||
{
|
||||
#ifndef QT_NO_PAINT_DEBUG
|
||||
if (!beginPaintInfo->wasFlushed)
|
||||
backingStore->endPaint();
|
||||
else
|
||||
QWidgetRepaintManager::unflushPaint(tlw, cleaned);
|
||||
#else
|
||||
Q_UNUSED(beginPaintInfo);
|
||||
Q_UNUSED(cleaned);
|
||||
backingStore->endPaint();
|
||||
#endif
|
||||
|
||||
flush();
|
||||
}
|
||||
|
||||
|
|
@ -1298,8 +1126,7 @@ void QWidgetRepaintManager::doSync()
|
|||
}
|
||||
#endif
|
||||
|
||||
BeginPaintInfo beginPaintInfo;
|
||||
beginPaint(toClean, store, &beginPaintInfo);
|
||||
beginPaint(toClean, store);
|
||||
|
||||
// Must do this before sending any paint events because
|
||||
// the size may change in the paint event.
|
||||
|
|
@ -1335,7 +1162,7 @@ void QWidgetRepaintManager::doSync()
|
|||
tlw->d_func()->drawWidget(store->paintDevice(), dirtyCopy, QPoint(), flags, 0, this);
|
||||
}
|
||||
|
||||
endPaint(toClean, store, &beginPaintInfo);
|
||||
endPaint(store);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
@ -1545,17 +1372,8 @@ void QWidgetPrivate::repaint_sys(const QRegion &rgn)
|
|||
if (toBePainted.isEmpty())
|
||||
return; // Nothing to repaint.
|
||||
|
||||
#ifndef QT_NO_PAINT_DEBUG
|
||||
bool flushed = QWidgetRepaintManager::flushPaint(q, toBePainted);
|
||||
#endif
|
||||
|
||||
drawWidget(q, toBePainted, QPoint(), QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawPaintOnScreen, 0);
|
||||
|
||||
#ifndef QT_NO_PAINT_DEBUG
|
||||
if (flushed)
|
||||
QWidgetRepaintManager::unflushPaint(q, toBePainted);
|
||||
#endif
|
||||
|
||||
if (Q_UNLIKELY(q->paintingActive()))
|
||||
qWarning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,11 +63,6 @@ class QPlatformTextureList;
|
|||
class QPlatformTextureListWatcher;
|
||||
class QWidgetRepaintManager;
|
||||
|
||||
struct BeginPaintInfo {
|
||||
inline BeginPaintInfo() : wasFlushed(0) {}
|
||||
uint wasFlushed : 1;
|
||||
};
|
||||
|
||||
#ifndef QT_NO_OPENGL
|
||||
class QPlatformTextureListWatcher : public QObject
|
||||
{
|
||||
|
|
@ -103,8 +98,6 @@ public:
|
|||
QWidgetRepaintManager(QWidget *t);
|
||||
~QWidgetRepaintManager();
|
||||
|
||||
static void showYellowThing(QWidget *widget, const QRegion &rgn, int msec, bool);
|
||||
|
||||
void sync(QWidget *exposedWidget, const QRegion &exposedRegion);
|
||||
void sync();
|
||||
void flush(QWidget *widget = nullptr);
|
||||
|
|
@ -138,8 +131,6 @@ private:
|
|||
|
||||
void sendUpdateRequest(QWidget *widget, UpdateTime updateTime);
|
||||
|
||||
static bool flushPaint(QWidget *widget, const QRegion &rgn);
|
||||
static void unflushPaint(QWidget *widget, const QRegion &rgn);
|
||||
static void qt_flush(QWidget *widget, const QRegion ®ion, QBackingStore *backingStore,
|
||||
QWidget *tlw,
|
||||
QPlatformTextureList *widgetTextures,
|
||||
|
|
@ -148,8 +139,8 @@ private:
|
|||
void doSync();
|
||||
bool bltRect(const QRect &rect, int dx, int dy, QWidget *widget);
|
||||
|
||||
void beginPaint(QRegion &toClean, QBackingStore *backingStore, BeginPaintInfo *returnInfo);
|
||||
void endPaint(const QRegion &cleaned, QBackingStore *backingStore, BeginPaintInfo *beginPaintInfo);
|
||||
void beginPaint(QRegion &toClean, QBackingStore *backingStore);
|
||||
void endPaint(QBackingStore *backingStore);
|
||||
|
||||
QRegion dirtyRegion(QWidget *widget = nullptr) const;
|
||||
QRegion staticContents(QWidget *widget = nullptr, const QRect &withinClipRect = QRect()) const;
|
||||
|
|
|
|||
Loading…
Reference in New Issue