diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2011-06-06 15:54:11 +0200 |
---|---|---|
committer | Samuel Rødal <samuel.rodal@nokia.com> | 2011-06-06 16:03:38 +0200 |
commit | 078e4ef6c72bdc759b83b5f430390cdcdf7f4e9e (patch) | |
tree | ed480e064dd35fe2f28e786ec066def5aaeb2c4e /src/widgets | |
parent | 481067453ff5b58552ef06c82d5a65019a648907 (diff) |
Made tst_QWidget::updateWhileMinimized() pass.
This requires adding a couple of window system interface events, namely
Map, Unmap, and Expose. When a widget is minimized on X11 it is
unmapped, and thus update requests should not be delivered. Instead the
event will delivered when the widget is mapped, which causes an Expose
event to be sent. The Unmap and Expose event thus need to be handled in
QWidgetWindow, and Map is also added for the purpose of API symmetry
(and for future needs).
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/kernel/qwidgetwindow_qpa.cpp | 28 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow_qpa_p.h | 2 |
2 files changed, 30 insertions, 0 deletions
diff --git a/src/widgets/kernel/qwidgetwindow_qpa.cpp b/src/widgets/kernel/qwidgetwindow_qpa.cpp index dbb8112e43..786293a716 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa.cpp +++ b/src/widgets/kernel/qwidgetwindow_qpa.cpp @@ -100,6 +100,19 @@ bool QWidgetWindow::event(QEvent *event) case QEvent::DragMove: case QEvent::Drop: handleDragEvent(event); + break; + + case QEvent::Map: + m_widget->setAttribute(Qt::WA_Mapped); + return true; + + case QEvent::Unmap: + m_widget->setAttribute(Qt::WA_Mapped, false); + return true; + + case QEvent::Expose: + handleExposeEvent(static_cast<QExposeEvent *>(event)); + return true; default: break; @@ -261,8 +274,19 @@ void QWidgetWindow::handleMoveEvent(QMoveEvent *event) void QWidgetWindow::handleResizeEvent(QResizeEvent *event) { + QSize oldSize = m_widget->data->crect.size(); + m_widget->data->crect = geometry(); 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(); + } } void QWidgetWindow::handleCloseEvent(QCloseEvent *) @@ -345,5 +369,9 @@ void QWidgetWindow::handleDragEvent(QEvent *event) } } +void QWidgetWindow::handleExposeEvent(QExposeEvent *event) +{ + m_widget->d_func()->syncBackingStore(event->region); +} QT_END_NAMESPACE diff --git a/src/widgets/kernel/qwidgetwindow_qpa_p.h b/src/widgets/kernel/qwidgetwindow_qpa_p.h index 443123ece3..a217a969ca 100644 --- a/src/widgets/kernel/qwidgetwindow_qpa_p.h +++ b/src/widgets/kernel/qwidgetwindow_qpa_p.h @@ -45,6 +45,7 @@ #include <QtGui/qwindow.h> #include <QtCore/private/qobject_p.h> +#include <QtGui/private/qevent_p.h> QT_BEGIN_HEADER @@ -74,6 +75,7 @@ protected: void handleResizeEvent(QResizeEvent *); void handleWheelEvent(QWheelEvent *); void handleDragEvent(QEvent *); + void handleExposeEvent(QExposeEvent *); private: QWidget *m_widget; |