<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
    <title></title>
  </head>
  <body bgcolor="#ffffff" text="#000000">
    On 7/4/2022 12:56 PM, Jaromir Matas via Cuis-dev wrote:
    <blockquote
cite="mid:BYAPR03MB407279F771D20FF7C838F1F3EEBE9@BYAPR03MB4072.namprd03.prod.outlook.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Calibri Light";
        panose-1:2 15 3 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
p.MsoNoSpacing, li.MsoNoSpacing, div.MsoNoSpacing
        {mso-style-priority:1;
        margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";
        color:black;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
      <div class="WordSection1">
        <p class="MsoNormal">Hi Juan</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">> We could try resuming the old process.
          That would require detecting that a new UI process was created
          and terminate it. I don't like this, because it may be the new
          process the one that is doing relevant stuff now. Besides,
          this could lead to state corruption, depending (for example)
          on the state of method temp variables in both processes.</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">> I think it is reasonable to state that
          the UI process, as the other system created processes are a
          bit special: The system needs to guarantee that there is
          always an UI process ready to run. This might mean the system
          messing with these processes occasionally. People wanting to
          have absolute control over processes should fork their own.</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I've been thinking about it and yes,
          controlling two UIs is unreasonably complicated; a reasonable
          solution has to be simple and straightforward otherwise it's
          better leave as it is (I mean keep your great update #5347
          keeping the UI always available for new exceptions).</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">I've just tested one more approach in
          Squeak; the idea is: To keep the system responsive if the UI
          is blocked, start a new UI process in #newProcessIfUI: and let
          the old (blocked) one wait and eventually finish its *last
          cycle* and then automatically*terminate*; to make sure the old
          UI terminates automatically you could e.g. add a simple test
          to the #mainLoop</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">#mainLoop</p>
        <p class="MsoNormal">                </p>
        <p class="MsoNormal">                self clearWaitDelay.</p>
        <p class="MsoNormal">                canvas isNil ifTrue: [</p>
        <p class="MsoNormal">                                self
          setMainCanvas ].</p>
        <p class="MsoNormal">                self redrawNeeded.</p>
        <p class="MsoNormal">                [</p>
        <p class="MsoNormal">                                self
          doOneCycle.</p>
        <p class="MsoNormal">                               
          UISupervisor uiProcess isActiveProcess ]    "<----- a test
          in the spirit of whether the active process really is the
          current UI process"</p>
        <p class="MsoNormal">                                               
          whileTrue: []</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">In Squeak this approach seems to work but
          Cuis has a different (a bit more complicated) implementation
          and I haven't managed to implement the idea correctly.</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Does this sound like a reasonable approach
          or just another potential can of worms? :)</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Many thanks,</p>
        <p class="MsoNormal">Jaromir</p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNoSpacing"><span lang="CS">--</span></p>
        <p class="MsoNoSpacing"><strong><span style="font-family:
              "Calibri Light",sans-serif; color: rgb(51, 51,
              51); font-weight: normal;">Jaromír Matas</span></strong><span
            style="font-family: "Calibri Light",sans-serif;
            color: rgb(85, 85, 85);"><o:p></o:p></span></p>
        <p class="MsoNoSpacing"><span style="font-family: "Calibri
            Light",sans-serif; color: rgb(46, 117, 182);">+420 777
            492 777</span><span style="font-family: "Calibri
            Light",sans-serif; color: rgb(85, 85, 85);"><br>
          </span><span style="font-family: "Calibri
            Light",sans-serif; color: rgb(46, 117, 182);"><a class="moz-txt-link-abbreviated" href="mailto:mail@jaromir.net">mail@jaromir.net</a></span></p>
        <br>
      </div>
    </blockquote>
    <br>
    Hi Jaromir,<br>
    <br>
    Doing that properly would require detecting possible inconsistencies
    in the Morphic object structure, as now we'd be modifying Morphic
    state from two different processes. Giving reasonable guarantees of
    not completely breaking the various invariants would require a lot
    of complexity. Doing it without any such guarantees is not worth it
    in my opinion.<br>
    <br>
    I think (hope!) that anyone facing these kind of situations is an
    experienced Morphic developer, who should better understand what's
    going on, and code what they are doing with processes carefully
    enough. People not messing with the Morphic UI process should never
    face this kind of trouble. In many years of doing Morphic, I only
    faced trouble when doing deep redesign of the core classes, and what
    I did is to be sure that it is easy enough to start a new Morphic
    World in a new Morphic Process if needed.<br>
    <br>
    Thanks,<br>
    <br>
    <pre class="moz-signature" cols="72">-- 
Juan Vuletich
<a class="moz-txt-link-abbreviated" href="http://www.cuis-smalltalk.org">www.cuis-smalltalk.org</a>
<a class="moz-txt-link-freetext" href="https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev">https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev</a>
<a class="moz-txt-link-freetext" href="https://github.com/jvuletich">https://github.com/jvuletich</a>
<a class="moz-txt-link-freetext" href="https://www.linkedin.com/in/juan-vuletich-75611b3">https://www.linkedin.com/in/juan-vuletich-75611b3</a>
<a class="moz-txt-link-freetext" href="https://independent.academia.edu/JuanVuletich">https://independent.academia.edu/JuanVuletich</a>
<a class="moz-txt-link-freetext" href="https://www.researchgate.net/profile/Juan-Vuletich">https://www.researchgate.net/profile/Juan-Vuletich</a>
<a class="moz-txt-link-freetext" href="https://patents.justia.com/inventor/juan-manuel-vuletich">https://patents.justia.com/inventor/juan-manuel-vuletich</a>
<a class="moz-txt-link-freetext" href="https://twitter.com/JuanVuletich">https://twitter.com/JuanVuletich</a></pre>
  </body>
</html>