mouseTrailFrom: currentBuf
"Current event, a mouse event buffer, is about to be processed. If there are other similar mouse events queued up, then drop them from the queue, and report the positions inbetween." | nextEvent trail | trail := (Array new: 1) writeStream. trail nextPut: currentBuf third @ currentBuf fourth. *a* [(nextEvent := Sensor peekEvent) isNil] whileFalse: [nextEvent first = currentBuf first ifFalse: [^trail contents "different event type"]. nextEvent fifth = currentBuf fifth ifFalse: [^trail contents "buttons changed"]. nextEvent sixth = currentBuf sixth ifFalse: [^trail contents "modifiers changed"]. "nextEvent is similar. Remove it from the queue, and check the next." *b* nextEvent := Sensor nextEvent. trail nextPut: nextEvent third @ nextEvent fourth]. ^trail contents Here, the bug: first it sends #peekEvent and its not nil. Okay, then after some logic voodo, it sends nextEvent, without precaution, that it may also answer nil! So, if some other process get between these two sends (*a*, *b*) and fetch/flush all events, a code will fail, because 'nextEvent third' is DNU , when nextEvent == nil. The fix is simple: nextEvent := Sensor nextEvent. nextEvent ifNotNil: [ trail nextPut: nextEvent third @ nextEvent fourth] Both Pharo & Squeak contain this bug. But this method slightly differs from each other. -- Best regards, Igor Stasenko AKA sig. _______________________________________________ Pharo-project mailing list [hidden email] http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project |
Igor, take a look back in the messages from January 25th 2010
Re: [Pharo-project] new mac menu code There may be something related there? On 2010-10-15, at 9:41 PM, Igor Stasenko wrote: > mouseTrailFrom: currentBuf > "Current event, a mouse event buffer, is about to be processed. If > there are other similar mouse events queued up, then drop them from > the queue, and report the positions inbetween." > > | nextEvent trail | > trail := (Array new: 1) writeStream. > trail nextPut: currentBuf third @ currentBuf fourth. > *a* [(nextEvent := Sensor peekEvent) isNil] whileFalse: > [nextEvent first = currentBuf first > ifFalse: [^trail contents "different event type"]. > nextEvent fifth = currentBuf fifth > ifFalse: [^trail contents "buttons changed"]. > nextEvent sixth = currentBuf sixth > ifFalse: [^trail contents "modifiers changed"]. > "nextEvent is similar. Remove it from the queue, and check the next." > *b* nextEvent := Sensor nextEvent. > trail nextPut: nextEvent third @ nextEvent fourth]. > ^trail contents > > > Here, the bug: > first it sends #peekEvent and its not nil. > Okay, then after some logic voodo, it sends nextEvent, without > precaution, that it may also answer nil! > > So, if some other process get between these two sends (*a*, *b*) and > fetch/flush all events, a code will fail, > because > 'nextEvent third' is DNU , when nextEvent == nil. > > The fix is simple: > > nextEvent := Sensor nextEvent. > nextEvent ifNotNil: [ trail nextPut: nextEvent third @ nextEvent fourth] > > Both Pharo & Squeak contain this bug. But this method slightly differs > from each other. > > -- > Best regards, > Igor Stasenko AKA sig. > > _______________________________________________ > Pharo-project mailing list > [hidden email] > http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project =========================================================================== John M. McIntosh <[hidden email]> Twitter: squeaker68882 Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com =========================================================================== _______________________________________________ Pharo-project mailing list [hidden email] http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project smime.p7s (5K) Download Attachment |
Free forum by Nabble | Edit this page |