freezing 3.2gamma4

Ian Piumarta ian.piumarta at inria.fr
Fri Jul 5 11:00:27 UTC 2002


On Thu, 4 Jul 2002, Baveco,  Hans wrote:
> Don't know what went wrong, but I managed to freeze the image a couple of
> times the last few days, always with the same symptoms.

I've also had debuggers pop up when changing (asynchronously) the geometry
of morphs in the window under the pointer.  The problem seems to be
related to mouse over handling which makes assumptions that are a little
too liberal about the stabililty of the window contents w.r.t. the
handler's "left/over/enteredMorphs" sets.

Adding a few isNil tests to a couple of methods fixes it for me.  Changes
below (and attached just in case of line-end confusion).

Ian

'From Squeak3.2gamma of 15 January 2002 [latest update: #4881] on 5 July 2002 at 12:49:18 pm'!

!MouseOverHandler methodsFor: 'event handling' stamp: 'ikp 7/4/2002 18:37'!
noticeMouseOver: aMorph event: anEvent
	"Remember that the mouse is currently over some morph"
	leftMorphs notNil and: [(leftMorphs includes: aMorph)
		ifTrue:[leftMorphs remove: aMorph]
		ifFalse:[enteredMorphs nextPut: aMorph]].
	overMorphs notNil and: [overMorphs nextPut: aMorph].
! !

!MouseOverHandler methodsFor: 'event handling' stamp: 'ikp 7/4/2002 18:38'!
processMouseOver: anEvent
	"Re-establish the z-order for all morphs wrt the given event"
	| hand localEvt focus evt |
	hand _ anEvent hand.
	leftMorphs _ mouseOverMorphs asIdentitySet.
	"Assume some coherence for the number of objects in over list"
	overMorphs _ WriteStream on: (Array new: leftMorphs size).
	enteredMorphs _ WriteStream on: #().
	"Now go looking for eventual mouse overs"
	hand handleEvent: anEvent asMouseOver.
	"Get out early if there's no change"
	(leftMorphs isNil or: [leftMorphs size = 0 and:[enteredMorphs position = 0]]) 
		ifTrue:[^leftMorphs _ enteredMorphs _ overMorphs _ nil].
	focus _ hand mouseFocus.
	"Send #mouseLeave as appropriate"
	evt _ anEvent asMouseLeave.
	"Keep the order of the left morphs by recreating it from the mouseOverMorphs"
	leftMorphs size > 1 ifTrue:[leftMorphs _ mouseOverMorphs select:[:m| leftMorphs includes: m]].
	leftMorphs do:[:m|
		(m == focus or:[m hasOwner: focus]) 
			ifTrue:[localEvt _ evt transformedBy: (m transformedFrom: hand).
					m handleEvent: localEvt]
			ifFalse:[overMorphs nextPut: m]].
	"Send #mouseEnter as appropriate"
	evt _ anEvent asMouseEnter.
	enteredMorphs ifNil: ["inform: was called in handleEvent:"
		^leftMorphs _ enteredMorphs _ overMorphs _ nil].
	enteredMorphs _ enteredMorphs contents.
	enteredMorphs reverseDo:[:m|
		(m == focus or:[m hasOwner: focus]) 
			ifTrue:[	localEvt _ evt transformedBy: (m transformedFrom: hand).
					m handleEvent: localEvt]].
	"And remember the over list"
	overMorphs ifNil: ["inform: was called in handleEvent:"
		^leftMorphs _ enteredMorphs _ overMorphs _ nil].
	mouseOverMorphs _ overMorphs contents.
	leftMorphs _ enteredMorphs _ overMorphs _ nil.
! !

-------------- next part --------------
'From Squeak3.2gamma of 15 January 2002 [latest update: #4881] on 5 July 2002 at 12:49:18 pm'!

!MouseOverHandler methodsFor: 'event handling' stamp: 'ikp 7/4/2002 18:37'!
noticeMouseOver: aMorph event: anEvent
	"Remember that the mouse is currently over some morph"
	leftMorphs notNil and: [(leftMorphs includes: aMorph)
		ifTrue:[leftMorphs remove: aMorph]
		ifFalse:[enteredMorphs nextPut: aMorph]].
	overMorphs notNil and: [overMorphs nextPut: aMorph].
! !

!MouseOverHandler methodsFor: 'event handling' stamp: 'ikp 7/4/2002 18:38'!
processMouseOver: anEvent
	"Re-establish the z-order for all morphs wrt the given event"
	| hand localEvt focus evt |
	hand _ anEvent hand.
	leftMorphs _ mouseOverMorphs asIdentitySet.
	"Assume some coherence for the number of objects in over list"
	overMorphs _ WriteStream on: (Array new: leftMorphs size).
	enteredMorphs _ WriteStream on: #().
	"Now go looking for eventual mouse overs"
	hand handleEvent: anEvent asMouseOver.
	"Get out early if there's no change"
	(leftMorphs isNil or: [leftMorphs size = 0 and:[enteredMorphs position = 0]]) 
		ifTrue:[^leftMorphs _ enteredMorphs _ overMorphs _ nil].
	focus _ hand mouseFocus.
	"Send #mouseLeave as appropriate"
	evt _ anEvent asMouseLeave.
	"Keep the order of the left morphs by recreating it from the mouseOverMorphs"
	leftMorphs size > 1 ifTrue:[leftMorphs _ mouseOverMorphs select:[:m| leftMorphs includes: m]].
	leftMorphs do:[:m|
		(m == focus or:[m hasOwner: focus]) 
			ifTrue:[localEvt _ evt transformedBy: (m transformedFrom: hand).
					m handleEvent: localEvt]
			ifFalse:[overMorphs nextPut: m]].
	"Send #mouseEnter as appropriate"
	evt _ anEvent asMouseEnter.
	enteredMorphs ifNil: ["inform: was called in handleEvent:"
		^leftMorphs _ enteredMorphs _ overMorphs _ nil].
	enteredMorphs _ enteredMorphs contents.
	enteredMorphs reverseDo:[:m|
		(m == focus or:[m hasOwner: focus]) 
			ifTrue:[	localEvt _ evt transformedBy: (m transformedFrom: hand).
					m handleEvent: localEvt]].
	"And remember the over list"
	overMorphs ifNil: ["inform: was called in handleEvent:"
		^leftMorphs _ enteredMorphs _ overMorphs _ nil].
	mouseOverMorphs _ overMorphs contents.
	leftMorphs _ enteredMorphs _ overMorphs _ nil.
! !



More information about the Squeak-dev mailing list