[Vm-dev] Simulated mousEvents are now pure morphic...your thoughts on tackling keyboard events requested

gettimothy gettimothy at zoho.com
Thu Feb 13 23:34:45 UTC 2014


Hi All,

I got pure Morphic MouseEvents forwarded just fine (thanks to your help on the bit-fiddling)  and the translation is good  enough to pop up a menu from the top menu bar.
I had a screenshot, but it bounced the first iteration of this  message, so you will have to take my word on that. (:


Next up is KeyboardEvents and at first glance it looks a bit daunting. Here is why.

This method in HandMorph invokes one of ~18 subclasses of KeyboardInputInterpreter 


HandMorph>>generateKeyboardEvent: evtBuf
      ....
    type = #keystroke
        ifTrue: [keyValue := (self keyboardInterpreter nextCharFrom: Sensor firstEvt: evtBuf) asInteger]
      ...

 
That nextCharFrom: firstEvt: send is where it gets interesting as it is keyboard specific.

To see why, compare the implementation in


 MacRomanInputInterpreter >>nextCharFrom: sensor firstEvt: evtBuf

    | keyValue |
    keyValue := evtBuf third.
    ^ keyValue asCharacter macToSqueak.

 to


UnicodeInputInterpreter>>nextCharFrom: sensor firstEvt: evtBuf
    "Compose Unicode character sequences"
    | peekEvent keyValue composed |
    "Only try this if the first event is composable and is a character event"
    ((Unicode isComposable: (keyValue := evtBuf sixth)) 
        and:[evtBuf fourth = EventKeyChar]) ifTrue:[
            "If we have a pending keyDown in the queue, skip that to get to the keystroke"
            peekEvent := sensor peekEvent.
            (peekEvent notNil and: [peekEvent fourth = EventKeyDown]) ifTrue: [
                "skipEvent := "sensor nextEvent.
                peekEvent := sensor peekEvent].
            "If we have another character event in the queue, compose it"
            (peekEvent notNil 
                and: [peekEvent first = EventTypeKeyboard 
                and:[peekEvent fourth = EventKeyChar]]) ifTrue:[
                    composed := Unicode compose: keyValue with: peekEvent sixth.
                    composed ifNotNil:[
                        sensor nextEvent.
                        ^composed]]].
    "XXXX: Fixme. We should put the skipped event back if we haven't consumed it."
    ^keyValue asCharacter
 

So, assume I have to stuff some unknown character into a primitive event to feed to the simulator....I don't think "skooch and tack on" is going to work like it did for the mouseEvents.

I will be examining this more closely in a day or two as I have to focus on some  work for a client, but wanted to get it out there for your thoughts on the matter in the meantime.


Thanks.

tty.


P.S. David, when you get time, Eliot mentioned getting with you so I could contribute my work. Let me know what I need to do at your convenience.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20140213/70d8e4e3/attachment.htm


More information about the Vm-dev mailing list