SVN commit 915488 by aseigo: a lot less popup flickering and repainting. if there are no sideeffects to this discovered, this needs to be backported to the 4.2 branch. CCMAIL:plasma-devel@kde.org
M +39 -30 dialog.cpp M +8 -9 popupapplet.cpp --- trunk/KDE/kdelibs/plasma/dialog.cpp #915487:915488 @@ -48,8 +48,6 @@ #include <X11/Xlib.h> #endif -const int resizeAreaMargin = 20; - namespace Plasma { @@ -72,8 +70,10 @@ void themeUpdated(); void adjustView(); + void updateResizeCorners(); Plasma::Dialog *q; + /** * Holds the background SVG, to be re-rendered when the cache is invalidated, * for example by resizing the dialogue. @@ -124,6 +124,7 @@ } else { q->setContentsMargins(leftWidth, topHeight, rightWidth, bottomHeight); } + q->update(); } @@ -196,32 +197,8 @@ void Dialog::paintEvent(QPaintEvent *e) { QPainter p(this); - p.setRenderHint(QPainter::Antialiasing); - p.setClipRect(e->rect()); p.setCompositionMode(QPainter::CompositionMode_Source); - d->background->paintFrame(&p); - - //we set the resize handlers - d->resizeAreas.clear(); - if (d->resizeCorners & Dialog::NorthEast) { - d->resizeAreas[Dialog::NorthEast] = QRect(rect().right() - resizeAreaMargin, 0, - resizeAreaMargin, resizeAreaMargin); - } - - if (d->resizeCorners & Dialog::NorthWest) { - d->resizeAreas[Dialog::NorthWest] = QRect(0, 0, resizeAreaMargin, resizeAreaMargin); - } - - if (d->resizeCorners & Dialog::SouthEast) { - d->resizeAreas[Dialog::SouthEast] = QRect(rect().right() - resizeAreaMargin, - rect().bottom() - resizeAreaMargin, - resizeAreaMargin, resizeAreaMargin); - } - - if (d->resizeCorners & Dialog::SouthWest) { - d->resizeAreas[Dialog::SouthWest] = QRect(0, rect().bottom() - resizeAreaMargin, - resizeAreaMargin, resizeAreaMargin); - } + d->background->paintFrame(&p, e->rect()); } void Dialog::mouseMoveEvent(QMouseEvent *event) @@ -340,8 +317,38 @@ d->view->setSceneRect(d->widget->mapToScene(d->widget->boundingRect()).boundingRect()); d->view->centerOn(d->widget); } + + d->updateResizeCorners(); } +void DialogPrivate::updateResizeCorners() +{ + const int resizeAreaMargin = 20; + const QRect r = q->rect(); + + resizeAreas.clear(); + if (resizeCorners & Dialog::NorthEast) { + resizeAreas[Dialog::NorthEast] = QRect(r.right() - resizeAreaMargin, 0, + resizeAreaMargin, resizeAreaMargin); + } + + if (resizeCorners & Dialog::NorthWest) { + resizeAreas[Dialog::NorthWest] = QRect(0, 0, resizeAreaMargin, resizeAreaMargin); + } + + if (resizeCorners & Dialog::SouthEast) { + resizeAreas[Dialog::SouthEast] = QRect(r.right() - resizeAreaMargin, + r.bottom() - resizeAreaMargin, + resizeAreaMargin, resizeAreaMargin); + } + + if (resizeCorners & Dialog::SouthWest) { + resizeAreas[Dialog::SouthWest] = QRect(0, r.bottom() - resizeAreaMargin, + resizeAreaMargin, resizeAreaMargin); + } + +} + void Dialog::setGraphicsWidget(QGraphicsWidget *widget) { if (d->widget) { @@ -412,14 +419,16 @@ d->view->setSceneRect(d->widget->mapToScene(d->widget->boundingRect()).boundingRect()); d->view->centerOn(d->widget); } - + emit dialogVisible(true); } void Dialog::setResizeHandleCorners(ResizeCorners corners) { - d->resizeCorners = corners; - update(); + if (d->resizeCorners != corners) { + d->resizeCorners = corners; + d->updateResizeCorners(); + } } Dialog::ResizeCorners Dialog::resizeCorners() const --- trunk/KDE/kdelibs/plasma/popupapplet.cpp #915487:915488 @@ -478,7 +478,6 @@ updateDialogPosition(); KWindowSystem::setState(dialog->winId(), NET::SkipTaskbar | NET::SkipPager); dialog->show(); - dialog->resize(dialog->size()); } dialog->clearFocus(); @@ -544,22 +543,22 @@ QSize saved(width, height); if (saved.isNull()) { - dialog->adjustSize(); + saved = dialog->sizeHint(); } else { saved = saved.expandedTo(dialog->minimumSizeHint()); + } + + if (saved.width() != dialog->width() || saved.height() != dialog->height()) { dialog->resize(saved); } QSize s = dialog->size(); QPoint pos = view->mapFromScene(q->scenePos()); + //try to access a corona - if (q->containment() && q->containment()->corona()) { - pos = q->containment()->corona()->popupPosition(q, s); - } else { - Corona *corona = qobject_cast<Corona *>(q->scene()); - if (corona) { - pos = corona->popupPosition(q, s); - } + Corona *corona = qobject_cast<Corona *>(q->scene()); + if (corona) { + pos = corona->popupPosition(q, s); } bool reverse = false; _______________________________________________ Plasma-devel mailing list Plasma-devel@kde.org https://mail.kde.org/mailman/listinfo/plasma-devel