<body><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000;text-align: left" dir="ltr">
                                        It's not working as expected. Too many regressions in halo morphs. I will revert this for now.<div><br></div><div>Best,</div><div>Marcel</div><div class="mb_sig"></div><blockquote class='history_container' type='cite' style='border-left-style:solid;border-width:1px; margin-top:20px; margin-left:0px;padding-left:10px;'>
                        <p style='color: #AAAAAA; margin-top: 10px;'>Am 06.10.2021 10:16:12 schrieb commits@source.squeak.org <commits@source.squeak.org>:</p><div style='font-family:Arial,Helvetica,sans-serif'>Marcel Taeumel uploaded a new version of Morphic to project The Trunk:<br>http://source.squeak.org/trunk/Morphic-mt.1781.mcz<br><br>==================== Summary ====================<br><br>Name: Morphic-mt.1781<br>Author: mt<br>Time: 6 October 2021, 10:15:44.239651 am<br>UUID: 9fef6ccb-8df4-8047-8b0b-f8292ad3c397<br>Ancestors: Morphic-ul.1780<br><br>Fixes infinite-loop bug regarding #topRendererOrSelf by promoting TransformMorph to be an #isRenderer too, which makes sense because it clips and translates its contents already and usually has only a single submorph. The #transform could also scale and rotate. In the long term, the few extra features of TransformationMorph could be merged into TransformMorph. This would make it easier for clients to pick the right one. :-)<br><br>See http://lists.squeakfoundation.org/pipermail/squeak-dev/2021-October/216637.html<br><br>=============== Diff against Morphic-ul.1780 ===============<br><br>Item was changed:<br>  ----- Method: MorphicHaloDispatcher>>dispatchHalo:transferInwardsFrom: (in category 'dispatching') -----<br>  dispatchHalo: event transferInwardsFrom: currentTarget<br>  <br>   | localEvent world |<br>          "Note that a halo usually attaches to the outermost (or top) renderer in a composition around the rendered morph. Thus, we have to lookup that inner (or rendered) morph first when transferring the halo inwards in the hierarchy of submorphs."<br>   currentTarget renderedMorph submorphsDo: [:nextTarget |<br>               localEvent := event transformedBy: (nextTarget transformedFrom: currentTarget).<br>               (nextTarget fullContainsPoint: localEvent position) ifTrue: [<br>+                        ^ nextTarget renderedMorph wantsHaloFromClick<br>-                        ^ nextTarget wantsHaloFromClick<br>                               ifTrue: [self invokeHalo: localEvent on: nextTarget]<br>                                  ifFalse: [self dispatchHalo: localEvent transferInwardsFrom: nextTarget]]].<br>           <br>      "We're at the bottom most level; throw the event back up to the root to find recipient"<br>     event hand removeHalo.<br>        Preferences maintainHalos ifFalse: [<br>                  (world := currentTarget world) ifNil: [ ^ false ].<br>            localEvent := event transformedBy: (currentTarget transformedFrom: world) inverseTransformation.<br>              world processEvent: localEvent resetHandlerFields].<br>  <br>       ^ false!<br><br>Item was added:<br>+ ----- Method: TransformMorph>>innocuousName (in category 'naming') -----<br>+ innocuousName<br>+ <br>+   | r |<br>+        ^ (r := self renderedMorph) == self<br>+          ifTrue: [super innocuousName]<br>+                ifFalse: [r innocuousName]!<br><br>Item was added:<br>+ ----- Method: TransformMorph>>isRenderer (in category 'classification') -----<br>+ isRenderer<br>+ <br>+      ^ true<br>+ !<br><br>Item was added:<br>+ ----- Method: TransformMorph>>renderedMorph (in category 'classification') -----<br>+ renderedMorph<br>+    "We are a renderer. Answer appropriately."<br>+ <br>+     ^ self hasSubmorphs<br>+          ifTrue: [self firstSubmorph renderedMorph]<br>+           ifFalse: [self]!<br><br>Item was changed:<br>  ----- Method: TransformMorph>>wantsHaloFromClick (in category 'halos and balloon help') -----<br>  wantsHaloFromClick<br>+ <br>+       ^ self renderedMorph == self!<br>-        ^ false!<br><br>Item was removed:<br>- ----- Method: TransformationMorph>>innocuousName (in category 'naming') -----<br>- innocuousName<br>-        | r |<br>-        ^ (r := self renderedMorph) == self<br>-          ifTrue: [super innocuousName] ifFalse: [r innocuousName]!<br><br>Item was removed:<br>- ----- Method: TransformationMorph>>isRenderer (in category 'classification') -----<br>- isRenderer<br>- <br>-         ^ true<br>- !<br><br>Item was removed:<br>- ----- Method: TransformationMorph>>renderedMorph (in category 'classification') -----<br>- renderedMorph<br>- "We are a renderer. Answer appropriately."<br>- <br>- submorphs isEmpty ifTrue: [^self].<br>-   ^self firstSubmorph renderedMorph!<br><br>Item was removed:<br>- ----- Method: TransformationMorph>>wantsHaloFromClick (in category 'halos and balloon help') -----<br>- wantsHaloFromClick<br>- <br>-        ^ self renderedMorph == self!<br><br><br></div></blockquote>
                                        </div></body>