Had a look at drawWorld:submorphs:invalidAreasOn: today, the "Experimental top-down drawing" there does not seem to be working optimally. Basically, when there's many windows behind one you're resizing, this many times leads to ALL of them getting repainted. Attached is a fix for this, so only the system window areas which are visible and affected are updated. It will not speed up cases when resizing a complex morph (like the Changes Log), but helps when resizing simple ones with many other windows in the background. If anyone interested in faster resizing (without fastDragWindow) would review the code/check if it helps them it'd be nice. A simple test is to open up a couple system browsers, put them on top of eachother, and resize a simple window (Like the "Welcome to Pharo" window) over their bounds. Then load the changes, and see if you notice a difference. In a test i did (same windows open/resized, as described above), time spent in drawWorld:submorphs:invalidAreasOn: was reduced from 86% to 65.7% after filing in changes. If anyone with a better understanding of Morphic know if anything larger than the clippingBounds is safe to use as default in Morph>>areasRemainingToFill: , that would probably help as well. Cheers, Henry 'From Pharo0.1 of 16 May 2008 [Latest update: #10243] on 25 February 2009 at 2:30:25 pm'! !Morph methodsFor: 'drawing' stamp: 'Henrik Sperre Johansen 2/25/2009 12:06'! areasRemainingToFill: aRectangle "May be overridden by any subclasses with opaque regions" ^ Array withAll: (aRectangle areasOutside: self clippingBounds)! ! !WorldState methodsFor: 'update cycle' stamp: 'Henrik Sperre Johansen 2/25/2009 13:52'! drawWorld: aWorld submorphs: submorphs invalidAreasOn: aCanvas "Redraw the damaged areas of the given canvas and clear the damage list. Return a collection of the areas that were redrawn." | rectList c i n mm morphs rects rectToFill remnants remnantIntersects rect validList | rectList := damageRecorder invalidRectsFullBounds: aWorld viewBox. "sort by areas to draw largest portions first" rectList := rectList asArray sort: [:r1 :r2 | r1 area > r2 area]. damageRecorder reset. n := submorphs size. morphs := OrderedCollection new: n * 2. rects := OrderedCollection new: n * 2. validList := OrderedCollection new: n * 2. rectList do: [:dirtyRect | dirtyRect allAreasOutsideList: validList do: [:r | "Experimental top-down drawing -- Traverses top to bottom, stopping if the entire area is filled. If only a single rectangle remains, then continue with the reduced rectangle." rectToFill := r. remnants := OrderedCollection with: r. i := 1. [remnants isEmpty or: [i > n]] whileFalse: [mm := submorphs at: i. ((remnantIntersects := remnants select: [:each | (mm fullBounds intersects: each)]) notEmpty and: [mm visible]) ifTrue: [morphs addLast: mm. rects addLast: (Rectangle merging: (remnantIntersects collect: [:each | mm fullBounds intersect: each])). remnants removeAll: remnantIntersects. remnantIntersects do: [:eachIntersect | remnants addAll: (mm areasRemainingToFill: eachIntersect)]. remnants size = 1 ifTrue: [rectToFill := remnants first]. remnants isEmpty ifTrue: [rectToFill := nil]]. i := i + 1]. "Now paint from bottom to top, but using the reduced rectangles." rectToFill ifNotNil: [aWorld drawOn: (c := aCanvas copyClipRect: rectToFill)]. [morphs isEmpty] whileFalse: [(rect := rects removeLast) == rectToFill ifFalse: [c := aCanvas copyClipRect: (rectToFill := rect)]. c fullDrawMorph: morphs removeLast]. morphs reset. rects reset. validList add: r]]. ^validList! !