[Pharo-project] [Event related] [Unix] Input event Sensor key decoding

Stéphane Ducasse stephane.ducasse at inria.fr
Wed Jan 25 22:28:48 CET 2012


I would like to hear what others think because 

BTW in the eventModel package we moved part of this code to the keyboard event.

Stef
On Jan 25, 2012, at 9:59 PM, Guillermo Polito wrote:

> 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




More information about the Pharo-project mailing list