added double buffering to oxygen-client when compositing is off;

force update of buttons in client->paintEvent();
call _client->paint() from Button, instead of parentWidget()->render();
icc-effect-5.14.5
Hugo Pereira Da Costa 2011-06-28 01:27:58 +02:00
parent 6e0733e0de
commit 8361b13de9
4 changed files with 58 additions and 9 deletions

View File

@ -175,23 +175,36 @@ namespace Oxygen
if( _client.compositingActive() )
{
QPainter painter( this );
painter.setClipRect( event->rect() );
painter.setRenderHints(QPainter::Antialiasing);
painter.setClipRegion( event->region() );
paint( painter );
} else {
// create temporary pixmap to avoid flicker
QPixmap pixmap( size() );
{
// create painter
QPainter painter( &pixmap );
painter.setRenderHints(QPainter::Antialiasing);
parentWidget()->render( &painter, QPoint(), geometry(), QWidget::DrawWindowBackground );
painter.setClipRect( this->rect().intersected( event->rect() ) );
// render parent background
// parentWidget()->render( &painter, QPoint(), geometry(), QWidget::DrawWindowBackground );
painter.save();
painter.translate( -geometry().topLeft() );
_client.paint( painter );
painter.restore();
// render buttons
paint( painter );
}
QPainter painter(this);
painter.setClipRect( event->rect() );
painter.setClipRegion( event->region() );
painter.drawPixmap( QPoint(), pixmap );
}
@ -288,6 +301,8 @@ namespace Oxygen
}
painter.restore();
}
//___________________________________________________

View File

@ -172,7 +172,7 @@ namespace Oxygen
private:
//! parent client
const Client &_client;
Client &_client;
//! helper
DecoHelper &_helper;

View File

@ -1370,15 +1370,47 @@ namespace Oxygen
// factory
if(!( _initialized && _factory->initialized() ) ) return;
if( compositingActive() )
{
QPainter painter(widget());
painter.setRenderHint(QPainter::Antialiasing);
painter.setClipRegion( event->region() );
paint( painter );
} else {
QPixmap pixmap( widget()->size() );
{
QPainter painter( &pixmap );
painter.setRenderHint(QPainter::Antialiasing);
painter.setClipRegion( event->region() );
paint( painter );
}
QPainter painter( widget() );
painter.setClipRegion( event->region() );
painter.drawPixmap( QPoint(), pixmap );
// update buttons
QList<Button*> buttons( widget()->findChildren<Button*>() );
foreach( Button* button, buttons )
{
if( event->rect().intersects( button->geometry() ) )
{ button->update(); }
}
}
}
//_________________________________________________________
void Client::paint( QPainter& painter )
{
// palette
QPalette palette = widget()->palette();
palette.setCurrentColorGroup( (isActive() ) ? QPalette::Active : QPalette::Inactive );
// painter
QPainter painter(widget());
painter.setRenderHint(QPainter::Antialiasing);
painter.setClipRegion( event->region() );
// define frame
QRect frame = widget()->rect();

View File

@ -225,6 +225,8 @@ namespace Oxygen
//! resize event
virtual void resizeEvent(QResizeEvent *e);
virtual void paint( QPainter& );
public slots:
//! triggers widget update in titleRect only