Hi!
I was looking why alt and ctrl keys behave the same in unix, jeje, so I
looked at the vm and everything seemed to be alright, but in the image I
always had *Cmd+a key* when doing *alt+akey* :S. And this is pretty
annoying since it limits the ammount of shortcuts I can work with, and I
also make things work different than the rest of the OS.
So, searching I found a *KeyDecodeTable *in InputEventSensor, which was
built with this method:
installDuplicateKeyEntryFor: c
| key |
key := c asInteger.
"first do control->alt key"
KeyDecodeTable at: { key bitAnd: 16r9F . 2 } put: { key . 8 }.
"then alt->alt key"
KeyDecodeTable at: { key . 8 } put: { key . 8 }
So, every character keypress that had a 2 as a modifier (a control) is
converted as a command in here:
processEvent: evt
"Process a single event. This method is run at high priority."
| type |
type := evt at: 1.
"Treat menu events first"
type = EventTypeMenu
ifTrue: [
self processMenuEvent: evt.
^nil].
"Tackle mouse events first"
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)).
"Update state for polling calls"
mousePosition := (evt at: 3) @ (evt at: 4).
modifiers := evt at: 6.
mouseButtons := evt at: 5.
^evt].
"Finally keyboard"
type = EventTypeKeyboard
ifTrue: [
* "Sswap ctrl/alt keys if neeeded"
KeyDecodeTable
at: {evt at: 3. evt at: 5}
ifPresent: [:a |
evt
at: 3 put: a first;
at: 5 put: a second].
*
"Update state for polling calls"
modifiers := evt at: 5.
^evt].
"Handle all events other than Keyborad or Mouse."
^evt.
Now, I think this hack is there to allow the same behavior cross platform,
but it is very ugly :( And bring a lot of UI limitations to the people who
only have alt and ctrl and no Cmd button :P... Ok, removing this ugly code
made my shortcuts work now with only with alt (cmd to the vm) and not with
control, hehe, but I think that to fix things we have to clean them first
:).
Does anyone know the reason of the existance of this table (besides cross
platform hacking)? Is this really useful? Can it be removed? Do I open a
ticket?
Guille