<div dir="auto"><div dir="auto">tl;dr version: k<span style="font-family:sans-serif">eyboard and mouse event handling are inextricably linked unless/until VM changes are made.</span></div><div dir="auto"><span style="font-family:sans-serif"><br></span></div><div>Ken gives a good overview of the state of things from the Cuis perspective but also keep in mind that Cuis inherits baggage from Morphic, Squeak and the VM.  Squeak was developed in the 1990's primarily on Macs with a 1980's UI sensibility and most of the current input event handling issues stem from this.  Unless/until the VM allows for sending something closer to unpreprocessed mouse/keyboard events, several things cannot be fixed/simplified and the expressiveness of UIs in Morphic will be limited.  I<span style="font-family:sans-serif">f we had a full complement of truly separate and unprocessed input events by device type from the VM, it would be possible to have a much nicer, more performant, input event system.</span></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Tue, Jul 23, 2019, 5:16 PM ken.dickey--- via Cuis-dev <<a href="mailto:cuis-dev@lists.cuis.st">cuis-dev@lists.cuis.st</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 2019-07-20 23:28, Philip Bernhart via Cuis-dev wrote:<br>
> where should we put the information regarding of how to<br>
> get stuff done with morphic?<br>
<br>
Sorry if someone else has already answered this.<br>
<br>
I can only give you my take on things.<br>
<br>
First, this stuff is not well documented (an exercise for the user, <br>
sigh).<br>
<br>
We could really use a good write up on complex/interesting UI events.<br>
<br>
<br>
I found the following in the <a href="http://squeak.org" rel="noreferrer noreferrer" target="_blank">squeak.org</a> documentation:<br>
<br>
   <a href="http://wiki.squeak.org/squeak/2415" rel="noreferrer noreferrer" target="_blank">http://wiki.squeak.org/squeak/2415</a><br>
<br>
===================vvvv<br>
If you want your morph to get keyboard events, redefine the following <br>
methods<br>
<br>
MyMorph>>handlesKeyboard: evt<br>
    ^ true<br>
<br>
MyMorph>>mouseEnter: evt<br>
    evt hand keyboardFocus: self<br>
<br>
MyMorph>>mouseLeave: evt<br>
    evt hand releaseKeyboardFocus: self<br>
<br>
keyDown: anEvent<br>
"Handle a key down event. ."<br>
   anEvent keyCharacter = $a<br>
      ifTrue: [self doSomething].<br>
   anEvent keyCharacter = $q<br>
      ifTrue: [self doAnotherOne]<br>
===================^^^^<br>
<br>
So, yes.  One can use #mouseEnter: to get the keyboard focus.<br>
<br>
<br>
> I think it should not take a couple of hours of digging<br>
> in the class hierarchy to find out<br>
> "why does my morph not receive keystroke events<br>
> when I already declared that it handlesKeyboard events?!"<br>
<br>
I also find the event system confusing to use.<br>
<br>
Look at the code in 'Morphic-Games-Solitaire' <br>
[<a href="https://github.com/Cuis-Smalltalk/Games/tree/master/Solitaire" rel="noreferrer noreferrer" target="_blank">https://github.com/Cuis-Smalltalk/Games/tree/master/Solitaire</a>] for <br>
mouse event drag 'n drop code.  Note 'of interest' in <br>
'Learning-Cuis/PackageRef.md' <br>
[<a href="https://github.com/Cuis-Smalltalk/Learning-Cuis/blob/master/PackageRef.md" rel="noreferrer noreferrer" target="_blank">https://github.com/Cuis-Smalltalk/Learning-Cuis/blob/master/PackageRef.md</a>]<br>
<br>
Part of the problem is distinguishing click and double-click events <br>
where one has to wait for a timeout.<br>
<br>
Also, keyboard focus is a topic in its own when it comes to creating <br>
panels with tab linked fields.  One does not always want the keyboard <br>
focus just because the mouse is over.  Mouse and Keyboard are frequently <br>
independent.  Your choices are many, depending on your UI usage.<br>
<br>
I think the community would welcome some sample app/code/package, <br>
perhaps in 'Learning Cuis' <br>
[<a href="https://github.com/Cuis-Smalltalk/Learning-Cuis" rel="noreferrer noreferrer" target="_blank">https://github.com/Cuis-Smalltalk/Learning-Cuis</a>] showing some of the <br>
options.  Dragging and dropping a morph, tab-next fill-in text fields, <br>
change morph shape by drag, i.e. basic UI interaction choices.<br>
<br>
Or perhaps a MorphicFAQ.md file in 'Cuis-Smalltalk-Dev/Documentation' <br>
[<a href="https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev/tree/master/Documentation" rel="noreferrer noreferrer" target="_blank">https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev/tree/master/Documentation</a>] <br>
with questions you had and answers you found.<br>
<br>
Or, if the questions are few enough, sample code in the Terse Guide <br>
would be really cool.<br>
<br>
So you see the problem.  Even as we try to document things in the Cuis <br>
world, there are a number of choices and places to find things.  How to <br>
tie this together to make things easier to find??<br>
<br>
Good questions.  Please help with the answers.<br>
<br>
Thanks,<br>
-KenD<br>
-- <br>
Cuis-dev mailing list<br>
<a href="mailto:Cuis-dev@lists.cuis.st" target="_blank" rel="noreferrer">Cuis-dev@lists.cuis.st</a><br>
<a href="https://lists.cuis.st/mailman/listinfo/cuis-dev" rel="noreferrer noreferrer" target="_blank">https://lists.cuis.st/mailman/listinfo/cuis-dev</a><br>
</blockquote></div></div></div>