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

4 views
Skip to first unread message

Guillermo Polito

unread,
Jan 25, 2012, 3:59:27 PM1/25/12
to Pharo Development
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

Stéphane Ducasse

unread,
Jan 25, 2012, 4:28:48 PM1/25/12
to Pharo-...@lists.gforge.inria.fr
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

Reply all
Reply to author
Forward
0 new messages