From 8f55220d9a97449581fef147fb8d3971403c93f1 Mon Sep 17 00:00:00 2001 From: Lucas Murray Date: Thu, 26 Feb 2009 10:38:52 +0000 Subject: [PATCH] Update the taskbar thumbnail if the original window was damaged. svn path=/trunk/KDE/kdebase/workspace/; revision=932227 --- effects/taskbarthumbnail/taskbarthumbnail.cpp | 17 ++++++++++++++++- effects/taskbarthumbnail/taskbarthumbnail.h | 4 +++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/effects/taskbarthumbnail/taskbarthumbnail.cpp b/effects/taskbarthumbnail/taskbarthumbnail.cpp index a16327cbc8..02a309480b 100644 --- a/effects/taskbarthumbnail/taskbarthumbnail.cpp +++ b/effects/taskbarthumbnail/taskbarthumbnail.cpp @@ -53,9 +53,22 @@ void TaskbarThumbnailEffect::prePaintScreen( ScreenPrePaintData& data, int time // if( thumbnails.count() > 0 ) // // TODO this should not be needed (it causes whole screen repaint) // data.mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS; + + damagedWindows.clear(); + effects->prePaintScreen(data, time); } +void TaskbarThumbnailEffect::postPaintScreen() + { + // Update the thumbnail if the window was damaged + foreach( EffectWindow* w, thumbnails.keys() ) + foreach( const Data &thumb, thumbnails.values( w )) + if( damagedWindows.contains( effects->findWindow( thumb.window ))) + effects->addRepaint( thumb.rect.translated( w->pos() )); + effects->postPaintScreen(); + } + void TaskbarThumbnailEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time ) { // TODO what if of the windows is translucent and one not? change data.mask? @@ -64,6 +77,8 @@ void TaskbarThumbnailEffect::prePaintWindow( EffectWindow* w, WindowPrePaintData void TaskbarThumbnailEffect::paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ) { + if( !( region & w->geometry() ).isEmpty() ) + damagedWindows.append( w ); // This window is damaged, TODO: Causes repaint loop if thumbnail covers window effects->paintWindow( w, mask, region, data ); // paint window first if( thumbnails.contains( w )) { // paint thumbnails on it @@ -92,7 +107,7 @@ void TaskbarThumbnailEffect::windowAdded( EffectWindow* w ) propertyNotify( w, atom ); // read initial value } -void TaskbarThumbnailEffect::windowRemoved( EffectWindow* w ) +void TaskbarThumbnailEffect::windowDeleted( EffectWindow* w ) { thumbnails.remove( w ); } diff --git a/effects/taskbarthumbnail/taskbarthumbnail.h b/effects/taskbarthumbnail/taskbarthumbnail.h index 2b97e8a037..1bece045eb 100644 --- a/effects/taskbarthumbnail/taskbarthumbnail.h +++ b/effects/taskbarthumbnail/taskbarthumbnail.h @@ -34,10 +34,11 @@ class TaskbarThumbnailEffect TaskbarThumbnailEffect(); virtual ~TaskbarThumbnailEffect(); virtual void prePaintScreen( ScreenPrePaintData& data, int time ); + virtual void postPaintScreen(); virtual void prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time ); virtual void paintWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data ); virtual void windowAdded( EffectWindow* w ); - virtual void windowRemoved( EffectWindow* w ); + virtual void windowDeleted( EffectWindow* w ); virtual void propertyNotify( EffectWindow* w, long atom ); protected: private: @@ -48,6 +49,7 @@ class TaskbarThumbnailEffect }; long atom; QMultiHash< EffectWindow*, Data > thumbnails; + EffectWindowList damagedWindows; }; } // namespace