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