Hi guille

I was cleaning the event and we were slow to integrate the refactoring we did with igor. And now this is obsolete
because there is OSWindow coming.
We are about to integrate OSWindow code and soon or later we will have probably to change the processEvent: code.

Stef

On 18/8/14 17:33, Guillermo Polito wrote:
Hi!

Most of you already know that in Mac, if you do cmd+click on a class name or a selector, you get to browse the class or the implementors of the method.

Now, most of you know that it does not work on linux :). So I was digging today and I'll share a bit here what I found...

First, the navigation through cmd+click is managed by the TextAttribute subclasses, in particular TextLink, TextClassLink and TextMethodLink. And these are the important methods:

TextLink>>mayActOnEvent: anEvent
^ anEvent isMouseUp and: [ anEvent commandKeyPressed ]

TextClassLink>>actOnClick: anEvent for: target in: aParagraph editor: anEditor
anEvent shiftPressed
ifFalse: [ anEditor browseClassFrom: self className ]
ifTrue: [ anEditor referencesTo: self className ].
^ true

And another similar in TextMethodLink.

Now, the first thing I tried was to add a "or: [ anEvent controlKeyPressed ]" into the first method. Guess what? That did not work.

So I noticed a weird behavior.
- On mac: When you do cmd+click, the text morph, if it was not selected, gets selected on mouse down, and on mouse up it gets deselected and the class is browsed.

- On linux: when you do a ctrl+click, the text morph never gets selected on the first place. And that's why it never handles the mouseUp:. Just check:

Morph>>handleMouseUp: anEvent
"System level event handling."
anEvent wasHandled ifTrue: [^self]. "not interested"
*==> anEvent hand mouseFocus == self ifFalse: [^self]. "Not interested in other parties"*

So... the question is, why is the text morph not getting the focus?

Well, it turns out that morphic decodes a Ctrl+click as a blueButton. So in the method Morph>>handlerForMouseDown: the execution differs between mac and linux.

And weirder, the event that arrives there, is modified by some strange table that I hate. So the event has a SHIFT, which I didn't press! That shift gets introduced in the event in here:

InputEventSensor>>processEvent: evt
   ...
   ...
type = EventTypeMouse
ifTrue: [
"Transmogrify the button state according to the platform's button map definition"
*evt at: 5 put: (ButtonDecodeTable at: (evt at: 5) + 1).*
"Map the mouse buttons depending on modifiers"
*evt at: 5 put: (self mapButtons: (evt at: 5) modifiers: (evt at: 6)).*

So much FUN!

Well, so far I do not know how to solve it. But I know I do not like the "One table to decode strangely bits that should work for all platforms but it works just for one of them" approach :)

I'll try to follow this later, but if someone wants to help, I welcome it :)

Guille

Reply via email to