Fix too many resizes and move events for native widgets
When the QWidgetWindow receives a resize or move event, it should check with the widget if its crect already has this geometry. if not then send the resize or move event Ideally events should be sent whenever the QWidgetWindow receives them. QTBUG-42383 is created for this problem Task-number: QTBUG-29937 Task-number: QTBUG-38768 Task-number: QTBUG-30744 Change-Id: I1e9a5d25de29a98885edece927ba14d7a763eb01 Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
This commit is contained in:
parent
293207b503
commit
dce13e4b7b
@ -2571,6 +2571,14 @@ void QWizard::setWizardStyle(WizardStyle style)
|
||||
d->disableUpdates();
|
||||
d->wizStyle = style;
|
||||
d->updateButtonTexts();
|
||||
#if !defined(QT_NO_STYLE_WINDOWSVISTA)
|
||||
if (aeroStyleChange) {
|
||||
//Send a resizeevent since the antiflicker widget probably needs a new size
|
||||
//because of the backbutton in the window title
|
||||
QResizeEvent ev(geometry().size(), geometry().size());
|
||||
QApplication::sendEvent(this, &ev);
|
||||
}
|
||||
#endif
|
||||
d->updateLayout();
|
||||
updateGeometry();
|
||||
d->enableUpdates();
|
||||
|
@ -7155,10 +7155,7 @@ void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove)
|
||||
}
|
||||
}
|
||||
|
||||
// generate a move event for QWidgets without window handles. QWidgets with native
|
||||
// window handles already receive a move event from
|
||||
// QGuiApplicationPrivate::processGeometryChangeEvent.
|
||||
if (isMove && (!q->windowHandle() || q->testAttribute(Qt::WA_DontShowOnScreen))) {
|
||||
if (isMove) {
|
||||
QMoveEvent e(q->pos(), oldPos);
|
||||
QApplication::sendEvent(q, &e);
|
||||
}
|
||||
|
@ -543,14 +543,36 @@ void QWidgetWindow::handleKeyEvent(QKeyEvent *event)
|
||||
QGuiApplication::sendSpontaneousEvent(receiver, event);
|
||||
}
|
||||
|
||||
void QWidgetWindow::updateGeometry()
|
||||
bool QWidgetWindow::updateSize()
|
||||
{
|
||||
bool changed = false;
|
||||
if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
|
||||
return;
|
||||
return changed;
|
||||
if (m_widget->data->crect.size() != geometry().size()) {
|
||||
changed = true;
|
||||
m_widget->data->crect.setSize(geometry().size());
|
||||
}
|
||||
|
||||
updateMargins();
|
||||
return changed;
|
||||
}
|
||||
|
||||
bool QWidgetWindow::updatePos()
|
||||
{
|
||||
bool changed = false;
|
||||
if (m_widget->testAttribute(Qt::WA_OutsideWSRange))
|
||||
return changed;
|
||||
if (m_widget->data->crect.topLeft() != geometry().topLeft()) {
|
||||
changed = true;
|
||||
m_widget->data->crect.moveTopLeft(geometry().topLeft());
|
||||
}
|
||||
updateMargins();
|
||||
return changed;
|
||||
}
|
||||
|
||||
void QWidgetWindow::updateMargins()
|
||||
{
|
||||
const QMargins margins = frameMargins();
|
||||
|
||||
m_widget->data->crect = geometry();
|
||||
QTLWExtra *te = m_widget->d_func()->topData();
|
||||
te->posIncludesFrame= false;
|
||||
te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom());
|
||||
@ -609,24 +631,25 @@ void QWidgetWindow::updateNormalGeometry()
|
||||
|
||||
void QWidgetWindow::handleMoveEvent(QMoveEvent *event)
|
||||
{
|
||||
updateGeometry();
|
||||
QGuiApplication::sendSpontaneousEvent(m_widget, event);
|
||||
if (updatePos())
|
||||
QGuiApplication::sendSpontaneousEvent(m_widget, event);
|
||||
}
|
||||
|
||||
void QWidgetWindow::handleResizeEvent(QResizeEvent *event)
|
||||
{
|
||||
QSize oldSize = m_widget->data->crect.size();
|
||||
|
||||
updateGeometry();
|
||||
QGuiApplication::sendSpontaneousEvent(m_widget, event);
|
||||
if (updateSize()) {
|
||||
QGuiApplication::sendSpontaneousEvent(m_widget, event);
|
||||
|
||||
if (m_widget->d_func()->paintOnScreen()) {
|
||||
QRegion updateRegion(geometry());
|
||||
if (m_widget->testAttribute(Qt::WA_StaticContents))
|
||||
updateRegion -= QRect(0, 0, oldSize.width(), oldSize.height());
|
||||
m_widget->d_func()->syncBackingStore(updateRegion);
|
||||
} else {
|
||||
m_widget->d_func()->syncBackingStore();
|
||||
if (m_widget->d_func()->paintOnScreen()) {
|
||||
QRegion updateRegion(geometry());
|
||||
if (m_widget->testAttribute(Qt::WA_StaticContents))
|
||||
updateRegion -= QRect(0, 0, oldSize.width(), oldSize.height());
|
||||
m_widget->d_func()->syncBackingStore(updateRegion);
|
||||
} else {
|
||||
m_widget->d_func()->syncBackingStore();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,7 +108,9 @@ private slots:
|
||||
|
||||
private:
|
||||
void repaintWindow();
|
||||
void updateGeometry();
|
||||
bool updateSize();
|
||||
bool updatePos();
|
||||
void updateMargins();
|
||||
void updateNormalGeometry();
|
||||
|
||||
enum FocusWidgets {
|
||||
|
101
tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
Executable file → Normal file
101
tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp
Executable file → Normal file
@ -95,6 +95,8 @@ private slots:
|
||||
void tst_updateWinId_QTBUG40681();
|
||||
void tst_recreateWindow_QTBUG40817();
|
||||
|
||||
void tst_resize_count();
|
||||
void tst_move_count();
|
||||
};
|
||||
|
||||
void tst_QWidget_window::initTestCase()
|
||||
@ -660,6 +662,105 @@ void tst_QWidget_window::tst_recreateWindow_QTBUG40817()
|
||||
tab.setCurrentIndex(1);
|
||||
}
|
||||
|
||||
class ResizeWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ResizeWidget(QWidget *parent = 0)
|
||||
: QWidget(parent)
|
||||
, resizeCount(0)
|
||||
{ }
|
||||
|
||||
int resizeCount;
|
||||
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent *) Q_DECL_OVERRIDE
|
||||
{
|
||||
resizeCount++;
|
||||
}
|
||||
};
|
||||
|
||||
void tst_QWidget_window::tst_resize_count()
|
||||
{
|
||||
{
|
||||
ResizeWidget resize;
|
||||
resize.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&resize));
|
||||
QCOMPARE(resize.resizeCount, 1);
|
||||
resize.resizeCount = 0;
|
||||
QSize size = resize.size();
|
||||
size.rwidth() += 10;
|
||||
resize.resize(size);
|
||||
QGuiApplication::sync();
|
||||
QTRY_COMPARE(resize.resizeCount, 1);
|
||||
|
||||
resize.resizeCount = 0;
|
||||
|
||||
ResizeWidget child(&resize);
|
||||
child.resize(200,200);
|
||||
child.winId();
|
||||
child.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&child));
|
||||
QGuiApplication::sync();
|
||||
QTRY_COMPARE(child.resizeCount, 1);
|
||||
child.resizeCount = 0;
|
||||
size = child.size();
|
||||
size.rwidth() += 10;
|
||||
child.resize(size);
|
||||
QGuiApplication::sync();
|
||||
QCOMPARE(resize.resizeCount, 0);
|
||||
QCOMPARE(child.resizeCount, 1);
|
||||
}
|
||||
{
|
||||
ResizeWidget parent;
|
||||
ResizeWidget child(&parent);
|
||||
child.resize(200,200);
|
||||
child.winId();
|
||||
parent.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&parent));
|
||||
parent.resizeCount = 0;
|
||||
QGuiApplication::sync();
|
||||
QTRY_COMPARE(child.resizeCount, 1);
|
||||
child.resizeCount = 0;
|
||||
QSize size = child.size();
|
||||
size.rwidth() += 10;
|
||||
child.resize(size);
|
||||
QGuiApplication::sync();
|
||||
QCOMPARE(parent.resizeCount, 0);
|
||||
QCOMPARE(child.resizeCount, 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class MoveWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
MoveWidget(QWidget *parent = 0)
|
||||
: QWidget(parent)
|
||||
, moveCount(0)
|
||||
{ }
|
||||
|
||||
void moveEvent(QMoveEvent *) Q_DECL_OVERRIDE
|
||||
{
|
||||
moveCount++;
|
||||
}
|
||||
|
||||
int moveCount;
|
||||
};
|
||||
|
||||
void tst_QWidget_window::tst_move_count()
|
||||
{
|
||||
MoveWidget move;
|
||||
move.move(500,500);
|
||||
move.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&move));
|
||||
QTRY_VERIFY(move.moveCount >= 1);
|
||||
move.moveCount = 0;
|
||||
|
||||
move.move(220,250);
|
||||
QTRY_VERIFY(move.moveCount >= 1);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_QWidget_window)
|
||||
#include "tst_qwidget_window.moc"
|
||||
|
Loading…
Reference in New Issue
Block a user